Список всех подключенных сессий SSH?

184

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

Из оболочки, как я могу увидеть список этих двух сессий?

зеркало
источник

Ответы:

188

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 в системный журнал. Ваши журналы могут быть в этих местах или в другом месте. Вот пример того, что вы можете увидеть:

[myhost ~]% cat /var/log/sshd.log | grep hendrenj | 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. В большинстве случаев это даст вам необходимую информацию.

jayhendren
источник
2
Связанный: Понимание вывода who -aкоманды
Серж Штробандт
Нашел это при поиске касательно связанной проблемы. Не имеет значения Это один из лучших ответов, которые я видел на любом сайте Stack! Теперь я знаю больше об этой конкретной области (из-за отсутствия лучшего слова). РЕДАКТИРОВАТЬ: Спасибо!
jscharf
107

Вы можете увидеть каждый сеанс 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:
sebelk
источник
4
Спасибо; этот ответ намного лучше, чем верхний ответ, в котором перечислены только пользователи, вошедшие в оболочку. Это решение также находит пользователей SFTP.
Хайден Шифф
1
на большинстве коробок в настоящее время вы можете использоватьpgrep -ai sshd
ccpizza
@ccpizza: pgrep: invalid option -- 'i'в Ubuntu 14.04.
Мартин Шредер,
2
@ MartinSchröder: -iдоступно только для Mac / BSD. на Ubuntu вы можете использовать pgrep -af ssd. См. Serverfault.com/a/883270/116777 для подробностей
ccpizza
Подобно @HaydenSchiff, мне также пришлось найти пользователей, у которых открыт только туннель SSH для переадресации портов без оболочки. Это помогло!
Тобиас К.
14

Вы также можете использовать

ps ax | grep sshd
Джоэл Инглао
источник
7

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

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

источник
Расширить предыдущие ответы, касающиеся глобалов Bash. Могу ли я предложить ссылки на SECONDSглобальные. Вы можете использовать это через echo $SECONDS, который затем отображает количество времени, так как воспринимается соединение
NerdOfCode
Это отобразит информацию для текущего активного сеанса - тот, в который вы печатаете. Но возникает вопрос, как составить список всех подключенных в данный момент сеансов.
G-Man
6

Расширяя ответ @ себелька:

Использование решения 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
A.Meijer
источник
2

Вы можете использовать

last | head

Я использовал это в своем скрипте .login в течение многих лет, чтобы увидеть, кто недавно вошел в систему. Это было устройство с плохой защитой, чтобы увидеть, был ли кто-то в системе, используя ваш логин.

Джо Уильямс
источник
1
... но это не обязательно будет список активных сессий (о чем этот вопрос). В зависимости от активности входа в систему, даже сеанс, в котором вы работали, lastможет не отображаться.
Муру
1
«last -p now» выводит список всех текущих сессий ssh.
Джо Уильямс
@JOWilliams Какая версия lastподдерживает -p? Что оно делает?
mwfearnley
@mwfearnley версия "last from util-linux 2.31.1"имеет это точно.
V.7