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.
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
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
Essayez ce qui suit pour obtenir uniquement l'adresse IP:
who am i|awk '{ print $5}'
Tapez simplement la commande suivante sur votre machine Linux:
who
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.
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
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;
}
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.
netstat -tapen | grep ssh | awk '{ print $4}'
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)} '
Linux: qui suis-je | awk '{print $ 5}' | sed 's/[()] // g'
AIX: qui suis-je | awk '{print $ 6}' | sed 's/[()] // g'
netstat fonctionnera (au sommet, quelque chose comme cela) tcp 0 0 10.x.xx.xx: ssh adresse_ip.ou.domaine: 9379
who | cut -d"(" -f2 |cut -d")" -f1
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.
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
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.
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).
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.