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


166

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

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

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


5
предлагаю перейти на serverfault, но все еще великий вопрос
BozoJoe

Ответы:


267

Проверьте, существует ли переменная окружения с именем:

$SSH_CLIENT 

ИЛИ

$SSH_CONNECTION

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

Извлеките IP:

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

@cwd я хочу заменить ip в этой команде "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP" это возможно?
wutzebaer

2
Это было REMOTEHOST для меня.
Драмзи

5
работает только с неубеденными пользователями. Например, если у вас есть пользователь ssh, а затем он переходит в root, создается новая оболочка, и эти переменные теряются, если только вы не можете проследить через дерево, чтобы найти исходный psh ssh и получить переменные из / proc / $ PID / environment.
Андрей

5
благодаря stackoverflow.com/questions/428109/extract-substring-in-bash этот ответ может быть улучшен до простого${SSH_CLIENT%% *}
Джефф

@Andrej посмотриsudo -E
Джефф

105

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

server:~# pinky

это даст вам что-то вроде этого:

Login      Name                 TTY    Idle   When                 Where 

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

13
Это потрясающе :-) Nerd humor ftw еще раз. По словам pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Крис Вудс

Почему в моем выводе «Где» отображается только имя машины, а не IP-адрес?
isaganiesteron

Возможно, вы настроили сервер имен на вашем компьютере.
vncprado

Пинки покажет всех вошедших в систему пользователей, а не только себя
Андрей

33

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

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

Я уверен, если вы напишите whoami, и вы получите имя вошедшего в систему пользователя. нет пятой вещи или ip для печати извините. но whoami - полезная команда
Джерард

15
who am i! = whoamiпо крайней мере на моем Linux. Есть пятое, и это имя хоста клиента.
kbulgrien

5
Для кого -то еще интересно о who am i: странице руководства для whoговорит: If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. Так что на самом деле работает все, что с двумя словами, и тому подобное who likes icecream.
jmiserez

3
Основываясь на этом ответе, я уменьшил его до who -m --ips|awk '{print $5}'того, что у меня был только IP и никакого обратного DNS-ответа. Спасибо за помощь who am i!
Иван

1
Сбой с tmux: who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche

19

Просто введите следующую команду на вашем компьютере с 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.


Полезный вкладыш для добавления моего IP в файлы .htaccess. Спасибо. Я сделал модификацию для FreeBSD: who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' последняя часть ускользает от точек.
Оливье - interfaSys

5

Улучшение по предварительному ответу. Дает IP-адрес вместо имени хоста. --ips не доступны в 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


2

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

1

netstat будет работать (наверху что-то вроде этого) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 УСТАНОВЛЕНО


Большое спасибо за этот ответ, я закончил 'netstat | grep ssh '.
Росс Айкен

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

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

Вывод:

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

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

дает IP-адрес.

Вывод:

127.0.0.1:22 # in my experiment

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


мой netstat дает только усеченный адрес для IPv6, а «127.0.0.1:22» является сервером, а не клиентом (что было указано в вопросе.)
Alexx Roche

1

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

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» и выйдет из цикла.


0

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


0

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

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


0

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

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

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

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

netstat -tapen | grep "sshd: myusername" | голова -n1 | awk '{split ($ 5, a, ":"); распечатать [1]} '


По-другому:

кто я | awk '{l = длина ($ 5) - 2; print substr ($ 5, 2, l)} '


sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'говорит, что мой клиент ssh от, 2a02а ваш "Другой путь:" говоритtmux(2445).%3
Алекс Рош

0

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


0

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

Простейшая команда для входа в систему последних 10 пользователей - это last|head.

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

Тот, кто использовал whoили pinkyсделал то, что в основном просили. Но Но Но Они не дают историческую информацию о сессиях.

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

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

last | grep $USER | head

РЕДАКТИРОВАТЬ:

В моем случае и $ SSH_CLIENT, и $ SSH_CONNECTION не существуют.


0

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


0

Я получаю следующий вывод из who -m --ipsDebian 10:

root pts / 0 4 декабря 06:45 123.123.123.123

Похоже, что новый столбец был добавлен, так {print $5}или " взять 5-й столбец попытки » больше не работают.

Попробуй это:

who -m --ips | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'

Источник:

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.