我之前问过一个问题,但没有得到满意的答案: 如何显示从另一台机器执行的 ssh 命令?
所以这次我要问清楚。
如何显示通过 SSH 在我的服务器中执行的命令及其用户/IP。我正在寻找这样的东西:
#tail .bash_history 192.168.1.101 : vi /etc/ssh/sshd_config 192.168.1.102 : ls -l 192.168.1.101 : cd .ssh 192.168.1.101 : systemctl reload sshd.service 192.168.1.102 : service --status-all
ETC...
答案1
发现这个问题很有趣,所以我用谷歌搜索了一下,发现这。
更准确地说,您需要将此行添加到 sshd_config 中。
ForceCommand logger -p user.notice "$SSH_ORIGINAL_COMMAND"
根据man sshd_config
:
ForceCommand
强制执行由 ForceCommand 指定的命令,忽略客户端和 ~/.ssh/rc(如果存在)提供的任何命令。该命令是通过使用用户的登录 shell 和 -c 选项来调用的。这适用于 shell、命令或子系统执行。它在 Match 块内最有用。客户端最初提供的命令可在 SSH_ORIGINAL_COMMAND 环境变量中找到。指定internal-sftp命令将强制使用进程内SFTP服务器,与ChrootDirectory一起使用时不需要支持文件。默认为无。
在我的 Debian rsyslog 安装中 user.* 被写入/var/log/user.log
请注意,上面的命令将logger
在原始命令的位置执行该命令。如果你想记录命令和然后执行它,你必须按照以下方式做一些事情(假设bash
可用/bin/bash
):
ForceCommand /bin/bash -rc 'logger -p user.notice "$SSH_ORIGINAL_COMMAND"; $SSH_ORIGINAL_COMMAND'
或者使用比受限 shell 更具限制性的包装脚本,或者 - 对于交互式登录 - sshrc
( /etc/ssh/sshrc
) 文件可能是实现日志记录的另一个选项。
答案2
尝试这个 (https://askubuntu.com/questions/93566/how-to-log-all-bash-commands-by-all-users-on-a-server)。编辑/etc/bash.bashrc
文件并添加行
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
位于文件底部并保存。