linux 在屏幕会话中访问SSH客户端IP地址

vof42yt1  于 2023-04-20  发布在  Linux
关注(0)|答案(5)|浏览(159)

可以通过环境变量(如SSH_CONNECTION)访问正在连接的SSH客户端的IP地址,如中所述
Find the IP address of the client in an SSH session
但是在GNU screen session中,这些环境变量是由启动screen的人定义的。有没有什么方法可以同时获得SSH连接信息,以供以后进入已经存在的screen session的人使用,比如从另一个主机?
我想不出一种方法来确定这一点,但这可能是有用的情况下,屏幕会话之间共享不同的人,例如。

oewdyzsn

oewdyzsn1#

如果屏幕会话以root身份启动,则可以,但不完全可靠

1.如果两个用户在同一个屏幕窗口中输入,他们将在同一个shell中进行交互。一个用户可以编写命令,另一个用户可以按<enter>键。
1.您必须访问环境变量SSH_CONNECTION(或更好的SSH_CLIENT),只有当您是root用户,或者您在屏幕会话中使用相同的用户时才可以访问。
假设您是屏幕会话中的root用户,您可以通过使用ps命令并查找最后一个活动会话来了解屏幕会话中最后一个活动的用户。

ps h -C screen katime -o pid,user

通过使用pid并访问/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

所有这些都假设您的屏幕是以root用户身份执行的
您也可以选择记录所有活动连接。对于这种需要,我建议您存储完整的连接列表和它们的最后活动。

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-
qyswt5oh

qyswt5oh2#

您可以检查last命令的输出,如果sshd是连接到服务器的唯一方式,则该命令将列出所有连接的所有IP addresseshostnames

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通常会记录所有连接的所有详细信息,即使它们没有导致成功登录。

axkjgtzd

axkjgtzd3#

如果你想支持多显示模式('screen-x'),那么就像上面有人说的那样,你可能不走运。
另一方面,如果你可以假设单用户模式,那么你可以为screen命令创建一个 Package 器/别名,它沿着一个环境变量带入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"
iih3973s

iih3973s4#

查看SSHLog:https://github.com/sshlog/agent/
这是一个监控SSH登录和用户活动的守护进程,你可以得到登录用户的列表,他们从哪个IP连接,记录他们的命令,你甚至可以跳转到他们的会话并与他们共享终端。

ccrfmcuu

ccrfmcuu5#

如果您的屏幕通常以分离模式启动,则在.screenrc中添加以下内容:

shell -$SHELL

然后你的屏幕将有所有的变量。对于当前运行的屏幕,你被卡住了,只需运行。

source ~/.bash_profile

替换路径和文件名以匹配您的环境。

相关问题