Я пытаюсь узнать исходный IP-адрес текущего сеанса ssh. Мне показалось полезным следующее, но для этого требуется sudo:
$ sudo netstat -tapen | grep ssh | awk '{ print $5}' | sed '/0.0.0.0\|::/d'
192.168.1.1:60119
99.xxx.xxx.xxx:1213
Есть ли способ получить информацию 99.xxx.xxx.xxx без вызова sudo?
( Ответ # 1 Вопрос: Как получается, что конвейерная программа grep возвращает только ошибку?)
Вопрос № 2: Существуют ли обходные пути для получения информации о глобальной сети с помощью netstat? или ...
Вопрос № 3: Есть ли лучшие варианты для моей цели?
Ответьте на 1 и 2:
Предупреждение от netstat
, не от grep
и о PID/Program name
столбец netstat
вывод:
$ netstat -tapen
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
Используя sudo
:
$ sudo netstat -tapen
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
Предупреждение сам объяснительное, необходимо быть root
для просмотра идентификаторов процесса и названий программы, принадлежавших другим (всем) пользователям иначе, Вы только получите PID/имена программ, принадлежавших Вам, хотя Вы получите открытые списки сокетов для тех процессов.
Различию в основном подводит итог следующее, от man netstat
:
PID/Program name
Slash-separated pair of the process id (PID) and process name of
the process that owns the socket. --program causes this column to
be included. You will also need superuser privileges to see this
information on sockets you don't own. This identification information is
not yet available for IPX sockets.
В Вас случай, программа sshd
принадлежит root
, таким образом без использования sudo
вся информация о сокете появится в выводе, не названии программы и PID. В результате при использовании grep
на результате netstat -taepn
Вы получаете предупреждение.
С другой стороны, если Вы используете sudo
, PID/название программы появится в netstat -taepn
вывод и Вы можете использовать grep
найти вывод.
Следующее сделает Вас более ясными (проверьте последний столбец (PID/Название программы)):
$ netstat -tapen
PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 11088 -
$sudo netstat -taepn
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 11088 1002/sshd
При выполнении этого от клиентской машины затем, можно просто проигнорировать ее, как процесс в этом случае будет ssh
(нет sshd
) и будет принадлежать Вам.
Ответьте на 3:
Существует столько путей. Я добавлю некоторых:
$ sudo netstat -taepn | grep "ssh" | tr -s ' ' | cut -d' ' -f4 | head -1
192.168.5.3:22
$ sudo netstat -taepn | grep -Po "\b(\d|\.)+:22(?= .*ssh)"
192.168.5.3:22
$ sudo netstat -taepn | sed -nr '/ssh/s/.* ([^:]+:22) .*/\1/p'
192.168.5.3:22
Править: Без sudo
:
$ netstat -taepn 2>/dev/null | grep ":22 " | tr -s ' ' | cut -d' ' -f4 | head -1
192.168.5.3:22
$ netstat -taepn 2>/dev/null | grep -Po "\b(\d|\.)+:22\b"
192.168.5.3:22
$ netstat -taepn 2>/dev/null | sed -nr '/:22 /s/.* ([^:]+:22) .*/\1/p'
192.168.5.3:22
РЕДАКТИРОВАНИЕ 2:
Если Вы хотите соединить удаленный IP-адрес для портирования 22 (ssh
) из сервера без использования sudo
, Ваше лучшее лучшее должно было бы считать статистику сокета через ss
управляйте и получите желаемый вывод от этого.
$ ss -ant | grep -Po "(\d|\.)+:22\s+\K[^:]+"
192.168.6.4
$ ss -ant | sed -nr 's/.*([0-9]|\.)+:22 +([^:]+).*/\2/p'
192.168.6.4
$ ss -ant | grep -e "ESTAB" | grep ":22" | tr -s ' ' | cut -d' ' -f5 | cut -d':' -f1
192.168.6.4
Мы выполнили вышеупомянутые команды в сервере и 192.168.6.4
IP-адрес удаленного компьютера, подключенного к серверу через ssh
на порте 22.
Строка является bellogs к выводу ошибок, т.е. sterr
. Вы могли избавиться от него с
netstat -tapen 2> /dev/null | grep ssh
Для ссылки проверка, это
, Как правильно отмечено heemayl, без sudo
, netstat не сообщит, что соединение устанавливается ssh сервером, только если это устанавливается ssh клиентом.
, Конечно, можно все еще определить его номером порта или использованием who -a
утилита, которая покажет логины и адрес, но это не гарантия, кто-то не зарегистрирован на пути приложение удаленного рабочего стола или telnet.
Можно использовать SSH_CONNECTION
и SSH_CLIENT
переменные:
$ echo $SSH_CONNECTION
10.0.0.1 42276 10.0.0.2 22
$ echo $SSH_CLIENT
10.0.0.1 42276 22
$ SSH_IP=${SSH_CONNECTION%% *}
$ echo $SSH_IP
10.0.0.1
От man 1 ssh
:
SSH_CONNECTION Identifies the client and server ends of the
connection. The variable contains four space-
separated values: client IP address, client port
number, server IP address, and server port number.
Можно получить доступ к каждой записи в SSH_CONNECTION
более легко, если Вы разделяете его на массив удара:
ssh_details=($SSH_CONNECTION)
Затем можно получить каждую запись с помощью ее индекса:
$ echo $SSH_CONNECTION
127.0.0.1 55719 127.0.0.1 22
$ ssh_details=($SSH_CONNECTION)
$ echo ${ssh_details[0]}
127.0.0.1
$ echo ${ssh_details[1]}
55719
$ printf "You are logging in from host IP %s from port # %d\n" ${ssh_details[0]} ${ssh_details[1]}
You are logging in from host IP 127.0.0.1 from port # 55719
По некоторым причинам, SSH_CLIENT
не документируется в английские страницы справочника.
Перед продолжением читать для чтения ответа SSH_CLIENT (случалось так, что простой Вы знаете) Вы могли также сделать:
pid=$(ps -xh -o pid,cmd | grep [s]shd | awk '{print $1}' | head -1)
cat /proc/$pid/net/tcp | while read a b c d e; do echo $b $c $d; done |
tail -n +2 | grep " 01" | while read a b c; do echo $b; done |
cut -d: -f1 | sed "s/../& /g" | while read d c b a; do
printf "%d.%d.%d.%d\n" 0x$a 0x$b 0x$c 0x$d; done
На самом деле процесс содержит соединения для всех клиентов, не просто Ваше собственное. Это - в основном основной процесс SSHD. Я не знаю, почему это работает при Вашем пользователе.