我只是通过 SSH 连接到 root,然后在同一台机器上再次通过 SSH 连接到 root。所以我有两个窗口在我的远程机器上打开两个 SSH 进入 root。
从 shell 中,如何查看这两个会话的列表?
jay*_*ren 237
who或w; who -a了解更多信息。
这些命令只显示终端设备上的所有登录会话。SSH 会话将pts在TTY列中所示的伪终端从站 ( ) 上进行,但并非所有 pts 连接都是 SSH 会话。例如,创建伪终端设备的程序,例如xterm或screen将显示为pts. 请参阅pts 和 tty 之间的差异以更好地描述TTY列中发现的不同值。此外,这种方法不会显示登录到 SFTP 会话的任何人,因为 SFTP 会话不是 shell 登录会话。
我不知道有什么方法可以明确显示所有 SSH 会话。您可以通过像,或像我刚刚描述的工具从utmp/读取登录信息来推断此信息,或者通过使用他们的回答中描述的像 @sebelk 这样的网络工具来查找端口 22 上的开放 tcp 连接(或任何您的 SSH守护进程正在/正在监听)。wtmplastwwho
您可以采用的第三种方法是解析来自 SSH 守护程序的日志输出。根据您的操作系统发行版、SSH 发行版、配置等,您的日志输出可能位于许多不同的地方。在 RHEL 6 盒子上,我找到了/var/log/sshd.log. 在 RHEL 7 机器和 Arch Linux 机器上,我需要使用journalctl -u sshd来查看日志。某些系统可能会将 SSH 日志输出到 syslog。您的日志可能在这些地方或其他地方。以下是您可能会看到的示例:
[myhost ~]% grep hendrenj /var/log/sshd.log | grep session
May 1 15:57:11 myhost sshd[34427]: pam_unix(sshd:session): session opened for user hendrenj by (uid=0)
May 1 16:16:13 myhost sshd[34427]: pam_unix(sshd:session): session closed for user hendrenj
May 5 14:27:09 myhost sshd[43553]: pam_unix(sshd:session): session opened for user hendrenj by (uid=0)
May 5 18:23:41 myhost sshd[43553]: pam_unix(sshd:session): session closed for user hendrenj
Run Code Online (Sandbox Code Playgroud)
日志显示会话何时打开和关闭、会话属于谁、用户从哪里连接等等。但是,如果您想从一个简单的、人类可读的事件日志中获取到当前活动会话的列表,您将不得不进行大量解析,并且在以下情况下它可能仍然不是一个准确的列表您已完成解析,因为日志实际上并未包含足够的信息来确定哪些会话仍处于活动状态——您实际上只是在猜测。使用这些日志获得的唯一优势是信息直接来自 SSHD,而不是像其他方法一样通过二手来源。
我建议只使用w. 大多数情况下,这将为您提供所需的信息。
seb*_*elk 147
您可以使用以下命令查看每个会话 ssh:
[root@router ~]# netstat -tnpa | grep 'ESTABLISHED.*sshd'
tcp 0 0 192.168.1.136:22 192.168.1.147:45852 ESTABLISHED 1341/sshd
tcp 0 0 192.168.1.136:22 192.168.1.147:45858 ESTABLISHED 1360/sshd
Run Code Online (Sandbox Code Playgroud)
哦,也许这可能有用:
[root@router ~]# ps auxwww | grep sshd:
root 1341 0.0 0.4 97940 3952 ? Ss 20:31 0:00 sshd: root@pts/0
root 1360 0.0 0.5 97940 4056 ? Ss 20:32 0:00 sshd: root@pts/1
root 1397 0.0 0.1 105300 888 pts/0 S+ 20:37 0:00 grep sshd:
Run Code Online (Sandbox Code Playgroud)
小智 14
扩展@sebelk 的回答:
使用的解决方案netstat很好,但需要root权限。此外,在一些较新的 Linux 发行版 ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ ) 中不推荐使用该net-tools软件包(提供)。netstat
另一种解决方案是则使用替换netstat,ss。例如(请注意,您不再需要 root):
user@router:~# ss | grep ssh
tcp ESTAB 0 0 192.168.1.136:ssh 192.168.1.147:37620
tcp ESTAB 0 0 192.168.1.136:ssh 192.168.1.147:37628
Run Code Online (Sandbox Code Playgroud)
小智 8
添加以供简单参考。
如果您使用的是伪 shell(例如: /dev/pts/0 ),最简单的方法之一是:
[user1@host ~]$ echo $SSH_CONNECTION
Run Code Online (Sandbox Code Playgroud)
它应该返回:您的 ip 和端口以及您连接到的 ip 和端口
192.168.0.13 50473 192.168.0.22 22
Run Code Online (Sandbox Code Playgroud)
您还可以通过使用ttyor who( w)获取一些信息:(编辑:我看到它现在在另一篇文章中列出)
[user1@host ~]$ who
user1 tty1 2018-01-03 18:43
user2 pts/0 2018-01-03 18:44 (192.168.0.13)
Run Code Online (Sandbox Code Playgroud)
我执行了几乎所有上述命令,我认为通过 ssh 查找当前登录用户的最佳方法是
last | grep "still logged in"
Run Code Online (Sandbox Code Playgroud)
和
who -a
Run Code Online (Sandbox Code Playgroud)
您可以使用
last | head
Run Code Online (Sandbox Code Playgroud)
多年来,我在我的 .login 脚本中使用它来查看谁最近登录到系统。这是一个穷人安全设备,可以查看是否有人使用您的登录名在系统上。