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?
Réponse aux 1 et 2:
L'avertissement provient de netstat
name__, pas de grep
et concerne la colonne PID/Program name
de la sortie netstat
name__:
$ 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 Sudo
name__:
$ 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 root
pour 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 sshd
appartient à root
name__. Par conséquent, si vous n’utilisez pas Sudo
name__, 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 grep
sur le résultat de netstat -taepn
, vous obtenez l’avertissement.
Par contre, si vous utilisez Sudo
name__, le nom du PID/du programme apparaîtra dans la sortie netstat -taepn
et vous pourrez utiliser grep
pour 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 sshd
name__) 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 Sudo
name__:
$ 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 (ssh
name__) du serveur sans utiliser Sudo
name__, le mieux serait de lire les statistiques de socket via la commande ss
et 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 ssh
sur le port 22.
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.
La ligne est en attente de la sortie d’erreur, c’est-à-dire sterr
name__. Vous pourriez vous en débarrasser avec
netstat -tapen 2> /dev/null | grep ssh
Pour référence cochez cette case
Comme l'a noté correctement heemayl, sans Sudo
name__, 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.
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.