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

Access SSH client IP address, within a screen session

可以通过环境变量(例如SSH_CONNECTION)访问连接SSH客户端的IP地址,如中所述

在SSH会话中查找客户端的IP地址

但是,在GNU屏幕会话中,这些环境变量是由开始屏幕的人定义的。 是否有任何方法可以获取SSH连接信息,对于稍后输入已存在的屏幕会话的人,例如来自其他主机的人?

我无法想出一种确定这种方法的方法,但这对于例如在不同的人之间共享屏幕会话的情况非常有用。


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

  • 如果两个用户键入同一个屏幕窗口,它们将在同一个shell中进行交互。人们可以写一个命令。另一个可以按键。

  • 您必须能够访问环境变量SSH_CONNECTION(或更好的SSH_CLIENT),这只有在您是root用户的情况下才可以访问,或者您在屏幕会话中使用相同的用户。

  • 假设您是屏幕会话中的root用户,则可以使用ps命令并查找上一个活动会话来了解屏幕会话中最后一个活动用户。

    1
    ps h -C screen katime -o pid,user

    通过使用pid并访问/proc//environ文件,您可以获得SSH_CLIENT变量。

    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

    请注意,如果您觉得更容易,也可以解析ps eh -C screen kstime -o args命令的结果。

    编辑:

    这是一个有效的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"


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

    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上),您可以检查/var/log/secure,其中sshd通常会记录所有连接的所有详细信息,即使它们不会导致登录成功。