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

问题描述 投票:0回答:5

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

中所述

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

但是在 GNU 屏幕会话中,这些环境变量由启动屏幕的人定义。有没有什么办法也可以获取 SSH 连接信息,对于后来进入一个已经存在的屏幕会话的人,比如来自另一台主机?

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

linux networking ssh ip-address gnu-screen
5个回答
1
投票

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

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

    <enter>
    键。

  2. 您必须访问环境变量

    SSH_CONNECTION
    (或更好的
    SSH_CLIENT
    ),这只有在您是根用户或在屏幕会话中使用相同的用户时才有可能。

假设您是 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 身份执行

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

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-

0
投票

您可以检查

last
命令的输出,该命令将列出所有
IP addresses
hostnames
如果
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
通常会记录所有连接的所有详细信息,即使它们没有导致成功登录。


0
投票

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

另一方面,如果您可以采用单用户模式,那么您可以为 screen 命令创建一个包装器/别名,将环境变量携带到 screen 中(参见“screen -X stuff ...”);在这种情况下,您只是传递具有适当值的 SSH_CLIENT。

如果您可以假设给定的用户名来自一个位置(或者,如果有多个位置,则只需选择最近的),那么您可以对“最后”命令的输出执行一些 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"

0
投票

查看SSHLog:https://github.com/sshlog/agent/

它是一个监控 SSH 登录和用户活动的守护进程。您可以获得已登录用户的列表,他们从哪个 IP 连接,记录他们的命令,您甚至可以跳转到他们的会话并与他们共享终端。


-1
投票

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

shell -$SHELL

然后您的屏幕将包含所有变量。 对于您遇到的当前正在运行的屏幕,只需运行即可。

source ~/.bash_profile

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

© www.soinside.com 2019 - 2024. All rights reserved.