Найдите IP-адрес клиента в сеансе SSH



У меня есть скрипт, который должен быть запущен человеком, который входит на сервер с SSH.



есть ли способ автоматически узнать, с какого IP-адреса подключается пользователь?



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

873   19  

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

выход:

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

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 команда

 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

Comments

    Ничего не найдено.