Access SSH client IP address, within a screen session
可以通过环境变量(例如SSH_CONNECTION)访问连接SSH客户端的IP地址,如中所述
在SSH会话中查找客户端的IP地址
但是,在GNU屏幕会话中,这些环境变量是由开始屏幕的人定义的。 是否有任何方法可以获取SSH连接信息,对于稍后输入已存在的屏幕会话的人,例如来自其他主机的人?
我无法想出一种确定这种方法的方法,但这对于例如在不同的人之间共享屏幕会话的情况非常有用。
如果屏幕会话以root用户身份启动,则可以,但它不会完全可靠
如果两个用户键入同一个屏幕窗口,它们将在同一个shell中进行交互。人们可以写一个命令。另一个可以按
您必须能够访问环境变量
假设您是屏幕会话中的root用户,则可以使用
1 | ps h -C screen katime -o pid,user |
通过使用pid并访问
1 2 3 | sed -z '/SSH_CLIENT/p;d' /proc/`ps h -C screen katime -o pid |head -1`/environ --> SSH_CLIENT=257.31.120.12 |
所有这些都假设您的屏幕以root身份执行
您还可以选择记录所有活动连接。
对于这种需要,我建议你存储完整的连接列表和它们的最后一个活动。
1 2 3 4 5 6 | 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 |
请注意,如果您觉得更容易,也可以解析
编辑:
这是一个有效的Debian命令,用于使当前连接到同一屏幕会话的所有用户:
1 2 3 4 5 | find /var/run/screen/ -name $(pstree -sp $$ |sed 's/.*screen(\([0-9]*\)).*/\1/;q').* -printf"%h " | cut -f2 -d- |
如果您的屏幕通常以分离模式启动,则在.screenrc中添加以下内容:
1 | shell -$SHELL |
然后你的屏幕将拥有所有变量。
对于您遇到的当前正在运行的屏幕,只需运行即可。
1 | source ~/.bash_profile |
替换路径和文件名以匹配您的环境。
如果您正在尝试支持多显示模式('screen -x'),那么就像上面有人说的那样,您可能会失败。
另一方面,如果你可以假设单用户模式,那么你可以为屏幕命令创建一个包装器/别名,它将环境变量带入屏幕(参见'screen -X stuff ...');在这种情况下,您只是传递具有适当值的SSH_CLIENT。
如果您可以假设给定的用户名来自单个位置(或者,如果有多个位置,则只需选择最近的位置),那么您可以在'last'命令的输出上执行一些grep / sed。
1 2 | 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" |
如果
1 2 3 4 | 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上),您可以检查