Listar todas as sessões SSH conectadas?

184

Acabei de fazer o SSH no root e depois novamente no root na mesma máquina. Então, eu tenho duas janelas que abrem o SSH na raiz da minha máquina remota.

No shell, como posso ver uma lista dessas duas sessões?

o espelho
fonte

Respostas:

188

whoou w; who -apara informações adicionais.

Esses comandos apenas mostram todas as sessões de login em um dispositivo terminal. Uma sessão SSH estará em um escravo pseudo-terminal ( pts), como mostrado na TTYcoluna, mas nem todas as conexões pts são sessões SSH. Por exemplo, programas que criam um dispositivo pseudo-terminal como xtermou screenserão exibidos como pts. Consulte Diferença entre pts e tty para obter uma descrição melhor dos diferentes valores encontrados na TTYcoluna. Além disso, essa abordagem não mostrará quem está conectado a uma sessão SFTP, pois as sessões SFTP não são sessões de logon no shell.

Não conheço nenhuma maneira de mostrar explicitamente todas as sessões SSH. Você pode inferir essas informações lendo as informações de login de utmp/ wtmpatravés de uma ferramenta como last, wou whocomo acabei de descrever, ou usando ferramentas de rede como @sebelk descritas em sua resposta para encontrar conexões TCP abertas na porta 22 (ou onde quer que seu SSH daemon (s) está / escutando).

Uma terceira abordagem que você pode adotar é analisar a saída do log do daemon SSH. Dependendo da distribuição do SO, da distribuição SSH, da configuração e assim por diante, a saída do log pode estar em vários locais diferentes. Em uma caixa RHEL 6, encontrei os logs /var/log/sshd.log. Em uma caixa RHEL 7, e também em uma caixa Arch Linux, eu precisava usar journalctl -u sshdpara visualizar os logs. Alguns sistemas podem gerar logs SSH para o syslog. Seus registros podem estar nesses locais ou em outros lugares. Aqui está uma amostra do que você pode ver:

[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

Os logs mostram quando as sessões são abertas e fechadas, a quem pertence a sessão, de onde o usuário está se conectando e muito mais. No entanto, você precisará fazer muitas análises se desejar obter isso de um registro de eventos simples, legível por humanos, para uma lista de sessões ativas no momento, e ainda assim provavelmente não será uma lista precisa quando você terminou de analisar, já que os logs não contêm informações suficientes para determinar quais sessões ainda estão ativas - você está apenas adivinhando. A única vantagem que você obtém usando esses logs é que as informações vêm diretamente do SSHD, e não através de uma fonte de segunda mão, como os outros métodos.

Eu recomendo apenas usar w. Na maioria das vezes, isso fornece as informações que você deseja.

jayhendren
fonte
2
Relacionado: Entendendo a saída do who -acomando
Serge Stroobandt
Encontrei isso enquanto procurava por um problema relacionado tangencialmente. Não importa. Esta é uma das melhores respostas que eu já vi em qualquer site Stack! Agora eu sei muito mais sobre essa área em particular (por falta de uma palavra melhor). EDIT: Obrigado!
Jscharf
107

Você pode ver todas as sessões ssh com o seguinte 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 talvez isso possa ser útil:

[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
fonte
4
Obrigado; esta resposta é muito melhor que a resposta principal, que lista apenas os usuários que estão conectados a um shell. Esta solução também encontra usuários de SFTP.
Hayden Schiff
1
na maioria das caixas de hoje em dia você pode usarpgrep -ai sshd
ccpizza
@ccpizza: pgrep: invalid option -- 'i'no Ubuntu 14.04.
Martin Schröder
2
@ MartinSchröder: -iestá disponível apenas nos sabores mac / bsd. no ubuntu você pode usar pgrep -af ssd. Veja serverfault.com/a/883270/116777 para obter detalhes
ccpizza
Semelhante ao @HaydenSchiff, eu também precisava encontrar usuários que tenham apenas um túnel SSH aberto para encaminhamento de porta, sem um shell. Isso ajudou!
Tobias K.
14

Você também pode usar

ps ax | grep sshd
Joel Inglao
fonte
7

Adicionado para referência simples.

Se você estiver em um pseudo shell (exemplo: / dev / pts / 0), uma das maneiras mais simples seria:

[user1@host ~]$ echo $SSH_CONNECTION

Ele deve retornar: seu ip e porta e o ip conectado e porta

192.168.0.13 50473 192.168.0.22 22

Você também pode obter algumas informações usando ttyou who( w): (editar: agora vejo a lista acima em outro post)

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

fonte
Expandir as respostas anteriores que tratam dos globos Bash. Posso sugerir referência ao SECONDSglobal. Você pode usar isso via echo $SECONDS, que então exibe a quantidade de tempo, desde a conexão percebida
NerdOfCode 4/18/18
Isso exibirá informações para a sessão ativa no momento - aquela em que você está digitando. Mas a pergunta pergunta como listar todas as sessões atualmente conectadas .
G-Man
6

Expandindo a resposta da @ sebelk:

A solução utilizada netstaté boa, mas requer privilégios de root. Além disso, o net-toolspacote (que fornece netstat) foi descontinuado em algumas distribuições Linux mais recentes ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ ).

Uma solução alternativa é, em seguida, usar o substituto para netstat, ss. Por exemplo (observe que você não precisa mais de 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
fonte
2

Você pode usar

last | head

Eu usei isso no meu script .login por anos para ver quem havia entrado recentemente no sistema. Era um dispositivo de segurança para ver se havia alguém no sistema usando seu login.

JO Williams
fonte
1
... mas não será necessariamente uma lista de sessões ativas (sobre o que é essa pergunta). Dependendo da atividade de login, mesmo a sessão em que você executou lastpode não estar listada.
Muru
1
"last -p now" lista todas as sessões ssh atuais.
JO Williams
@JOWilliams Qual versão dos lastsuportes -p? O que isso faz?
mwfearnley
A versão @mwfearnley "last from util-linux 2.31.1"tem com certeza.
V.7