Executar script (sistema) no login e / ou logout SSH


12

Gostaria que meu servidor OpenSSH iniciasse um script sempre que um usuário efetuar login usando SSH, passando o nome do host ou IP idealmente, bem como o nome do usuário. Além disso, eu gostaria que ele executasse um script, sempre que uma sessão terminasse (passando o nome de usuário). Esses scripts não devem ser executados na sessão do usuário, mas em todo o sistema.

A idéia é emitir um aviso de áudio no login e logout, por exemplo espeak, usando e exibir as informações em um monitor externo.

Vi que existe um pam-scriptspacote, mas não tenho certeza se isso faz o que quero, nem como usá-lo.

Respostas:


10

Você pode forçar um comando para seus usuários SSH em vez daquele que eles solicitam (ou seu shell, se não derem um comando específico). Isso pode ser feito especificando esse comando com algo como ForceCommand /root/ssh-wrapperin /etc/ssh/sshd_config(não importa onde o script está localizado ou como ele é nomeado, apenas verifique se ele é executável por todos os usuários e o arquivo de configuração sshd aponta para ele). Você também precisa reiniciar / recarregar sshd. O comando original está acessível ao comando forçado como $SSH_ORIGINAL_COMMAND.

Acabei de hackear esse script:

#! /bin/sh

# add logger options when needed
log="logger -t ssh-wrapper"

# find IP address
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

$log $USER login from $ip
espeak "$USER just logged in from $ip" > /dev/null 2>&1

$log command: ${SSH_ORIGINAL_COMMAND:-shell}
${SSH_ORIGINAL_COMMAND:-shell}

$log $USER logout
espeak "$USER just logged out" > /dev/null 2>&1

Agora, toda vez que eu faço login ou logoff, uma voz me fala sobre isso e uma entrada de log é gravada no syslog. Ele também registra o comando. Você pode usar algo como o seguinte para "seguir" o uso do sshd:

tailf /var/log/syslog | grep ssh-wrapper

Observe que esse script geralmente não foi testado; portanto, use por seu próprio risco! ;-)

PS: lembre-se de que este script é executado como o usuário que efetuou login, portanto, você não pode fazer tudo o que quiser se o alterar para adicionar mais recursos ...


Oi, Existe alguma maneira de detectar a situação quando o usuário acabou de fechar a janela com o cliente ssh. Seu script não liga essa situação. Obrigado.
Dmitry Eskin

Em shell$ {SSH_ORIGINAL_COMMENT: -shell} deve ser substituído pelo caminho real para o shell, por exemplo. / bin / bash? Quando apenas tento executar isso, ele reclama que não existe um comando como o shell. Na verdade, acho que talvez o que você quis dizer com $ SHELL? Isso deve executar o shell especificado do usuário.
Ibrahim

1

Eu já vi esses eventos correspondentes no arquivo de log antes (o que permitiria flexibilidade na correspondência de qualquer coisa). Esta página está mal formatada, mas pode ajudá-lo a começar: https://help.ubuntu.com/community/AudibleLogs#Play with esound


Eu acho que você / eles querem dizer em espeakvez de esound?
janc

0

(Resposta cruzada da mesma pergunta no ServerFault )

Apenas escreva um script para fazer o que quiser e depois cole-o /etc/profileou possivelmente /etc/bash.bashrcdependendo de suas necessidades. As alterações nesses arquivos serão aplicadas a todos os usuários. Não sei ao certo como você notificaria o logout com essa abordagem.

Como alternativa, outra maneira de fazer isso seria ter um daemon simples monitorando /var/log/authnovas sessões (e fechando) ssh. Dessa forma, seria capaz de enviar notificações no logon e logout.


0

Você pode usar o sshrc (man sshd, procure por sshrc)

O ssh executará o / etc / ssh / sshrc, se existir, e você poderá executar um script (ou chamar vários scripts) a partir daí

você pode chamar qualquer variável bash, curtir $USERou obter o IP via

read -d " " ip <<< $SSH_CONNECTION

você pode escrever um script para testar ou registrar o que quiser.

Script de logout ... bem, é isso que estou procurando! : D


0

Eu acho que o PAM é a melhor opção. É em todo o sistema e não pode ser substituído pelos arquivos de configuração do usuário.

Você pode seguir estas etapas. Eles trabalharam para mim no Ubuntu 14.04.4 LTS.

Corre:

$ sudo pico /opt/custom/bin/info-session.sh

Edite esse arquivo vazio e adicione estas linhas:

#!/bin/sh

[ "$PAM_TYPE" = "open_session" ] || exit 0

INFO=$(date +"%Y/%m/%d %T $PAM_USER ($PAM_RHOST) $PAM_SERVICE $PAM_TTY") # You can customize message.

echo "PAM access: $INFO" | write user > /dev/null 2>&1 # See Note 1.

exit 0

Depois disso, dê permissão de execução ao script:

$ sudo chmod ugo+x /opt/custom/bin/info-session.sh

Agora, execute:

$ sudo pico /etc/pam.d/common-session

Adicione estas linhas no final do arquivo:

# Modified by user:
session optional pam_exec.so /opt/custom/bin/info-session.sh

Não há necessidade de reiniciar nenhum serviço. Observe que esse script também será executado quando um usuário efetuar login no terminal em vez do SSH.

Nota 1: Você pode canalizar para espeakou qualquer outro processo que atenda às suas necessidades (email, notificação por push etc.). Se você usar writee o usuário estiver logado, ele ou ela verá as mensagens de saída diretamente em seu terminal.

Referências:
https://blog.stalkr.net/2010/11/login-notifications-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on -login de usuário/

Relacionado:
Como configuro um alerta de email quando um login ssh é bem-sucedido?
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
/server//questions / 395393 / email-notification-about-each-ssh-connection-to-linux-server

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.