有一个服务器,许多用户使用 ssh 访问它。我想找出哪个用户执行了某个命令。
我可以使用了解当前访问服务器的用户列表,who
还可以了解使用执行的命令列表history
。
但是如何知道哪个用户执行了命令,就像cp file1.sh file2.sh
在服务器中一样?用户已经执行了命令并注销了
答案1
每个新用户连接都会产生一个sshd
具有特定 PID 的新会话。您可以使用pstree
打印哪些命令是从哪个sshd
会话继承的,然后在 中交叉检查此 PID /var/log/auth.log
。
示例(匿名):我使用同一个远程用户同时登录了 3 个会话的远程服务器。我现在想找出运行该命令的客户端来自哪个 IP watch date
。
$ pstree -p | grep watch
| |-sshd(15243)---sshd(15342)---bash(15343)---watch(15450)
$ sudo grep 15243 /var/log/auth.log
Mar 7 15:37:29 XXXXXXXXXX sshd[15243]: Accepted publickey for XXXXXXXXXX from 12.34.56.78 port 48218 ssh2
Mar 7 15:37:29 XXXXXXXXXX sshd[15243]: pam_unix(sshd:session): session opened for user XXXXXXXXXX by (uid=0)
Mar 7 15:37:44 XXXXXXXXXX sudo: XXXXXXXXXX : TTY=pts/7 ; PWD=/home/XXXXXXXXXX ; USER=root ; COMMAND=/bin/grep 15243 /var/log/auth.log
pstree -p
显示该watch
命令继承自sshd
PID 为 15243 的进程。grep
在 中搜索此 PID 时,/var/auth/auth.log
显示启动此会话的 IP 为 12.34.56.78。因此,这也是启动 的用户watch
。
至于history
专门查找此用户,据我所知,当所有远程用户都使用同一个本地 SSH 用户时,这是无法做到的。此外,它很容易被欺骗/停用/等等,所以它并不可靠。如果它保存在历史文件中,那么您只需查找命令cp
并在文件中向后查看,但如果它不在那里,那么就没什么可做的了。
答案2
您可以将这两行添加到 /etc/profile 或 /etc/bashrc 以记录 bash 执行的所有命令:
whoami="$(whoami)@$(echo $SSH_CONNECTION | awk '{print $1}')"
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local3.debug "$whoami [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
这将使用 syslog 记录每个执行的命令以及执行命令的用户及其 IP 地址,格式如下:
Jan 8 08:43:49 xpto local3.debug root: [email protected] [29385]: ls -al [0]
此外,您还可以将以下行添加到您的 syslog 配置(/etc/syslog.conf)中,以将 local3 消息重定向到特定文件。
local3.* /var/log/prompt.log
答案3
你可以使用史努比为了这。
您必须通过在日志消息格式的定义中指定 IP=%{env:SSH_CLIENT}(./configure 标志或自 2.x 版本起在 snoopy.ini 中配置)来将其配置为记录自定义环境变量(SSH_CLIENT)。
披露:史努比维护者在此。
答案4
假设你正在使用 bash,history
只会显示你你的命令行历史记录。默认情况下,它会读取~/.bash_history
历史记录。请注意,这可以通过执行类似 的操作来更改(尽管可能性很小)HISTFILE=/home/userFoo/.my_alt_history
。
假设您是该机器的根用户,您可以扫描所有用户的目录并阅读他们的历史记录来查看谁在运行该命令。