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

Access SSH client IP address, within a screen session

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

中所述

Find the IP address of the client in an SSH session

但是在 GNU 屏幕会话中,这些环境变量是由启动屏幕的人定义的。有什么方法可以同时获取 SSH 连接信息,以供稍后进入已经存在的屏幕会话的人使用,例如来自另一台主机?

我想不出确定这一点的方法,但这在屏幕会话在不同人之间共享的情况下可能很有用,例如。

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

如果您尝试支持多显示器模式 ('screen -x'),那么正如上面有人所说,您可能不走运。

另一方面,如果您可以采用单用户模式,那么您可以为 screen 命令创建一个 wrapper/alias,将环境变量带入屏幕(参见 'screen -X stuff ...');在这种情况下,您只是传递具有适当值的 SSH_CLIENT。

如果您可以假设给定的用户名来自一个位置(或者,如果有多个位置,则只需选择最近的),那么您可以在 [=19= 的输出上做一些 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"

如果 screen 会话以 root 身份启动,你可以,但它不会完全可靠

  1. 如果两个用户在同一个屏幕中输入 window,他们将在同一个 shell 中进行交互。可以写一个命令。对方可以按<enter>键。

  2. 您必须访问环境变量 SSH_CONNECTION(或更好的 SSH_CLIENT),这只有在您是 root 或您在内部使用相同用户时才有可能屏幕会话。

假设您是 screen 会话中的 root 用户,您可以使用 ps 命令并找到最后一个活动会话来了解在 screen 会话中最后一个活动的用户。

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 用户身份执行的

您还可以选择记录所有活动连接。 对于这种需要,我建议您存储完整的连接列表和它们的最后一个 activity.

ps eh -C screen kstime -o pid,atime | while read pid stime; do echo -n "$stime: ";\
    gawk -v 'RS=[=12=]' -F= '=="SSH_CLIENT" {print }' /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]*\)).*//;q').*
     -printf "%h\n"
      | cut -f2 -d-

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

shell -$SHELL

然后你的屏幕就会有所有的变量。 对于目前 运行ning 您遇到的屏幕,只需 运行.

source ~/.bash_profile

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