Wyświetla listę wszystkich połączonych sesji SSH?

183

Właśnie SSH'owałem do roota, a potem SSH'owałem do roota na tym samym komputerze. Więc mam dwa okna otwarte zarówno SSH'd do roota na moim zdalnym komputerze.

W powłoce, w jaki sposób mogę zobaczyć listę tych dwóch sesji?

lustro
źródło

Odpowiedzi:

188

wholub w; who -apo dodatkowe informacje.

Te polecenia pokazują tylko wszystkie sesje logowania na urządzeniu końcowym. Sesja SSH będzie na pseudo-terminalu slave ( pts), jak pokazano w TTYkolumnie, ale nie wszystkie połączenia pts są sesjami SSH. Na przykład programy tworzące pseudoterminalowe urządzenia, takie jak xtermlub screenbędą wyświetlane jako pts. Zobacz Różnicę między pts i tty, aby uzyskać lepszy opis różnych wartości znalezionych w TTYkolumnie. Co więcej, to podejście nie pokaże nikomu, kto zaloguje się do sesji SFTP, ponieważ sesje SFTP nie są sesjami logowania powłoki.

Nie znam żadnego sposobu jawnego pokazania wszystkich sesji SSH. Możesz wnioskować o tych informacjach, czytając dane logowania z utmp/ wtmpza pomocą narzędzia, takiego jak last, wlub whotakiego, jak właśnie opisałem, lub używając narzędzi sieciowych, takich jak @sebelk opisanych w ich odpowiedzi, aby znaleźć otwarte połączenia TCP na porcie 22 (lub w dowolnym miejscu Twojego SSH demony są / nasłuchują).

Trzecie podejście, które możesz zastosować, to parsowanie danych wyjściowych dziennika z demona SSH. W zależności od dystrybucji systemu operacyjnego, dystrybucji SSH, konfiguracji itd. Dane wyjściowe dziennika mogą znajdować się w wielu różnych miejscach. Na pudełku RHEL 6 znalazłem logi /var/log/sshd.log. Na pudełku RHEL 7, a także na pudełku Arch Linux, musiałem użyć, journalctl -u sshdaby wyświetlić dzienniki. Niektóre systemy mogą wysyłać dzienniki SSH do syslog. Twoje dzienniki mogą znajdować się w tych miejscach lub w innym miejscu. Oto próbka tego, co możesz zobaczyć:

[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

Dzienniki pokazują, kiedy sesje otwierają się i zamykają, do kogo należy sesja, skąd użytkownik się łączy i nie tylko. Będziesz jednak musiał przeprowadzić wiele analiz, jeśli chcesz uzyskać to z prostego dziennika zdarzeń czytelnego dla człowieka na liście aktualnie aktywnych sesji, a prawdopodobnie nadal nie będzie to dokładna lista, gdy skończyłeś parsować, ponieważ dzienniki nie zawierają wystarczającej ilości informacji, aby określić, które sesje są nadal aktywne - w zasadzie tylko zgadujesz. Jedyną korzyścią, jaką zyskujesz dzięki tym dziennikom, jest to, że informacje pochodzą bezpośrednio z dysku SSHD zamiast z drugiej ręki, podobnie jak inne metody.

Polecam po prostu użyć w. W większości przypadków dostaniesz potrzebne informacje.

jayhendren
źródło
2
Powiązane: Zrozumienie wyniku who -apolecenia
Serge Stroobandt,
Znalazłem to, szukając problemu związanego ze styczną. Nie ma znaczenia To jedna z najlepszych odpowiedzi, jakie widziałem na dowolnej stronie stosu! Teraz wiem o wiele więcej na temat tego konkretnego obszaru (z powodu braku lepszego słowa). EDYCJA: Dziękuję!
jscharf
107

Możesz zobaczyć każdą sesję ssh za pomocą następującego polecenia:

[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

O może to może być przydatne:

[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
źródło
4
Dziękuję Ci; ta odpowiedź jest znacznie lepsza niż górna odpowiedź, która zawiera tylko użytkowników zalogowanych do powłoki. To rozwiązanie znajduje również użytkowników SFTP.
Hayden Schiff
1
w większości urządzeń, z których obecnie możesz korzystaćpgrep -ai sshd
ccpizza
@ccpizza: pgrep: invalid option -- 'i'w systemie Ubuntu 14.04.
Martin Schröder
2
@ MartinSchröder: -ijest dostępny tylko dla smaków Mac / BSD. na Ubuntu możesz użyć pgrep -af ssd. Szczegółowe informacje można znaleźć na serverfault.com/a/883270/116777
ccpizza
Podobnie jak @HaydenSchiff musiałem również znaleźć użytkowników, którzy mają tylko tunel SSH otwarty do przekierowania portów, bez powłoki. To pomogło!
Tobias K.,
14

Możesz także użyć

ps ax | grep sshd
Joel Inglao
źródło
7

Dodano dla uproszczenia.

Jeśli jesteś w pseudo-powłoce (przykład: / dev / pts / 0), jednym z najprostszych sposobów byłoby:

[user1@host ~]$ echo $SSH_CONNECTION

Powinien zwrócić: twój ip i port oraz ip, do którego jesteś podłączony i port

192.168.0.13 50473 192.168.0.22 22

Możesz także uzyskać informacje, używając ttylub who( w): (edytuj: Widzę, że teraz jest to lista powyżej w innym poście)

[user1@host ~]$ who
user1 tty1          2018-01-03 18:43
user2 pts/0        2018-01-03 18:44 (192.168.0.13)

źródło
Aby rozwinąć poprzednie odpowiedzi dotyczące globałów Bash. Może sugeruję odwołanie się do SECONDSglobalnego. Możesz użyć tego za pośrednictwem echo $SECONDS, który następnie wyświetla ilość czasu, od kiedy postrzegane połączenie
NerdOfCode
Spowoduje to wyświetlenie informacji o aktualnie aktywnej sesji - tej, w której piszesz. Pytanie dotyczy jednak listy wszystkich aktualnie połączonych sesji.
G-Man,
6

Rozwijanie odpowiedzi @ sebelk:

Użyte rozwiązanie netstatjest dobre, ale wymaga uprawnień roota. Ponadto net-toolspakiet (który zapewnia netstat) był przestarzały w niektórych nowszych dystrybucjach Linuksa ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ ).

Alternatywnym rozwiązaniem jest wówczas użycie zamiennik netstat, ss. Na przykład (pamiętaj, że nie potrzebujesz już roota):

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
źródło
2

Możesz użyć

last | head

Używałem tego w moim skrypcie .login od lat, aby zobaczyć, kto ostatnio zalogował się do systemu. Było to urządzenie zabezpieczające przed złym człowiekiem, sprawdzające, czy ktoś jest w systemie za pomocą twojego loginu.

JO Williams
źródło
1
... ale niekoniecznie będzie to lista aktywnych sesji (o co chodzi w tym pytaniu). W zależności od aktywności związanej z logowaniem nawet sesja, w której prowadziłeś, lastmoże nie być wymieniona.
muru
1
„last -p now” wyświetla wszystkie bieżące sesje ssh.
JO Williams,
@JOWilliams Która wersja lastobsługuje -p? Co to robi?
mwfearnley
Wersja @mwfearnley "last from util-linux 2.31.1"ma to na pewno.
V.7,