列出所有连接的SSH会话
1. 概述
SSH 是一种网络协议,可让我们连接到远程计算机。有时在管理 Linux 服务器时,我们需要查看谁通过 SSH 连接。在本教程中,我们将了解如何列出活动的 SSH 会话。我们将研究几种可能的方法并找出它们的优缺点。
2. who命令
要查看登录用户列表,让我们从使用*who *命令开始:
$ who
user1 tty1 2020-08-29 14:59
user2 pts/0 2020-08-29 14:57 (203.0.113.24)
user3 pts/1 2020-08-29 15:02 (203.0.113.13)
在输出的第一列中,我们可以看到当前登录用户的列表。第二列显示用户的连接方式。在此示例中,user2和user3使用 SSH 连接,而user1直接连接到服务器。
**SSH 会话将在伪终端从站 ( pts )**上。但请记住,并非所有pts连接都必须是 SSH 连接。例如, screen命令 也会创建一个伪终端从机。
此外,who命令不会显示 SFTP 连接,因为它们不是 shell 登录会话。
3. w命令
与who命令类似 ,我们可以使用w 命令。除了显示谁登录之外,它还显示用户正在做什么:
$ w
16:21:34 up 1:29, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user1 tty1 - 14:59 16.00s 0.05s 0.01s -bash
user2 pts/0 203.0.113.24 14:57 5.00s 0.04s 0.02s vim
user3 pts/1 203.0.113.13 15:02 1.00s 0.02s 0.00s w
请记住w命令与who命令具有相同的缺点 。**首先,并非所有登录用户都必须通过 SSH 连接。**为了确定这一点,我们必须检查 TTY 列。
以前,我们确定 SSH 会话将在伪终端从站 ( pts ) 上。在这里,我们还需要记住,并非所有pts会话都是 SSH 连接。
在大多数情况下, w和who命令是获得 SSH 会话简要概述的最快方法。通常,登录用户通过 SSH 连接。
4. last命令
除了who和 w命令,last 命令是查找登录用户的另一种方法。它显示上次登录用户的列表。由于我们只对当前登录的用户感兴趣,让我们使用grep 过滤last 的输出:
$ last | grep 'still logged in'
root pts/1 203.0.113.13 Sat Aug 29 15:02 still logged in
root tty1 Sat Aug 29 14:59 still logged in
root pts/0 203.0.113.24 Sat Aug 29 14:57 still logged in
last命令没有明确显示 SSH 连接。相反,它显示登录用户。我们必须通过查看输出的第二列来确定用户是如何连接的。SSH 会话将在伪终端从站 ( pts ) 上。但是我们也要考虑到,不是所有的pts连接都一定是SSH连接。
5. netstat命令
到目前为止,我们已经研究了几种显示登录用户的方法。**通过查看网络连接也可以找到 SSH 会话。**为此,让我们使用netstat :
$ netstat -atnp | grep 'ESTABLISHED.*sshd'
tcp 0 0 198.51.100.14:22 203.0.113.13:49570 ESTABLISHED 1674/sshd: user1@pts
tcp 0 36 198.51.100.14:22 203.0.113.24:57586 ESTABLISHED 1894/sshd: user2@pts
netstat将显示比我们需要的更多的信息。因此,为了完善已建立的 SSH 连接,让我们使用grep 过滤结果。从输出中,我们可以看到user1和 user2通过 SSH 连接。
在使用列出登录用户的命令还不够的情况下,netstat将为我们提供更准确的活动 SSH 会话图。
6. ss命令
查找 SSH 连接的另一个有用的实用程序是ss 命令。这是一个用于调查套接字的工具。
让我们通过grep ssh的输出来找到活动的 SSH 连接:
$ ss | grep ssh
tcp ESTAB 0 0 198.51.100.14:ssh 203.0.113.13:49570
tcp ESTAB 0 36 198.51.100.14:ssh 203.0.113.24:57586
使用ss时要考虑的一点是,我们看不到连接背后的用户名,就像我们使用netstat时所做的那样。
7. ps命令
使用ps命令 查看正在运行的进程也可以找到活动的 SSH 会话。
让我们使用 ps并将 其输出用于 sshd :
$ ps axfj | grep sshd
1 776 776 776 ? -1 Ss 0 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
776 15457 15457 15457 ? -1 Ss 0 0:00 \_ sshd: user1@pts/0
15558 15681 15680 15558 pts/0 15680 S+ 0 0:00 | \_ grep --color=auto sshd
776 15596 15596 15596 ? -1 Ss 0 0:00 \_ sshd: user2@pts/1
第一行是监听新 SSH 连接的主服务器。在此之下,我们可以看到每个子进程都提供一个 SSH 连接。通过查看它们,我们可以看到user1和 user2通过 SSH 连接。
当列出登录用户不足时,ps可以为我们提供更准确的活动 SSH 会话概览。
8. SSH 守护程序日志
**日志文件是 SSH 相关信息的另一个来源。日志文件的位置取决于我们使用的 Linux 发行版。例如,在 Ubuntu 中,SSH 相关的日志在/var/log/auth.log 中。
让我们检查一下日志,看看当user1通过 SSH 连接时会发生什么:
Aug 30 08:43:36 my-ssh-server sshd[16469]: pam_unix(sshd:session): session opened for user user1 by (uid=1)
为user1创建了一个新会话。如果user1注销,会话将关闭:
Aug 30 08:49:02 my-ssh-server sshd[16469]: pam_unix(sshd:session): session closed for user user1
日志是历史信息的绝佳来源。但是它们不方便快速找出当前活动的 SSH 会话。