Comandos de log executados em SSH no lado do cliente

Comandos de log executados em SSH no lado do cliente

Estou procurando uma maneira de executar o SSH (OpenSSH em particular, mas não necessariamente) e registrar todos os comandos que executo no controle remoto, em um arquivo localmente.

Executar cada comando como um comando ssh independente realmente registraria cada comando em meu histórico local, mas geralmente é indesejável executar, por exemplo

ssh [email protected] -- foo -a --bar baz

para cada comando.

Prefiro fazer ssh no servidor de maneira normal, seja por meio do próprio ssh ou por meio de um comando wrapper, como 'ssh-logging'.

Estou imaginando o programa salvando comandos inseridos por meio de ssh em um arquivo na máquina cliente local, de forma comparável à forma como os shells fazem isso, por exemplo, ~/.ssh_history parece um bom padrão, talvez permutado por combinação de usuário + host, mas não realmente me importo onde ele salva neste momento.

Resumindo, gostaria que acontecesse algo como o seguinte:

~ $ ssh [email protected]
[user@host ~]$ foo --bar
[user@host ~]$ exit
~ $ cat .ssh_history_user@host
foo --bar
exit
~ $

Isso existe, seja como uma configuração obscura de cliente OpenSSH, ou como parte de outro cliente SSH de código aberto/libre, ou como um programa thin wrapper que pode simplesmente se colocar no caminho das entradas stdin do usuário e enviar de forma transparente transferi-los para o stdin do programa em execução enquanto os registra? (Ouvi dizer que o SecureCRT tem um recurso de registro que talvez seja mais ou menos assim, mas pelo menos na minha vida pessoal não desejo usar ferramentas que não sejam FLOSS).

Responder1

Se você estiver no Unix, o utilitário padrãoscriptfoi projetado para esse fim. Se você executar scriptsem argumentos, ele iniciará uma cópia do seu shell e registrará a sessão em um arquivo chamado "typescript":

~ jdoe$ script
Script started, output file is typescript
bash-3.2$ date
Fri May  8 16:29:44 EDT 2015
bash-3.2$ exit
exit

Script done, output file is typescript
~ jdoe$ cat typescript
Script started on Fri May  8 16:29:42 2015
bash-3.2$ date
Fri May  8 16:29:44 EDT 2015
bash-3.2$ exit
exit

Script done on Fri May  8 16:29:45 2015
~ jdoe$ 

Você pode especificar o arquivo para registrar e o comando a ser executado em vez do shell. Esta parte não está completamente padronizada. No meu sistema OSX, você executaria assim:

script name-of-log-file command arg...
eg
script ssh-log ssh user@somehost

Com a versão Linux comum, você executaria assim:

script -c 'command arg...' name-of-log-file
eg
script -c 'ssh user@somehost' ssh-log

Responder2

Graças aEugen Rieckcomentário sobre canalizar ssh através de tee, consegui implementar umlogging wrapper em torno do sshque faz o que eu estava procurando.

informação relacionada