列出所有已连接的SSH会话?


183

我只是SSH进入root,然后再次SSH进入同一台计算机上的root。因此,我有两个窗口都以SSH方式打开到远程计算机的root用户。

从外壳中,如何查看这两个会话的列表?

Answers:


188

whow; who -a有关其他信息。

这些命令仅显示终端设备上的所有登录会话。pts如该TTY列所示,SSH会话将位于伪终端从站()上,但并非所有pts连接都是SSH会话。例如,创建伪终端设备(例如xterm或)的程序screen将显示为pts。有关对列中找到的不同值的更好描述,请参见pts和tty之间的差异TTY。此外,这种方法不会显示任何登录到SFTP会话的人,因为SFTP会话不是Shell登录会话。

我不知道有什么办法明确显示所有SSH会话。你可以通过阅读登录信息推断此信息utmp/ wtmp通过工具一样lastwwho像我刚才所描述的,或通过使用网络工具一样,其答案描述@sebelk无论你的SSH找到端口22(或打开的TCP连接守护程序正在监听)。

您可以采用的第三种方法是解析SSH守护程序的日志输出。根据您的操作系统发行版,SSH发行版,配置等,日志输出可能位于许多不同的位置。在RHEL 6盒子上,我发现了日志/var/log/sshd.log。在RHEL 7盒子和Arch Linux盒子上,我需要使用journalctl -u sshd来查看日志。某些系统可能将SSH日志输出到syslog。您的日志可能在这些地方或其他地方。这是您可能看到的示例:

[myhost ~]% cat /var/log/sshd.log | grep hendrenj | 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

日志显示会话打开和关闭的时间,会话所属的用户,用户从何处进行连接等等。但是,如果您想将其从简单的,人类可读的事件日志中获取到当前活动会话的列表,则将需要进行大量的解析,并且当您将其保存为当前列表时,它可能仍然不是一个准确的列表。您已经完成解析,因为日志实际上并未包含足够的信息来确定哪些会话仍处于活动状态-本质上您只是在猜测。使用这些日志的唯一好处是信息直接来自SSHD,而不是像其他方法一样通过二手来源获得。

我建议只使用w。大多数时候,这将为您提供所需的信息。



在寻找与切向相关的问题时发现了这一点。没关系 这是我在任何Stack网站上看到的最好的答案之一!我现在对该特定领域了解更多(由于缺少更好的词)。编辑:谢谢!
jscharf '17

107

您可以使用以下命令查看每个会话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

也许这可能是有用的:

[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:

4
谢谢; 这个答案比仅列出登录到shell的用户的最高答案要好得多。该解决方案还可以找到SFTP用户。
海登·希夫

1
在当今的大多数盒子上,您都可以使用pgrep -ai sshd
ccpizza

@ccpizza:pgrep: invalid option -- 'i'在Ubuntu 14.04上
MartinSchröder18年

2
@MartinSchröder:-i仅适用于mac / bsd口味。在ubuntu上您可以使用pgrep -af ssd。有关详细信息,请参阅serverfault.com/a/883270/116777
ccpizza

与@HaydenSchiff相似,我还必须找到仅打开SSH隧道进行端口转发而没有外壳的用户。这有帮助!
Tobias K.


7

添加以供参考。

如果您使用的是伪shell(例如:/ dev / pts / 0),则最简单的方法之一是:

[user1@host ~]$ echo $SSH_CONNECTION

它应该返回:您的ip和port以及您连接到的IP和port

192.168.0.13 50473 192.168.0.22 22

您还可以通过使用ttywhow)获取一些信息:(编辑:我看到它现在在另一篇文章的上方)

[user1@host ~]$ who
user1 tty1          2018-01-03 18:43
user2 pts/0        2018-01-03 18:44 (192.168.0.13)

扩展先前处理Bash全局变量的答案。我可能建议引用SECONDS全局。您可以使用via echo $SECONDS,它可以显示时间量,因为自觉的连接
NerdOfCode

这将显示当前活动会话的信息,即您正在输入的会话。但是问题问如何列出所有当前连接的会话。
G-Man

6

扩展@sebelk的答案:

使用的解决方案netstat很好,但是需要root特权。此外,该net-tools软件包(提供netstat)在某些较新的Linux发行版(https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/)中已弃用。

另一种解决方案是则使用替换netstatss。例如(请注意,您不再需要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

2

您可以使用

last | head

我在.login脚本中使用了多年,以查看谁最近登录了系统。这是一个安全性较差的设备,可以使用您的登录信息查看是否有人在系统上。


1
...但不一定是活动会话的列表(此问题是关于什么的)。根据登录活动的不同,甚至您运行的会话也last可能不会列出。
muru

1
“ last -p now”列出所有当前的ssh会话。
JO Williams

@JOWilliams哪个版本的last支持-p?它有什么作用?
mwfearnley

@mwfearnley版本"last from util-linux 2.31.1"肯定具有它。
V.7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.