Список усіх підключених сеансів SSH?


183

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

Як я можу побачити список цих двох сеансів із оболонки?

Відповіді:


188

whoабо w; who -aдля отримання додаткової інформації.

Ці команди просто показують усі сеанси входу на термінальному пристрої. Сеанс SSH буде на псевдотермінальному веденому ( 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 ~]% 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. Здебільшого це допоможе отримати потрібну інформацію.



Виявив це під час пошуку дотичної проблеми. Не має значення. Це одна з найкращих відповідей, яку я бачив на будь-якому сайті Stack! Зараз я знаю тонну більше про цю конкретну область (за відсутністю кращого слова). EDIT: Дякую!
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:

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. Детальніше дивіться на сервері default.com/a/883270/116777
ccpizza

Подібно до @HaydenSchiff, я повинен був також знайти користувачів, у яких відкритий лише тунель SSH для переадресації портів, без оболонки. Це допомогло!
Тобіас К.


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)

Щоб розширити попередні відповіді, що стосуються глобальних башів. Можливо, я пропоную посилатися на SECONDSглобальне. Ви можете використовувати це через echo $SECONDS, через який він відображає кількість часу, оскільки сприймається з'єднання
NerdOfCode

Тут відображатиметься інформація про активний сеанс - той, який ви вводите. Але питання питає , як перерахувати всі поточні підключення сеанси.
G-Man

6

Розгортання відповіді на @ sebelk:

Використання рішення netstatє хорошим, але вимагає привілеїв root. Крім того, net-toolsпакет (який надається netstat) був устарений у деяких нових дистрибутивах Linux ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ ).

Альтернативним рішенням є те , щоб використовувати заміну netstat, ss. Наприклад (зверніть увагу, що вам більше не потрібен корінь):

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

2

Можна використовувати

last | head

Я використовував це у своєму .login-скрипті роками, щоб побачити, хто нещодавно увійшов у систему. Це було безпечним пристроєм захисту, щоб перевірити, чи хтось у системі використовує ваш логін.


1
... але це не обов'язково буде списком активних сесій (про що йдеться у цьому питанні). Залежно від активності входу, навіть сеанс, в який ви пройшли, lastможе бути не вказаний.
муру

1
"last -p now" перелічує всі поточні сеанси ssh.
JO Williams

@JOWilliams Яка версія lastпідтримує -p? Що це робить?
mwfearnley

У версії @mwfearnley "last from util-linux 2.31.1"це точно.
V.7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.