Перечислить все подключенные сеансы SSH?

Перечислить все подключенные сеансы SSH?

Я просто подключился по SSH к root, а затем снова подключился по SSH к root на той же машине. Таким образом, у меня открыто два окна, оба подключились по SSH к root на моей удаленной машине.

Как мне из оболочки увидеть список этих двух сессий?

решение1

whoили w; who -aдля получения дополнительной информации.

Эти команды просто показывают все сеансы входа на терминальном устройстве. Сеанс SSH будет на псевдотерминале slave ( pts), как показано в TTYстолбце, но не все соединения pts являются сеансами SSH. Например, программы, которые создают псевдотерминальное устройство, такое как xtermили , screenбудут отображаться как pts. СмотритеРазница между pts и ttyдля лучшего описания различных значений, найденных в TTYстолбце. Кроме того, этот подход не покажет никого, кто вошел в сеанс SFTP, поскольку сеансы SFTP не являются сеансами входа в оболочку.

Я не знаю способа явно показать все сеансы SSH. Вы можете вывести эту информацию, прочитав информацию о входе из utmp/ wtmpс помощью инструмента вроде last, w, или whoкак я только что описал, или используя сетевые инструменты вроде @sebelk, описанные в их ответе, чтобы найти открытые соединения TCP на порту 22 (или там, где ваш демон 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. В большинстве случаев это даст вам нужную информацию.

решение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

Добавлено для простоты ссылки.

Если вы находитесь в псевдо-оболочке (например: /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)

Связанный контент