Знайдіть IP-адресу клієнта в сеансі SSH


166

У мене є сценарій, який повинен управляти особою, яка входить на сервер за допомогою SSH .

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

Звичайно, я міг би запитати користувача (це інструмент для програмістів, тому проблем із цим немає), але було б крутіше, якби я щойно дізнався.


5
пропонуємо перейти на сервер за замовчуванням, але все ще велике питання
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
Це було для мене РЕМОТЕХОСТ.
dramzy

5
працює лише з користувачами, які не користуються судом. Наприклад, якщо у вас є ssh-користувач, а потім ескалація до root, створюється нова оболонка, і ці змінні втрачаються, якщо ви не можете простежити через дерево, щоб знайти оригінальний ssh-pid та отримати змінні з / proc / $ PID / оточення
Андрій

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
Це дивовижно :-) Нерд гумор ftw ще раз. Відповідно до pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Кріс Вудс

Чому на моєму виході в розділі "Де" відображається лише назва машини, а не IP-адреса?
isaganiesteron

Ймовірно, у вас налаштований сервер імен у вашій машині.
vncprado

pinky покаже всіх зареєстрованих користувачів, а не лише вас
Andrej

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)
Рош



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
netstat -tapen | grep ssh | awk '{ print $4}'

не працює на CentOS 6.9 (net-tools 1.60 netstat 1.42)(No info could be read for "-p": geteuid()=507 but you should be root.)
Jeff

@Jeff sudo ss -tapen | grep ssh | awk '{ print $4}'|grep -v ':22$'працює?
Рош

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 та екранними сеансами. він буде прослідковуватися через дерево процесу, поки не знайде під із змінною SSH_CLIENT, а потім запише свій IP як $ sshClientIP. якщо він надто заглибиться до дерева, він запише IP-адресу як "localhost" і залишить цикл.


0

Зазвичай є запис у журналі / var / log / messages (або подібний, залежно від вашої ОС), який ви можете виконати з ім'ям користувача.



0

Пошук підключень SSH для облікового запису "myusername";

Візьміть перший рядок результатів;

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

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

netstat -tapen | grep "sshd: myusername" | голова -n1 | awk '{спліт ($ 5, a, ":"); надрукувати [1]} '


Інший спосіб:

хто я | awk '{l = довжина ($ 5) - 2; друк субстр ($ 5, 2, л)} '


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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.