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.

flybywire
la source
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
nolim1t
la source
@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
vncprado
la source
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}'
AlexP
la source
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
Bangar
la source
6
 who | cut -d"(" -f2 |cut -d")" -f1
Danilo
la source
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.

Spindrift
la source
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
SeeBenClick
la source
2
netstat -tapen | grep ssh | awk '{ print $4}'
Sébastien Moreau
la source
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;
}
vineetv2821993
la source
1

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

aric
la source
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.

Gérard
la source
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.

Andrej
la source
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.

Daniel Schneller
la source
0

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

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

pfrandsen
la source
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)} '

Nex
la source
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).

Mihi
la source
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.

Kangqiao Zhao
la source
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

Nikhil Katre
la source
0

J'obtiens la sortie suivante de who -m --ipsDebian 10:

root pts / 0 déc 4 06:45 123.123.123.123

On dirait qu'une nouvelle colonne a été ajoutée, donc les tentatives de {print $5}" prendre la 5ème colonne " ne fonctionnent plus.

Essaye ça:

who -m --ips | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'

La source:

aexl
la source