Obtém o IP de origem da sessão ssh atual sem ser superusuário

4

Estou tentando descobrir o endereço IP de origem da sessão ssh atual. Eu encontrei o seguinte para ser útil, mas requer sudo:

$ sudo netstat -tapen | grep ssh | awk '{ print }' | sed '/0.0.0.0\|::/d'
192.168.1.1:60119
99.xxx.xxx.xxx:1213

Existe uma maneira de obter as informações 99.xxx.xxx.xxx sem uma chamada para o sudo?

(Respondida! Pergunta # 1: Como é que o piping para o grep retorna apenas o erro?)

Pergunta # 2: Existem soluções alternativas para obter informações de WAN com o netstat? ou ...

Pergunta # 3: Existem melhores opções para o meu objetivo?

    
por Tfb9 14.04.2015 / 01:02

4 respostas

6

Resposta a 1 & amp; 2:

O aviso é de netstat , não de grep e é sobre a coluna PID/Program name da netstat output:

$ netstat -tapen
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name

Usando sudo :

$ sudo netstat -tapen
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name

O alerta é auto-explicativo, você tem que ser root para ver os IDs de processo e nomes de programas pertencentes a outros (todos) usuários, caso contrário você só receberá os nomes PID de programas de sua propriedade as listagens de soquete aberto para esses processos.

A distinção é basicamente resumida pela seguinte, de man netstat :

   PID/Program name
       Slash-separated pair of the process id (PID) and process name of
the process that owns the socket.  --program causes this column  to
be  included. You will also need superuser privileges to see this  
information on sockets you don't own. This identification information is  
not yet available for IPX sockets.

No seu caso, o programa sshd é de propriedade de root , portanto, sem usar sudo , todas as informações do soquete aparecerão na saída, não o nome do programa e o PID. Como resultado, ao usar grep no resultado de netstat -taepn , você está recebendo o aviso.

Por outro lado, se você usar sudo , o nome do PID / programa aparecerá na netstat -taepn output e você poderá usar grep para encontrar a saída.

A seguir, você ficará mais claro (verifique a última coluna (PID / nome do programa)):

$ netstat -tapen
                                                        PID/Program name
tcp  0  0 0.0.0.0:22  0.0.0.0:* LISTEN  0   11088       -               

$sudo netstat -taepn
tcp  0  0 0.0.0.0:22  0.0.0.0:* LISTEN  0   11088       1002/sshd       

Se você estiver executando isso a partir de uma máquina cliente, poderá ignorá-la, pois o processo nesse caso será ssh (não sshd ) e será de sua propriedade.

Resposta para 3:

Existem muitas maneiras. Eu adicionarei alguns:

$ sudo netstat -taepn | grep "ssh" | tr -s ' ' | cut -d' ' -f4 | head -1
192.168.5.3:22

$ sudo netstat -taepn | grep -Po "\b(\d|\.)+:22(?= .*ssh)"
192.168.5.3:22

$ sudo netstat -taepn | sed -nr '/ssh/s/.* ([^:]+:22) .*//p'
192.168.5.3:22

EDITAR: Sem sudo :

$ netstat -taepn 2>/dev/null | grep ":22 " | tr -s ' ' | cut -d' ' -f4 | head -1
192.168.5.3:22

$ netstat -taepn 2>/dev/null | grep -Po "\b(\d|\.)+:22\b"
192.168.5.3:22

$ netstat -taepn 2>/dev/null | sed -nr '/:22 /s/.* ([^:]+:22) .*//p'
192.168.5.3:22

EDIT 2:

Se você deseja obter o endereço IP remoto conectado à porta 22 ( ssh ) do servidor sem usar sudo , o melhor seria ler as estatísticas do soquete via comando ss e obter a saída desejada disso.

$ ss -ant | grep -Po "(\d|\.)+:22\s+\K[^:]+"
192.168.6.4

$ ss -ant | sed -nr 's/.*([0-9]|\.)+:22 +([^:]+).*//p'
192.168.6.4

$ ss -ant | grep -e "ESTAB" | grep ":22" | tr -s ' ' | cut -d' ' -f5 | cut -d':' -f1
192.168.6.4

Executamos os comandos acima no servidor e 192.168.6.4 é o endereço IP do computador remoto conectado ao servidor via ssh na porta 22.

    
por heemayl 14.04.2015 / 01:09
12

Você pode usar as variáveis SSH_CONNECTION e SSH_CLIENT :

$ echo $SSH_CONNECTION 
10.0.0.1 42276 10.0.0.2 22
$ echo $SSH_CLIENT    
10.0.0.1 42276 22
$ SSH_IP=${SSH_CONNECTION%% *}
$ echo $SSH_IP
10.0.0.1

Em man 1 ssh :

 SSH_CONNECTION        Identifies the client and server ends of the
                       connection.  The variable contains four space-
                       separated values: client IP address, client port
                       number, server IP address, and server port number.

Você pode acessar cada entrada em SSH_CONNECTION mais facilmente se a dividir em uma matriz bash:

ssh_details=($SSH_CONNECTION)

Então você pode obter cada entrada usando seu índice:

$ echo $SSH_CONNECTION 
127.0.0.1 55719 127.0.0.1 22
$ ssh_details=($SSH_CONNECTION)
$ echo ${ssh_details[0]}
127.0.0.1
$ echo ${ssh_details[1]}
55719
$ printf "You are logging in from host IP %s from port # %d\n" ${ssh_details[0]} ${ssh_details[1]}
You are logging in from host IP 127.0.0.1 from port # 55719

Por algum motivo, SSH_CLIENT não está documentado nas páginas de manual em inglês.

    
por muru 14.04.2015 / 13:09
0

A linha é bellogs para a saída de erro, ou seja, sterr . Você poderia se livrar dele com

netstat -tapen 2> /dev/null | grep ssh

Para referência verifique isso

Como corretamente indicado por heemayl, sem sudo , o netstat não relatará que a conexão é estabelecida pelo servidor ssh, somente se for estabelecida pelo cliente ssh.

É claro que você ainda pode determiná-lo pelo número da porta ou usar who -a utility, que mostrará logins e endereços, mas não é garantia que alguém não esteja logado via telnet ou aplicativo de desktop remoto.

    
por Sergiy Kolodyazhnyy 14.04.2015 / 01:32
0

Antes de ler para ler a resposta SSH_CLIENT (era simples assim, você também pode fazer):

pid=$(ps -xh -o pid,cmd | grep [s]shd | awk '{print }' | head -1) 
cat /proc/$pid/net/tcp | while read a b c d e; do echo $b $c $d; done |
    tail -n +2 | grep " 01" | while read a b c; do echo $b; done |
    cut -d: -f1 | sed "s/../& /g" | while read d c b a; do
    printf "%d.%d.%d.%d\n" 0x$a 0x$b 0x$c 0x$d; done

Na verdade, o processo contém as conexões para todos os clientes, não apenas os seus. É basicamente o processo principal do SSHD. Não sei por que ele é executado no seu usuário.

    
por Xennex81 05.05.2017 / 08:39