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

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

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

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

Ответ 1

Проверьте, есть ли переменная среды:

$SSH_CLIENT 

ИЛИ

$SSH_CONNECTION

(или любые другие переменные среды), которые устанавливаются при входе пользователя в систему. Затем обработайте его с помощью входа пользователя script.

Извлеките IP:

$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4

Ответ 2

Вы можете использовать команду:

server:~# pinky

который даст вам нечто вроде этого:

Login      Name                 TTY    Idle   When                 Where 

root       root                 pts/0         2009-06-15 13:41     192.168.1.133

Ответ 3

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

who am i|awk '{ print $5}'

Ответ 4

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

who

Ответ 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

Я использую это, чтобы определить свою переменную DISPLAY для сеанса при входе в систему через ssh и отобразить удаленный X.

Ответ 6

netstat -tapen | grep ssh | awk '{ print $4}'

Ответ 7

netstat -tapen | grep ssh | awk '{ print $10}'

Вывод:

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

netstat -tapen | grep ssh | awk '{ print $4}' 

указывает IP-адрес.

Вывод:

127.0.0.1:22 # in my experiment

Но результаты смешаны с другими пользователями и т.д. Это требует больше работы.

Ответ 8

Вы можете получить его программным способом через библиотеку 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;
}

Ответ 9

Улучшение при предыдущем ответе. Дает ip-адрес вместо имени хоста. - не доступны в OS X.

who am i --ips|awk '{print $5}' #ubuntu 14

более универсальный, замените $5 на $6 для 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

Ответ 10

netstat будет работать (наверху что-то вроде этого) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLISHED

Ответ 11

Поиск SSH-соединений для учетной записи "myusername";

Возьмите первую строку результата;

Возьмите 5-й столбец;

Разделить на ":" и вернуть 1-ю часть (номер порта не нужен, мы хотим только IP):

netstat -tapen | grep "sshd: myusername" | head -n1 | awk '{split ($ 5, a, ":" ); напечатать a [1]} '


Другой способ:

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

Ответ 12

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

Ответ 13

Предполагая, что он открывает интерактивный сеанс (то есть выделяет псевдотерминал), и у вас есть доступ к stdin, вы можете вызвать ioctl на этом устройстве, чтобы получить номер устройства (/dev/pts/4711) и попытаться найти его в /var/run/utmp (где также будет имя пользователя и IP-адрес, из которого возникло соединение).

Ответ 14

Linux: кто я | awk '{print $5}' | sed 's/[()]//g'

AIX: кто я | awk '{print $6}' | sed 's/[()]//g'

Ответ 15

более старая тема с большим количеством ответов, но ни один из них не совсем то, что я искал, поэтому я вношу свой вклад:

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

этот метод совместим с непосредственными пользователями ssh, sudoed и сеансами экрана. он будет проходить через дерево процессов до тех пор, пока не найдет pid с переменной SSH_CLIENT, а затем запишет его IP как $sshClientIP. если он окажется слишком далеко от дерева, он будет записывать IP как "localhost" и оставить цикл.

Ответ 16

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

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