我只是通过 SSH 连接到 root,然后再次通过 SSH 连接到同一台计算机上的 root。所以我有两个窗口打开,两个窗口都通过 SSH 连接到我的远程计算机上的根目录。
从 shell 中,我怎样才能看到这两个会话的列表?
答案1
who
或者w
;who -a
获取更多信息。
这些命令仅显示终端设备上的所有登录会话。 SSH 会话将在伪终端从站 ( pts
) 上进行,如列中所示TTY
,但并非所有 pts 连接都是 SSH 会话。例如,创建伪终端设备(例如xterm
或 )的程序screen
将显示为pts
。看pts 和 tty 之间的区别更好地描述TTY
列中找到的不同值。此外,此方法不会显示登录到 SFTP 会话的任何人,因为 SFTP 会话不是 shell 登录会话。
我不知道有什么方法可以显式显示所有 SSH 会话。您可以通过、或像我刚刚描述的那样的工具utmp
读取登录信息来推断此信息,或者使用其答案中描述的 @sebelk 等网络工具来查找端口 22 上打开的 tcp 连接(或您的 SSH 所在的任何地方)守护进程正在监听)。wtmp
last
w
who
您可以采取的第三种方法是解析 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
.大多数时候,这将为您提供所需的信息。
答案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
或者这可能有用:
[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:
答案3
扩展@sebelk的答案:
使用的解决方案netstat
是一个很好的解决方案,但需要 root 权限。此外,该net-tools
软件包(提供netstat
)在一些较新的 Linux 发行版中已被弃用(https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/)。
另一种解决方案是使用 , 的替代品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
答案4
添加以供简单参考。
如果您处于伪 shell 中(例如: /dev/pts/0 ),最简单的方法之一是:
[user1@host ~]$ echo $SSH_CONNECTION
它应该返回:你的 ip 和端口以及你连接的 ip 和端口
192.168.0.13 50473 192.168.0.22 22
您还可以通过使用tty
或who
( w
) 获取一些信息:(编辑:我看到它现在在另一篇文章的上面列出)
[user1@host ~]$ who
user1 tty1 2018-01-03 18:43
user2 pts/0 2018-01-03 18:44 (192.168.0.13)