Найти IP-адрес клиента в сеансе SSH
У меня есть скрипт, который должен выполняться человеком, который подключается к серверу с SSH.
есть ли способ автоматически узнать, с какого IP-адреса пользователь подключается?
конечно, я мог бы спросить пользователя (это инструмент для программистов, поэтому нет проблем с этим), но было бы круче, если бы я просто узнал.
19 ответов
проверьте, есть ли переменная среды с именем:
$SSH_CLIENT
или
$SSH_CONNECTION
(или любые другие переменные окружения), который устанавливается при входе пользователя в систему. Затем обработайте его с помощью сценария входа пользователя.
извлечь IP:
$ echo $SSH_CLIENT | awk '{ print }'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print }'
1.2.3.4
вы можете использовать команду:
server:~# pinky
это даст вам что-то вроде этого:
Login Name TTY Idle When Where
root root pts/0 2009-06-15 13:41 192.168.1.133
who am i | awk '{print }' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'
export DISPLAY=`who am i | awk '{print }' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'`:0.0
Я использую это, чтобы определить мою переменную отображения для сеанса при входе в систему через ssh и нужно отобразить удаленный X.
улучшение предыдущего ответа. Дает IP-адрес вместо имени хоста. -- ips не доступен в OS X.
who am i --ips|awk '{print }' #ubuntu 14
более универсальный, измените $5 на $6 для OS X 10.11:
WORKSTATION=`who -m|awk '{print }'|sed 's/[()]//g'`
WORKSTATION_IP=`dig +short $WORKSTATION`
if [[ -z "$WORKSTATION_IP" ]]; then WORKSTATION_IP="$WORKSTATION"; fi
echo $WORKSTATION_IP
netstat -tapen | grep ssh | awk '{ print }'
выход:
два # в моем эксперименте
netstat -tapen | grep ssh | awk '{ print }'
дает IP-адрес.
выход:
127.0.0.1:22 # in my experiment
но результаты смешиваются с другими пользователями и прочее. Нужно еще поработать.
вы можете получить его программным способом через библиотеку 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;
}
netstat будет работать (вверху что-то вроде этого) tcp 0 0 10.X. xx.xx: ssh someipaddress.или.domainame: 9379 установлено
Linux: кто я / awk ' {print $5}' | sed 's / [()] / / g'
AIX: кто я / awk ' {print $6}' / sed 's / [()] / / g'
Поиск SSH-соединений для учетной записи "myusername";
взять первую строку;
взять 5-ю колонну;
разделить на": "и вернуть 1-ю часть (номер порта не нужен, мы хотим только IP):
netstat-tapen / grep "sshd: myusername" | head-n1 / awk '{split($5, a,":"); print a[1]}'
иначе:
кто я / awk ' {l = length ($5) - 2; print substr ($5, 2, l)}'
обычно есть запись журнала в /var/log / messages (или аналогичная, в зависимости от вашей ОС), которую вы можете grep с именем пользователя.
предполагая, что он открывает интерактивный сеанс (то есть выделяет псевдо терминал) и у вас есть доступ к stdin, вы можете вызов ioctl на этом устройстве чтобы получить номер устройства (/dev/pts/4711) и попытаться найти его в в/var/выполнить/через utmp (где также будет имя пользователя и IP-адрес, из которого возникло соединение).
более старый поток с большим количеством ответов, но ни один из них не совсем то, что я искал, поэтому я вкладываю свой:
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 }')
[ "$sshpid" = "0" ] && sshClientIP="localhost" && sshloop=1
fi
done
этот метод совместим с прямым ssh, пользователями sudoed и сеансами экрана. он будет проходить через дерево процессов, пока не найдет pid с переменной SSH_CLIENT, а затем запишет свой IP как $sshClientIP. если он заберется слишком далеко вверх по дереву, он запишет IP как "localhost" и покинет цикл.
простейшие команды, чтобы получить последние 10 пользователей вошли в Машина
last|head
.чтобы получить все пользователи просто использовать
last
команда
один большой палец вверх для ответа @Nikhil Katre:
простейшую команду для получения последних 10 пользователей, зарегистрированных в машину
last|head
.чтобы получить все пользователи просто использовать
last
команда
С помощью who
или pinky
сделал то, что в основном спрашивают. Но они не дают исторической информации.
что может быть интересно, если вы хотите знать, кто только что вошел в систему и выходить из системы уже когда вы начинаете эту проверку.
если это многопользовательская система. Я рекомендую добавить учетную запись пользователя, которую вы ищете:
last | grep $USER | head
EDIT:
в моем случае как $SSH_CLIENT, так и $SSH_CONNECTION не существуют.
попробуйте следующее, Чтобы получить только IP-адрес через SSH:
Command: ifconfig
пример:
stalinrajindian@ubuntuserver:~$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.30.3.27 netmask 255.255.255.0 broadcast 172.30.3.255
inet6 fe80::a00:27ff:fe8b:9986 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:8b:99:86 txqueuelen 1000 (Ethernet)
RX packets 4876 bytes 1951791 (1.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 775 bytes 73783 (73.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 78 bytes 5618 (5.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 78 bytes 5618 (5.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0