Найти 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

попробуйте следующее, Чтобы получить только IP-адрес:

who am i|awk '{ print }'

просто введите следующую команду на компьютере с Linux:

who

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-адрес вместо имени хоста. -- ips не доступен в 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 }'

выход:

два # в моем эксперименте

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.или.domainame: 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]}'


иначе:

кто я / awk ' {l = length ($5) - 2; print substr ($5, 2, l)}'


обычно есть запись журнала в /var/log / messages (или аналогичная, в зависимости от вашей ОС), которую вы можете grep с именем пользователя.


предполагая, что он открывает интерактивный сеанс (то есть выделяет псевдо терминал) и у вас есть доступ к stdin, вы можете вызов ioctl на этом устройстве чтобы получить номер устройства (/dev/pts/4711) и попытаться найти его в в/var/выполнить/через 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 команда


 who | cut -d"(" -f2 |cut -d")" -f1

один большой палец вверх для ответа @Nikhil Katre:

простейшую команду для получения последних 10 пользователей, зарегистрированных в машину last|head.

чтобы получить все пользователи просто использовать last команда

С помощью who или pinky сделал то, что в основном спрашивают. Но они не дают исторической информации.

что может быть интересно, если вы хотите знать, кто только что вошел в систему и выходить из системы уже когда вы начинаете эту проверку.

если это многопользовательская система. Я рекомендую добавить учетную запись пользователя, которую вы ищете:

last | grep $USER | head

EDIT:

в моем случае как $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