Найти 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