列出所有连接的 SSH 会话?

the*_*ror 230 ssh terminal

我只是通过 SSH 连接到 root,然后在同一台机器上再次通过 SSH 连接到 root。所以我有两个窗口在我的远程机器上打开两个 SSH 进入 root。

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

jay*_*ren 237

whow; who -a了解更多信息。

这些命令只显示终端设备上的所有登录会话。SSH 会话将ptsTTY列中所示的伪终端从站 ( ) 上进行,但并非所有 pts 连接都是 SSH 会话。例如,创建伪终端设备的程序,例如xtermscreen将显示为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. 大多数情况下,这将为您提供所需的信息。

  • 相关:【理解`who -a`命令的输出】(http://unix.stackexchange.com/a/52722/39845) (3认同)

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)

  • 谢谢; 这个答案比顶级答案好得多,后者只列出登录到 shell 的用户。此解决方案还可查找 SFTP 用户。 (5认同)
  • 现在在大多数盒子上你可以使用`pgrep -ai sshd` (2认同)
  • @MartinSchröder:`-i` 仅适用于 mac/bsd 版本。在 ubuntu 上,您可以使用 `pgrep -af ssd`。详见 https://serverfault.com/a/883270/116777 (2认同)

小智 18

你也可以使用

ps ax | 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

另一种解决方案是则使用替换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
Run Code Online (Sandbox Code Playgroud)

  • netstat -tanp 的好处是它可以获取进程名称,这使得 grep 变得很容易,而不是在端口号上 grep ,这也会显示任何传出连接等。 (2认同)

小智 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)


drm*_*maa 6

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

last | grep "still logged in"
Run Code Online (Sandbox Code Playgroud)

who -a
Run Code Online (Sandbox Code Playgroud)


J.O*_*ams 5

您可以使用

last | head
Run Code Online (Sandbox Code Playgroud)

多年来,我在我的 .login 脚本中使用它来查看谁最近登录到系统。这是一个穷人安全设备,可以查看是否有人使用您的登录名在系统上。

  • ...但它不一定是活动会话列表(这个问题是关于什么的)。根据登录活动,甚至可能不会列出您运行“上次”的会话。 (3认同)
  • “last -p now”列出所有当前的 ssh 会话。 (3认同)