Elencare tutte le sessioni SSH connesse?


184

Ho appena SSH in root e poi SSH in root sulla stessa macchina. Quindi ho due finestre aperte sia su SSH che su root sul mio computer remoto.

Dalla shell, come posso vedere un elenco di queste due sessioni?

Risposte:


188

whooppure w; who -aper ulteriori informazioni.

Questi comandi mostrano solo tutte le sessioni di accesso su un dispositivo terminale. Una sessione SSH sarà su uno slave pseudo-terminale ( pts) come mostrato nella TTYcolonna, ma non tutte le connessioni pts sono sessioni SSH. Ad esempio, i programmi che creano un dispositivo pseudo-terminale come xtermo screenmostreranno come pts. Vedi Differenza tra pts e tty per una migliore descrizione dei diversi valori trovati nella TTYcolonna. Inoltre, questo approccio non mostrerà nessuno che ha effettuato l'accesso a una sessione SFTP, poiché le sessioni SFTP non sono sessioni di accesso alla shell.

Non conosco alcun modo per mostrare esplicitamente tutte le sessioni SSH. Puoi inferire queste informazioni leggendo le informazioni di accesso da utmp/ wtmptramite uno strumento come last, wo whocome ho appena descritto, oppure utilizzando strumenti di rete come @sebelk descritti nella loro risposta per trovare connessioni tcp aperte sulla porta 22 (o ovunque il tuo SSH demone / i è / stanno ascoltando).

Un terzo approccio che potresti adottare è analizzare l'output del log dal demone SSH. A seconda della distribuzione del sistema operativo, della distribuzione SSH, della configurazione e così via, l'output del registro potrebbe trovarsi in diverse posizioni. In un box RHEL 6, ho trovato i log in /var/log/sshd.log. Su un box RHEL 7 e anche su un box Arch Linux, dovevo usare journalctl -u sshdper visualizzare i log. Alcuni sistemi potrebbero generare log SSH su syslog. I tuoi registri potrebbero trovarsi in questi luoghi o altrove. Ecco un esempio di ciò che potresti vedere:

[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

I registri mostrano quando le sessioni si aprono e si chiudono, a chi appartiene la sessione, da dove l'utente si sta connettendo e altro. Tuttavia, dovrai eseguire molte analisi se vuoi ottenere questo da un semplice registro di eventi leggibile dall'uomo a un elenco di sessioni attualmente attive, e probabilmente non sarà ancora un elenco accurato quando hai terminato l'analisi, dal momento che i log in realtà non contengono abbastanza informazioni per determinare quali sessioni sono ancora attive - essenzialmente stai solo indovinando. L'unico vantaggio che si ottiene utilizzando questi registri è che le informazioni provengono direttamente da SSHD anziché tramite una fonte di seconda mano come gli altri metodi.

Raccomando solo di usare w. Il più delle volte, questo ti fornirà le informazioni che desideri.



Trovato questo durante la ricerca di un problema tangenzialmente correlato. Non importa Questa è una delle migliori risposte che ho visto su qualsiasi sito Stack! Ora so molto di più su questa particolare area (per mancanza di una parola migliore). EDIT: Grazie!
jscharf,

107

Puoi vedere ogni sessione ssh con il seguente comando:

[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 forse questo può essere utile:

[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
Grazie; questa risposta è molto meglio della risposta principale, che elenca solo gli utenti che hanno effettuato l'accesso a una shell. Questa soluzione trova anche utenti SFTP.
Hayden Schiff,

1
sulla maggior parte delle scatole al giorno d'oggi è possibile utilizzarepgrep -ai sshd
ccpizza il

@ccpizza: pgrep: invalid option -- 'i'su Ubuntu 14.04.
Martin Schröder,

2
@ MartinSchröder: -iè disponibile solo sui gusti mac / bsd. su Ubuntu puoi usare pgrep -af ssd. Per i dettagli, vedere serverfault.com/a/883270/116777
ccpizza

Simile a @HaydenSchiff, dovevo anche trovare utenti che avevano solo un tunnel SSH aperto per il port forwarding, senza shell. Questo ha aiutato!
Tobias K.,


7

Aggiunto per riferimento semplice.

Se sei in una pseudo shell (esempio: / dev / pts / 0) uno dei modi più semplici sarebbe:

[user1@host ~]$ echo $SSH_CONNECTION

Dovrebbe restituire: il tuo IP e la tua porta e l'ip a cui sei connesso e la tua porta

192.168.0.13 50473 192.168.0.22 22

Puoi anche ottenere alcune informazioni usando ttyo who( w): (modifica: vedo che ora è elencato sopra in un altro post)

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

Espandere le risposte precedenti relative ai globi di Bash. Potrei suggerire di fare riferimento al SECONDSglobale. È possibile utilizzare questo tramite echo $SECONDS, che visualizza quindi la quantità di tempo, dal momento che la connessione percepita
NerdOfCode

Verranno visualizzate le informazioni per la sessione attualmente attiva, quella in cui stai digitando. Ma la domanda chiede come elencare tutte le sessioni attualmente connesse .
G-Man,

6

Espandendo la risposta di @ sebelk:

La soluzione utilizzata netstatè valida ma richiede i privilegi di root. Inoltre, il net-toolspacchetto (che fornisce netstat) è stato deprecato in alcune nuove distro Linux ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ ).

Una soluzione alternativa è quindi di utilizzare la sostituzione per netstat, ss. Ad esempio (nota che non hai più bisogno di 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

2

Puoi usare

last | head

Ho usato questo nel mio script .login per anni per vedere chi si era recentemente connesso al sistema. Era un dispositivo di sicurezza per poveri per vedere se qualcuno era sul sistema usando il tuo login.


1
... ma non sarà necessariamente un elenco di sessioni attive (di cosa tratta questa domanda). A seconda dell'attività di accesso, anche la sessione in cui è stata eseguita lastpotrebbe non essere elencata.
Muru,

1
"last -p now" elenca tutte le sessioni ssh correnti.
JO Williams

@JOWilliams Quale versione dei lastsupporti -p? Che cosa fa?
mwfearnley,

La versione di @mwfearnley ce l' "last from util-linux 2.31.1"ha di sicuro.
V.7,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.