在客户端通过 SSH 运行的日志命令

在客户端通过 SSH 运行的日志命令

我正在寻找一种方法来运行 SSH(特别是 OpenSSH,但不一定)并将我针对远程运行的所有命令记录到本地文件中。

将每个命令作为独立的 ssh 命令运行确实会将每个命令记录到我的本地历史记录中,但通常不希望运行例如

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

对于每个命令。

我宁愿以正常方式 ssh 进入服务器,要么通过 ssh 本身,要么通过包装命令,比如“ssh-logging”。

我设想程序将通过 ssh 输入的命令保存到本地客户端计算机上的文件中,类似于 shell 的操作方式,例如 ~/.ssh_history 似乎是一个很好的默认设置,可能根据用户+主机组合进行排列,但我现在并不真正关心它保存在哪里。

简而言之,我希望发生以下事情:

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

是否存在这样的东西,要么作为一个模糊的 OpenSSH 客户端配置,要么作为另一个开源/自由 ssh 客户端的一部分,或者作为一个薄包装程序,可以简单地将自己置于用户的标准输入方式中,并在记录它们的同时透明地将它们发送到正在运行的程序的标准输入?(我听说 SecureCRT 有一个大致像这样的日志记录功能,但至少在我的个人生活中,我不想使用非 FLOSS 工具)。

答案1

如果你使用的是 unix,则标准实用程序script就是为此目的而设计的。如果你script不带参数运行,它会启动 shell 的副本并将会话记录到名为“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$ 

您可以指定要记录到的文件和要运行的命令,而不是 shell。这部分并非完全标准化。在我的 OSX 系统上,您可以像这样运行它:

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

使用常见的 Linux 版本,您可以像这样运行它:

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

答案2

谢谢尤金里克关于通过 tee 管道传输 ssh 的评论,我能够实现一个ssh 周围的日志包装器这正是我所寻找的。

相关内容