在屏幕会话中访问 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 addresses
或 hostnames
到服务器。
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 身份启动,你可以,但它不会完全可靠
如果两个用户在同一个屏幕中输入 window,他们将在同一个 shell 中进行交互。可以写一个命令。对方可以按<enter>
键。
您必须访问环境变量 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
替换路径和文件名以匹配您的环境。
可以通过环境变量(例如SSH_CONNECTION)访问连接的 SSH 客户端的 IP 地址,如
中所述Find the IP address of the client in an SSH session
但是在 GNU 屏幕会话中,这些环境变量是由启动屏幕的人定义的。有什么方法可以同时获取 SSH 连接信息,以供稍后进入已经存在的屏幕会话的人使用,例如来自另一台主机?
我想不出确定这一点的方法,但这在屏幕会话在不同人之间共享的情况下可能很有用,例如。
您可以检查 last
命令的输出,如果 sshd
是唯一的连接方式,该命令将列出所有建立的所有 IP addresses
或 hostnames
到服务器。
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 身份启动,你可以,但它不会完全可靠
如果两个用户在同一个屏幕中输入 window,他们将在同一个 shell 中进行交互。可以写一个命令。对方可以按
<enter>
键。您必须访问环境变量
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
替换路径和文件名以匹配您的环境。