Trouvez l'adresse IP du client dans une session SSH


166

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 à partir 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.


5
propose de passer à serverfault, encore une excellente question
BozoJoe

Réponses:


267

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

$SSH_CLIENT 

OU

$SSH_CONNECTION

(ou toute autre variable d'environnement) qui est définie lorsque l'utilisateur se connecte. Puis traitez-la à 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

@cwd je veux remplacer l'ip dans cette commande "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP" est-ce possible?
wutzebaer du

2
C'était REMOTEHOST pour moi.
dramzy

5
ne fonctionne qu'avec les utilisateurs non sudo. Par exemple, si vous avez un utilisateur ssh et que vous passez ensuite à root, un nouveau shell est créé et ces variables sont perdues, à moins que vous ne puissiez remonter dans l'arborescence pour trouver le pid ssh original et obtenir les variables de / proc / $ PID / environ
Andrej

5
grâce à stackoverflow.com/questions/428109/extract-substring-in-bash cette réponse peut être améliorée simplement${SSH_CLIENT%% *}
Jeff

@Andrej regarde danssudo -E
Jeff

105

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

13
C'est génial :-) Humour nerd ftw encore une fois. Selon pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Chris Woods

Pourquoi mon 'Où' dans ma sortie affiche-t-il uniquement le nom de la machine et non l'adresse IP?
isaganiesteron

Vous avez probablement configuré le serveur de noms sur votre machine.
vncprado

pinky montrera tous les utilisateurs connectés, pas seulement vous
Andrej

33

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

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

assez sûr si vous écrivez whoami et vous obtiendrez le nom de l'utilisateur connecté. il n'y a pas de cinquième chose ou d'ip à imprimer désolé. mais whoami est une commande utile
gerard

15
who am i! = whoamisur mon Linux au moins. Il y a une cinquième chose, et c'est le nom d'hôte du client.
kbulgrien

5
Pour ceux qui se demandent d' autre au sujet who am i: La page de manuel whodit: If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. Donc vraiment tout ce qui a deux mots fonctionne, aussi des choses comme who likes icecream.
jmiserez

3
En m'appuyant sur cette réponse, je l'ai réduite à de who -m --ips|awk '{print $5}'telle sorte que je n'avais que IP et pas de réponse inverse-DNS. Merci pour l'aide who am i!
Yvan

1
Échec avec tmux: who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche

19

Tapez simplement la commande suivante sur votre machine Linux:

who


5
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 lors de la connexion via ssh et j'ai besoin d'afficher X distant.


Une ligne utile pour ajouter mon adresse IP aux fichiers .htaccess. Je vous remercie. J'ai fait une modification pour FreeBSD: who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' la dernière partie échappe aux points.
Olivier - interfaSys

5

Amélioration sur une réponse antérieure. Donne une adresse IP au lieu du nom d'hôte. --ips non disponible sur OS X.

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

plus universel, changez 5 $ en 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

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

ne fonctionne pas sur CentOS 6.9 (net-tools 1.60 netstat 1.42)(No info could be read for "-p": geteuid()=507 but you should be root.)
Jeff

@Jeff sudo ss -tapen | grep ssh | awk '{ print $4}'|grep -v ':22$'fonctionne-t-il?
Alexx Roche

2

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;
}

1

netstat fonctionnera (en haut quelque chose comme ça) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLISHED


Merci beaucoup pour cette réponse, j'ai fini par faire 'netstat | grep ssh '.
Ross Aiken

Pour des raisons de sécurité, c'est mauvais car n'importe qui peut être connecté à ce port, pas seulement vous.
CrazyCasta

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

Production:

deux # dans mon expérience

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

donne l'adresse IP.

Production:

127.0.0.1:22 # in my experiment

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


mon netstat ne donne qu'une adresse tronquée pour IPv6 et "127.0.0.1:22" est le serveur plutôt que le client, (qui a été spécifié dans la question.)
Alexx Roche

1

un fil plus ancien avec beaucoup de réponses, mais aucune n'est tout à fait 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 ssh direct, les utilisateurs sudoed et les sessions d'écran. il suivra l'arborescence des processus jusqu'à ce qu'il trouve un pid avec la variable SSH_CLIENT, puis enregistrera son adresse IP sous la forme $ sshClientIP. s'il va trop loin dans l'arborescence, il enregistrera l'adresse IP comme 'localhost' et quittera la boucle.


0

Habituellement, il y a 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

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

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


0

Recherchez les connexions SSH pour le compte "myusername";

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

Prenez la 5e colonne;

Diviser par ":" et retourner la 1ère partie (le numéro de port n'est pas nécessaire, nous voulons juste IP):

netstat -tapen | grep "sshd: mon nom d'utilisateur" | head -n1 | awk '{split (5 $, a, ":"); imprimer un [1]} '


Autrement:

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


sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'dit que mon client ssh est de 2a02et que votre "Autre moyen:" dittmux(2445).%3
Alexx Roche

0

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


0

Un 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 lastcommande

Celui qui utilise whoou pinkyfait ce qui est fondamentalement demandé. Mais mais ils ne donnent pas d'informations sur les sessions historiques.

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

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

last | grep $USER | head

ÉDITER:

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


0

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 lastcommande


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.