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ãoscript
foi projetado para esse fim. Se você executar script
sem 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.