Получить текущий IP-адрес ssh-сессии, не являясь суперпользователем

Я пытаюсь выяснить текущий 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?

[d2 ] (Answered! Question # 1: Как это, что piping для grep возвращает только ошибку?)

Вопрос № 2: Есть ли способы обхода WAN-информации с netstat? или ...

Вопрос № 3: Есть ли лучшие варианты для моей цели?

1
задан 14 April 2015 в 14:15

3 ответа

Вы можете использовать переменные 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 более легко, если вы разделите его на массив bash:

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 не задокументировано в английских manpages.

12
ответ дан 23 May 2018 в 21:25
  • 1
    Могу ли я попросить немного вашего времени объяснить мне, как я могу напечатать You are logging in from host IP 111.111.111.111 from port # 49999 из результатов echo $SSH_CONNECTION ...? – Tfb9 11 May 2015 в 00:34
  • 2
    @ Tfb9 см. Обновление. – muru 11 May 2015 в 00:46
  • 3
    Это здорово - я ожидал иметь дело с какой-то командой sed, и теперь я узнал о новом способе создания массивов, а также о каком-то другом групповом меканизме, который мне теперь придется изучить. Спасибо, действительно! – Tfb9 11 May 2015 в 00:52
  • 4
    Если возможно, комментарий к вашему обновлению / пример. Я не думаю, что есть способ, которым echo ${ssh_details[0]} отвечает дословно, в частности, 127.0.0.1 ... Я получаю пустую строку из локального терминала. – Tfb9 11 May 2015 в 01:28
  • 5
    @ Tfb9 может быть или не быть 127.0.0.1. Мой пример был из ssh localhost. Очевидно, ваше собственное, может быть, что-то еще. – muru 11 May 2015 в 02:03

Линия является сигналом для выхода ошибки, т. е. sterr. Вы можете избавиться от него с помощью

netstat -tapen 2> /dev/null | grep ssh

Для справки проверьте это

Как правильно отмечено heemayl, без [ f3], netstat не сообщит, что соединение установлено сервером ssh, только если оно установлено ssh-клиентом.

Конечно, вы все равно можете определить его по номеру порта или с помощью утилиты who -a, которая будет отображать логины и адрес, но это не гарантия, что кто-то не зашел в систему через telnet или приложение удаленного рабочего стола.

0
ответ дан 23 May 2018 в 21:25
  • 1
    Обратите внимание, что вывод не имеет ничего общего с grep – Sergiy Kolodyazhnyy 14 April 2015 в 02:33
  • 2
    Это неверно. Без sudo имя программы sshd не будет напечатано. – heemayl 14 April 2015 в 02:41
  • 3
    @heemayl посмотри на мой снимок экрана. У меня открыто соединение ssh. cat / etc / shadow доказывает, что в тот момент у меня нет работы sudo, на следующей строке у меня есть netstat -tapen 2> /dev/null | grep ssh, и он показывает. Так . , , Я думаю, это работает, не так ли? – Sergiy Kolodyazhnyy 14 April 2015 в 02:45
  • 4
    Это ваш ssh-клиент, а не демон ssh .. – heemayl 14 April 2015 в 02:47
  • 5
    Вздох. , , правда что. Хорошо, я отредактирую свой ответ. , , Пользователь все еще может видеть его по номеру порта, правда? – Sergiy Kolodyazhnyy 14 April 2015 в 05:03

Прежде чем читать, чтобы прочитать ответ 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. Я не знаю, почему он работает под вашим пользователем.

0
ответ дан 23 May 2018 в 21:25

Другие вопросы по тегам:

Похожие вопросы: