web-dev-qa-db-fra.com

Trouver l'adresse IP du client dans une session SSH

J'ai un script qui doit être exécuté par une personne qui se connecte au serveur avec SSH .

Existe-t-il un moyen de savoir automatiquement de quelle adresse IP l'utilisateur se connecte?

Bien sûr, je pourrais demander à l'utilisateur (c'est un outil pour les programmeurs, donc pas de problème avec ça), mais ce serait plus cool si je venais de le découvrir.

134
flybywire

Vérifiez s'il existe une variable d'environnement appelée:

$SSH_CLIENT 

OR

$SSH_CONNECTION

(ou toute autre variable d’environnement) définie lors de la connexion de l’utilisateur. Traitez-la ensuite à l’aide du script de connexion utilisateur.

Extraire l'IP:

$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4
221
nolim1t

Vous pouvez utiliser la commande:

server:~# pinky

cela vous donnera quelque chose comme ceci:

Login      Name                 TTY    Idle   When                 Where 

root       root                 pts/0         2009-06-15 13:41     192.168.1.133
91
vncprado

Essayez ce qui suit pour obtenir uniquement l'adresse IP:

who am i|awk '{ print $5}'
28
AlexP

Tapez simplement la commande suivante sur votre machine Linux:

who
15
Bangar
who am i | awk '{print $5}' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'


export DISPLAY=`who am i | awk '{print $5}' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'`:0.0

J'utilise ceci pour déterminer ma variable DISPLAY pour la session lorsque je me connecte via ssh et que je dois afficher un X distant.

5
Spindrift

Améliorer sur une réponse préalable. Donne l'adresse IP au lieu du nom d'hôte. --ips non disponible sous OS X.

who am i --ips|awk '{print $5}' #ubuntu 14

plus universel, remplacez 5 $ par 6 $ pour OS X 10.11:

WORKSTATION=`who -m|awk '{print $5}'|sed 's/[()]//g'`
WORKSTATION_IP=`Dig +short $WORKSTATION`
if [[ -z "$WORKSTATION_IP" ]]; then WORKSTATION_IP="$WORKSTATION"; fi
echo $WORKSTATION_IP
3
SeeBenClick

Vous pouvez l'obtenir de manière programmatique via une bibliothèque SSH ( https://code.google.com/p/sshxcute )

public static String getIpAddress() throws TaskExecFailException{
    ConnBean cb = new ConnBean(Host, username, password);
    SSHExec ssh = SSHExec.getInstance(cb);
    ssh.connect();
    CustomTask sampleTask = new ExecCommand("echo \"${SSH_CLIENT%% *}\"");
    String Result = ssh.exec(sampleTask).sysout;
    ssh.disconnect();   
    return Result;
}
2
vineetv2821993
netstat -tapen | grep ssh | awk '{ print $10}'

Sortie:

deux # dans mon expérience

netstat -tapen | grep ssh | awk '{ print $4}' 

donne l'adresse IP.

Sortie:

127.0.0.1:22 # in my experiment

Mais les résultats sont mélangés avec d'autres utilisateurs et d'autres choses. Il faut plus de travail.

2
gerard
netstat -tapen | grep ssh | awk '{ print $4}'
2
Sébastien Moreau

Recherchez les connexions SSH pour le compte "myusername";

Prendre la première chaîne de résultat;

Prenez la 5ème colonne.

Divisé par ":" et retourne la 1ère partie (le numéro de port n'est pas nécessaire, nous ne voulons que l'IP):

netstat -tapen | grep "sshd: myusername" | tête -n1 | awk '{split (5 $, a, ":"); imprimer un [1]} '


Autrement:

qui suis-je | awk '{l = longueur (5 $) - 2; imprimer substrat ($ 5, 2, l)} '

1
Nex

Linux: qui suis-je | awk '{print $ 5}' | sed 's/[()] // g'

AIX: qui suis-je | awk '{print $ 6}' | sed 's/[()] // g'

1
pfrandsen

netstat fonctionnera (au sommet, quelque chose comme cela) tcp 0 0 10.x.xx.xx: ssh adresse_ip.ou.domaine: 9379

1
aric
 who | cut -d"(" -f2 |cut -d")" -f1
1
danilo

Un coup de pouce pour la réponse de @Nikhil Katre:

La commande la plus simple pour obtenir les 10 derniers utilisateurs connectés à la machine est last|head.

Pour obtenir tous les utilisateurs, utilisez simplement la commande last

Celui qui a utilisé who ou pinky a fait ce qui est fondamentalement demandé. Mais mais ils ne donnent pas d'informations sur les sessions historiques.

Ce qui pourrait également être intéressant si vous souhaitez connaître quelqu'un qui vient de se connecter et Déjà déconnecté lorsque vous démarrez cette vérification.

s'il s'agit d'un système multi-utilisateur. Je vous recommande d'ajouter le compte d'utilisateur que vous recherchez:

last | grep $USER | head

MODIFIER:

Dans mon cas, $ SSH_CLIENT et $ SSH_CONNECTION n'existent pas.

0
Kangqiao Zhao

La commande la plus simple pour obtenir les 10 derniers utilisateurs connectés à la machine est last|head.

Pour obtenir tous les utilisateurs, utilisez simplement la commande last

0
Nikhil Katre

Il existe généralement une entrée de journal dans/var/log/messages (ou similaire, selon votre système d'exploitation) que vous pouvez grep avec le nom d'utilisateur.

0
Daniel Schneller

En supposant qu'il ouvre une session interactive (c'est-à-dire qu'il alloue un pseudo terminal ) et que vous ayez accès à stdin, vous pouvez appeler un ioctl sur ce périphérique pour obtenir le numéro de périphérique (/ dev/pts/4711 ) et essayez de trouver celui-ci dans /var/run/utmp (où se trouveront également le nom d'utilisateur et l'adresse IP d'où provient la connexion).

0
mihi

un fil plus ancien avec beaucoup de réponses, mais aucune ne correspond vraiment à ce que je cherchais, alors je contribue le mien:

sshpid=$$
sshloop=0
while [ "$sshloop" = "0" ]; do
        if [ "$(strings /proc/${sshpid}/environ | grep ^SSH_CLIENT)" ];
then
                read sshClientIP sshClientSport sshClientDport <<< $(strings /proc/${sshpid}/environ | grep ^SSH_CLIENT | cut -d= -f2)
                sshloop=1
        else
                sshpid=$(cat /proc/${sshpid}/status | grep PPid | awk '{print $2}')
                [ "$sshpid" = "0" ] && sshClientIP="localhost" && sshloop=1
        fi
done

cette méthode est compatible avec les utilisateurs directs ssh, sudoed et screen. il suivra l'arbre du processus jusqu'à ce qu'il trouve un pid avec la variable SSH_CLIENT, puis enregistrera son IP sous le nom $ sshClientIP. s'il monte trop haut dans l'arborescence, il enregistrera l'adresse IP en tant que 'localhost' et quittera la boucle.

0
Andrej