web-dev-qa-db-fra.com

Obtenir l'adresse IP d'origine de la session ssh en cours sans être superutilisateur

J'essaie de trouver l'adresse IP d'origine de la session SSH en cours. J'ai trouvé ce qui suit utile, mais cela nécessite Sudo:

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

Est-il possible d’obtenir les informations 99.xxx.xxx.xxx sans appeler sudo?

(Répondu! Question n ° 1: Comment se fait-il que la canalisation vers Grep ne renvoie que l'erreur?)

Question n ° 2: Existe-t-il des solutions pour obtenir WAN informations avec Netstat? ou...

Question n ° 3: Existe-t-il de meilleures options pour mon objectif?

5
Tfb9

Réponse aux 1 et 2:

L'avertissement provient de netstatname__, pas de grepet concerne la colonne PID/Program name de la sortie netstatname__:

$ 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

Utilisation de Sudoname__:

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

L’alerte est explicite, vous devez être rootpour afficher les ID de processus et les noms de programme appartenant à d’autres utilisateurs, sinon vous obtiendrez uniquement le PID/les noms de programmes dont vous êtes propriétaire, bien que vous obteniez les listes de sockets ouverts pour ces processus.

La distinction est essentiellement résumée par ce qui suit, à partir 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.

Dans votre cas, le programme sshdappartient à rootname__. Par conséquent, si vous n’utilisez pas Sudoname__, toutes les informations relatives à la socket apparaîtront dans la sortie, et non le nom du programme et le PID. En conséquence, lorsque vous utilisez grepsur le résultat de netstat -taepn, vous obtenez l’avertissement.

Par contre, si vous utilisez Sudoname__, le nom du PID/du programme apparaîtra dans la sortie netstat -taepn et vous pourrez utiliser greppour trouver la sortie.

Ce qui suit vous éclaircira davantage (vérifiez la dernière colonne (PID/nom du programme)):

$ 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       

Si vous exécutez ceci à partir d'un ordinateur client, vous pouvez simplement l'ignorer car le processus dans ce cas sera ssh(pas sshdname__) et appartiendra à vous.

Réponse à 3:

Il y a tellement de façons. J'en ajouterai quelques uns:

$ 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) .*/\1/p'
192.168.5.3:22

EDIT: Sans Sudoname__:

$ 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) .*/\1/p'
192.168.5.3:22

EDIT 2:

Si vous souhaitez obtenir l'adresse IP distante connectée au port 22 (sshname__) du serveur sans utiliser Sudoname__, le mieux serait de lire les statistiques de socket via la commande sset d'obtenir la sortie souhaitée.

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

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

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

Nous avons exécuté les commandes ci-dessus sur le serveur et 192.168.6.4 est l'adresse IP de l'ordinateur distant connecté au serveur via sshsur le port 22.

6
heemayl

Vous pouvez utiliser les variables SSH_CONNECTION et 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

De 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.

Vous pouvez accéder plus facilement à chaque entrée dans SSH_CONNECTION si vous la divisez en un tableau bash:

ssh_details=($SSH_CONNECTION)

Ensuite, vous pouvez obtenir chaque entrée en utilisant son index:

$ 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

Pour une raison quelconque, SSH_CLIENT n'est pas documenté dans les pages de manuel en anglais.

13
muru

La ligne est en attente de la sortie d’erreur, c’est-à-dire sterrname__. Vous pourriez vous en débarrasser avec

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

Pour référence cochez cette case

enter image description here

Comme l'a noté correctement heemayl, sans Sudoname__, netstat ne signalera pas que la connexion est établie par le serveur ssh, uniquement si elle est établie par le client ssh.

Bien sûr, vous pouvez toujours le déterminer par numéro de port ou en utilisant l'utilitaire who -a, qui indiquera les noms d'utilisateur et l'adresse, mais cela ne garantit pas que quelqu'un ne sera pas connecté via telnet ou une application de bureau à distance.

0

Avant de continuer à lire la réponse SSH_CLIENT (c'était aussi simple que vous le savez), vous pouvez également faire:

pid=$(ps -xh -o pid,cmd | grep [s]shd | awk '{print $1}' | 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

En réalité, le processus contient les connexions pour tous les clients, pas seulement les vôtres. C'est fondamentalement le processus principal SSHD. Je ne sais pas pourquoi cela fonctionne sous votre utilisateur.

0
Xennex81