Contents

列出所有连接的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)

在输出的第一列中,我们可以看到当前登录用户的列表。第二列显示用户的连接方式。在此示例中,user2user3使用 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 连接。

在大多数情况下,  wwho命令是获得 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 会话。