Найдите IP-адрес клиента в сеансе SSH
У меня есть скрипт, который должен быть запущен человеком, который входит на сервер с SSH.
есть ли способ автоматически узнать, с какого IP-адреса подключается пользователь?
конечно, я мог бы спросить пользователя (это инструмент для программистов, так что нет проблем с этим), но было бы круче, если бы я просто узнал.
19 ответов:
проверьте, есть ли переменная окружения с именем:
$SSH_CLIENTили
$SSH_CONNECTION(или любые другие переменные окружения), который устанавливается при входе пользователя в систему. Затем обработайте его с помощью сценария входа пользователя.
извлечь IP:
$ echo $SSH_CLIENT | awk '{ print }' 1.2.3.4 $ echo $SSH_CONNECTION | awk '{print }' 1.2.3.4
вы можете использовать команду:
server:~# pinkyэто даст вам что-то вроде этого:
Login Name TTY Idle When Where root root pts/0 2009-06-15 13:41 192.168.1.133
who am i | awk '{print }' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g' export DISPLAY=`who am i | awk '{print }' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'`:0.0Я использую это для определения моей переменной отображения для сеанса при входе в систему через ssh и должен отображать удаленный X.
улучшение предыдущего ответа. Дает IP-адрес вместо имени хоста. -- IP-адреса недоступны в OS X.
who am i --ips|awk '{print }' #ubuntu 14более универсальный, измените $5 на $6 для OS X 10.11:
WORKSTATION=`who -m|awk '{print }'|sed 's/[()]//g'` WORKSTATION_IP=`dig +short $WORKSTATION` if [[ -z "$WORKSTATION_IP" ]]; then WORKSTATION_IP="$WORKSTATION"; fi echo $WORKSTATION_IP
netstat -tapen | grep ssh | awk '{ print }'выход:
два # в моем эксперименте
netstat -tapen | grep ssh | awk '{ print }'дает IP-адрес.
выход:
127.0.0.1:22 # in my experimentно результаты смешиваются с другими пользователями и прочее. Над этим нужно еще поработать.
вы можете получить его программным способом через библиотеку 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 будет работать (вверху что-то вроде этого) tcp 0 0 10.x. xx. xx: ssh someipaddress.или.доменное имя: 9379 установлено
Linux: кто я / awk '{print $5} '| sed 's/[()] / / g'
AIX: кто я / awk '{print $6} '| sed 's/[()] / / g'
Поиск SSH-соединений для учетной записи "myusername";
взять первую строку;
взять 5-ю колонну;
разделить на": "и вернуть 1-ю часть (номер порта не нужен, мы хотим только IP):
netstat-tapen | grep "sshd: myusername" | head-n1 / awk '{split ($5, a,":"); print a[1]}'
иначе:
who am i / awk ' {l = length($5) - 2; print substr($5, 2, l)}'
обычно есть запись журнала в /var/log / messages (или аналогичная, в зависимости от вашей ОС), которую вы можете grep с именем пользователя.
предполагая, что он открывает интерактивный сеанс (то есть выделяет псевдо терминал) и у вас есть доступ к stdin, вы можете вызов ioctl на этом устройстве чтобы получить номер устройства (/dev/pts / 4711) и попытаться найти его в /var / run / utmp (где также будет имя пользователя и IP-адрес, с которого было установлено соединение).
более старый поток с большим количеством ответов, но ни один из них не совсем то, что я искал, поэтому я добавляю свой:
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 }') [ "$sshpid" = "0" ] && sshClientIP="localhost" && sshloop=1 fi doneэтот метод совместим с прямыми ssh, пользователями sudoed и сеансами экрана. он будет проходить через дерево процессов, пока не найдет pid с переменной SSH_CLIENT, а затем запишите его IP как $sshClientIP. если он заберется слишком далеко вверх по дереву, он запишет IP как "localhost" и покинет цикл.
самая простая команда, чтобы получить последние 10 пользователей, вошедших в систему на машине
last|head.чтобы получить все пользователи просто использовать
lastкоманда
один большой палец вверх для ответа @Nikhil Katre:
самая простая команда, чтобы получить последние 10 пользователей, вошедших в систему на машине является
last|head.чтобы получить все пользователи просто использовать
lastкомандаС помощью
whoилиpinkyсделал то, что в основном спрашивают. Но они не дают исторической информации о сеансах.что может быть интересно, если вы хотите знать, кто только что вошел в систему и выходить из системы уже когда вы начинаете эту проверку.
если это многопользовательская система. Я рекомендую добавить учетную запись пользователя, которую вы ищете:
last | grep $USER | headEDIT:
в моем случае оба $SSH_CLIENT и $SSH_CONNECTION не существуют.
попробуйте следующее, Чтобы получить только IP-адрес через SSH:
Command: ifconfigпример:
stalinrajindian@ubuntuserver:~$ ifconfig enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.30.3.27 netmask 255.255.255.0 broadcast 172.30.3.255 inet6 fe80::a00:27ff:fe8b:9986 prefixlen 64 scopeid 0x20<link> ether 08:00:27:8b:99:86 txqueuelen 1000 (Ethernet) RX packets 4876 bytes 1951791 (1.9 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 775 bytes 73783 (73.7 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 78 bytes 5618 (5.6 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 78 bytes 5618 (5.6 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Comments