通过环境变量(例如SSH_CONNECTION)可以访问连接的SSH客户端的IP地址,如
然而,在GNU screen会话中,这些环境变量是由启动screen的人定义的。有没有办法获取SSH连接信息,例如从另一个主机进入已存在的screen会话的人?
我想不到一种方法来确定这一点,但在屏幕会话在不同人之间共享的情况下,这可能是有用的。
通过环境变量(例如SSH_CONNECTION)可以访问连接的SSH客户端的IP地址,如
然而,在GNU screen会话中,这些环境变量是由启动screen的人定义的。有没有办法获取SSH连接信息,例如从另一个主机进入已存在的screen会话的人?
我想不到一种方法来确定这一点,但在屏幕会话在不同人之间共享的情况下,这可能是有用的。
ps h -C screen katime -o pid,user
/proc/<pid>/environ
文件,您可以获取SSH_CLIENT
变量。sed -z '/SSH_CLIENT/p;d' /proc/`ps h -C screen katime -o pid |head -1`/environ
--> SSH_CLIENT=257.31.120.12
ps eh -C screen kstime -o pid,atime | while read pid stime; do echo -n "$stime: ";\
gawk -v 'RS=\0' -F= '$1=="SSH_CLIENT" {print $2}' /proc/$pid/environ; done
Result:
00:00:00: 257.31.120.12 61608 22
00:07:11: 258.1.2.3.4 49947 22
ps eh -C screen kstime -o args
命令的结果。
编辑:
以下是一个可用的Debian命令,用于获取当前连接到同一屏幕会话的所有用户: find /var/run/screen/
-name $(pstree -sp $$ |sed 's/.*screen(\([0-9]*\)).*/\1/;q').*
-printf "%h\n"
| cut -f2 -d-
看看SSHLog:https://github.com/sshlog/agent/
这是一个守护进程,监视SSH登录以及用户活动。您可以获取已登录用户列表,他们连接的IP地址,记录他们的命令,甚至可以跳转到他们的会话并与他们共享终端。
last
命令的输出来列出所有连接的IP地址
或主机名
,如果sshd
是连接服务器的唯一方式。ec2-user]# last
ec2-user pts/0 115.250.185.183 Sun May 29 13:49 still logged in
ec2-user pts/0 115.250.140.241 Sat May 28 07:26 - 10:15 (02:48)
root pts/4 113.21.68.105 Tue May 3 10:15 - 10:15 (00:00)
另外(在Linux上),您可以检查/var/log/secure
,其中sshd
通常会记录所有连接的详细信息,即使它们没有成功登录。
/var/run/screen
目录实现。 - Adam如果您正在尝试支持多显示器模式('screen -x'),那么正如上面有人所说,您可能没有办法。
另一方面,如果您可以假定为单用户模式,则可以为screen命令创建一个包装器/别名,该别名将环境变量传递到screen中(参见'screen -X stuff ...');在这种情况下,您只是传递了SSH_CLIENT,它将具有适当的值。
如果您可以假定给定的用户名来自单个位置(或者,如果来自多个位置,则选择最近的位置),则可以对“last”命令的输出进行一些grep/sed操作。
client_ip=`last -ai | grep "still logged in" | grep "$USER " | grep -v '0.0.0.0' | tail -n 1 | sed 's/.* //g'`
echo "Hello $client_ip"
shell -$SHELL
然后你的屏幕将拥有所有变量。 对于当前运行的屏幕,你可以简单地运行。
source ~/.bash_profile
请将路径和文件名更改为适合您的环境。
/proc
)。 - n. m.l
,另一个人打了s
,还有另一个人按了回车键,那么是谁调用了ls
?这与screen
完全相同。 - n. m.