2009-06-15 4 views
118

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

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

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

+2

предлагают движущуюся к Serverfault, еще большой вопрос, хотя – BozoJoe

ответ

191

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

$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 
+0

@cwd я хочу, чтобы заменить IP в этой команде «Iptables -A -s ВХОД 93.203.118.251 - p tcp -destination-port 443 -j DROP "это возможно? – wutzebaer

+2

Это был REMOTEHOST для меня. – dramzy

+3

работает только с пользователями без права голоса. например если у вас есть пользователь ssh, а затем эскалация в root, создается новая оболочка, и эти переменные теряются, если вы не можете проследить назад дерево, чтобы найти исходный ssh ​​pid и получить переменные из/proc/$ PID/environ – Andrej

0

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

0

Предполагая, что он открывает интерактивный сеанс (то есть выделяет pseudo terminal) и у вас есть доступ к стандартному вводу, вы можете call an ioctl on that device получить номер устройства (/ Dev/PTS/4711) и попытайтесь найти его в /var/run/utmp (где также будет имя пользователя и IP-адрес, из которого возникло соединение).

83

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

server:~# pinky 

, который даст вам somehting как это:

Login  Name     TTY Idle When     Where 

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

Это потрясающе :-) Верный юмор ftw еще раз. В соответствии с 'pinky --help':' Легкая 'палец' программа; распечатать информацию о пользователе. Файл utmp будет/var/run/utmp.' –

+0

Почему мой« Где »на моем выходе показывает только имя машины, а не адрес ip? – isaganiesteron

+0

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

1

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

+0

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

+0

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

27

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

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

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

+13

'who am i'! =' whoami' на моем Linux как минимум. Существует пятая вещь, и это имя хоста клиента. – kbulgrien

+4

Для кого-то другого, интересующегося 'who am i': man-страница для' who' говорит: 'Если ARG1 ARG2 указан, -m предположительно: 'am i' или 'mom likes' являются обычными .'. Так что действительно что-либо с двумя словами работает, а также такие вещи, как 'кто любит icecream'. – jmiserez

0

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

AIX: кто я | awk '{print $ 6}' | СЕПГ 's/[()] // г'

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

Выход:

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

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

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

Выход:

127.0.0.1:22 # in my experiment 

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

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.

+0

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

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

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

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

Возьмите 5-ю колонку;

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

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


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

кто я такой | awk '{l = length ($ 5) - 2; печать зиЬзЬг ($ 5, 2, л)}»

13

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

who 
3

Улучшение от предварительного ответа. Дает 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 
0

старая нить с большим количеством ответов, но ни один не совсем то, что я искал, так что я вклад шахты:

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

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

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

Смежные вопросы