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

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

#1 楼

whow;有关其他信息,请参见who -a

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

我不知道有什么方法可以显式显示所有SSH会话。您可以通过utmpwtmplast之类的工具从w / who中读取登录信息来推断此信息,或者使用答案中所述的@sebelk之类的联网工具在端口22上找到打开的tcp连接(或者您的SSH守护程序正在侦听的地方)。

您可以采取的第三种方法是解析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


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

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

评论


相关:了解who -a命令的输出

– Serge Stroobandt
16 Dec 18'在22:33



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

–jscharf
17年8月21日在2:25



#2 楼

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


O也许这可能有用:

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


评论


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

–海顿·希夫(Hayden Schiff)
17年5月1日在18:51

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

–ccpizza
17-10-26在21:03

@ccpizza:pgrep:无效选项-在Ubuntu 14.04上为'i'。

–马丁·施罗德(MartinSchröder)
18年3月14日在9:03

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

–ccpizza
18年3月14日在10:48

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

– Tobias K.
18-09-17在11:15

#3 楼

您也可以使用

ps ax | grep sshd


#4 楼

扩展@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


#5 楼

添加以供参考。

如果您使用的是伪外壳程序
(示例:/ dev / pts / 0),最简单的方法之一是:

[user1@host ~]$ echo $SSH_CONNECTION


它应该返回:您的ip和端口以及所连接的IP和端口

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。您可以通过echo $ SECONDS使用它,然后它会显示时间量,因为已感知到连接

–NerdOfCode
18年4月4日在15:19

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

– G-Man说“恢复莫妮卡”
18/12/20在4:38

#6 楼

您可以使用

last | head


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

评论


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

–muru
18/12/20在2:16

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

– J.O.威廉姆斯
19年1月10日在5:44

@ J.O.Williams last的哪个版本支持-p?它有什么作用?

–mwfearnley
19年2月5日在13:38

@mwfearnley版本的“ last from util-linux 2.31.1”具有确定性。

– F8ER
19年8月7日在8:34



#7 楼

我执行了几乎所有上述命令,我认为通过ssh查找当前已登录用户的最佳方法是

last | grep "still logged in"


AND

who -a