Нахождение IP из PID - PullRequest
       44

Нахождение IP из PID

0 голосов
/ 17 ноября 2011

Я новичок в программировании оболочки, и я хотел бы узнать IP-адрес по идентификатору процесса.Прямо сейчас я могу получить PID для определенного процесса из:

vmname=$1
pid=`ps aux | grep $vmname | awk 'NR==1{printf("%s\n", $2) }'`
echo $pid

Приведенный выше метод возвращает PID, но как мне получить порт из pid?Если я получу порт, есть ли команда для получения IP-адреса?Я использую Ubuntu 11.04, и вышеприведенный скрипт на самом деле пытается определить IP виртуальной машины, работающей на KVM, используя этот метод.

Спасибо!

Ответы [ 3 ]

1 голос
/ 27 ноября 2011

Вы можете использовать утилиту lsof . Это дает список открытых файлов для процесса. Используйте lsof -p pid . Вам нужно выполнить grep на выходе, чтобы получить значения портов, например. как то так - lsof -p pid | grep TCP . Это перечислит все порты, открытые или подключенные процессом. Обратитесь к руководству утилиты. Для большинства систем утилита поставляется в комплекте с вашей ОС. Однако, если он не входит в комплект, вам необходимо установить эту утилиту.

1 голос
/ 17 ноября 2011

PID и IP-адрес компьютера - это две совершенно не связанные вещи.

PID обозначает идентификатор процесса, и, кроме всего прочего, это дескриптор ОС для отслеживания вашей программы.

IP-адрес связан с сетевым интерфейсом.У большинства компьютеров есть один или два из них (в случае карты Ethernet / беспроводного устройства.)

В любом случае, один из способов получить IP-адрес вашего компьютера - это что-то похожее на следующее ... Есть, возможно, лучшеспособы сделать это, и я просто не знаю их ...

$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 60:eb:69:96:da:87  
          inet addr:192.168.1.112  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::62eb:69ff:fe96:da87/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:876533 errors:0 dropped:0 overruns:0 frame:0
          TX packets:560999 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:229205080 (229.2 MB)  TX bytes:136756800 (136.7 MB)
          Interrupt:40 Base address:0x8000 

$ ifconfig eth0 | grep "inet addr"
          inet addr:192.168.1.112  Bcast:192.168.1.255  Mask:255.255.255.0
$ ifconfig eth0 | grep "inet addr" | cut -d ":" -f 2
192.168.1.112  Bcast
$ ifconfig eth0 | grep "inet addr" | cut -d ":" -f 2 | cut -d " " -f 1
192.168.1.112

Так что последняя команда получит то, что вы хотите внутри вашего скрипта.Остальные просто покажут вам, как я собрал команду до последней команды.

0 голосов
/ 07 июля 2015

Перед тем, как начать, следует использовать lsof в соответствии с предложением @Drona, если lsof и если доступ root / su / sudo доступен.

Для полноты картины я исследовал это для получения IP-адреса в настоящее время зарегистрированных пользователей SFTP в chroot для сценария nagios, для которого я не хотел создавать правило sudoers.

Простой способ (не такой простой, как lsof и требует root, но для полноты)

Шаг 1

$ ps -ef | grep ssh
UID        PID  PPID  C STIME TTY          TIME CMD
root      2479 14186  0 17:05 ?        00:00:00 sshd: sftpuser [priv]
1008      2481  2479  0 17:06 ?        00:00:00 sshd: sftpuser@notty
1008      2482  2481  0 17:06 ?        00:00:00 sshd: sftpuser@internal-sftp
root      2483 14186  0 17:06 ?        00:00:00 sshd: ttyuser [priv]
ttyuser  2485  2483  0 17:06 ?        00:00:00 sshd: ttyuser@pts/0

Вы можете увидеть PID для пользователей ssh ​​(добавлены столбцы ps для упрощения интерпретации)

Шаг 2

sudo lsof -p 2481 | grep TCP
sshd    2481 root    3u  IPv4           29176657      0t0      TCP 192.168.1.2:44156 (ESTABLISHED)

Альтернатива (у более сложных есть возможность не нуждаться в руде)

Шаг 2. Требуется root-доступ, но не обязательно

$ sudo ls -l  /proc/2481/fd
total 0
lrwx------ 1 root root 64 Jul  3 17:07 0 -> /dev/null
lrwx------ 1 root root 64 Jul  3 17:07 1 -> /dev/null
lr-x------ 1 root root 64 Jul  3 17:07 11 -> pipe:[29209918]
lrwx------ 1 root root 64 Jul  3 17:07 2 -> /dev/null
lrwx------ 1 root root 64 Jul  3 17:07 3 -> socket:[29209894]
lrwx------ 1 root root 64 Jul  3 17:07 5 -> socket:[29211080]
lr-x------ 1 root root 64 Jul  3 17:07 6 -> pipe:[29209915]
l-wx------ 1 root root 64 Jul  3 17:07 7 -> pipe:[29209915]
l-wx------ 1 root root 64 Jul  3 17:07 8 -> pipe:[29209916]
lr-x------ 1 root root 64 Jul  3 17:07 9 -> pipe:[29209917]

Шаг 3

$ fgrep 29209894 /proc/2481/net/tcp 
   8: 0101A8C0:0016 0201A8C0:B0B0 ...

здесь fgrep использует номер на носке и PID для извлечения информации.

Важная информация: 0101A8C0:0016 и 0201A8C0:B0B0. Первый относится к серверу, а второй - к подключенному клиенту, где первая часть (разделенная двоеточием) представляет собой шестнадцатеричное представление обратного IP-адреса, а вторая - шестнадцатеричное представление порта. т.е. 0101A8C0 -> 1.1.168.192 -> 192.168.1.1. Если вы знаете порт, который прослушивает сервер, вы можете пропустить Step 2 и использовать следующее вместо Step 3.

Шаг 2 + 3 Замена при знании порта сервера - если рут недоступен

в этом случае, когда я проверял соединения SFTP через стандартный ssh-порт 22 (в шестнадцатеричном формате 0016)

$ fgrep 0016 /proc/2481/net/tcp 
   8: 0101A8C0:0016 0201A8C0:B0B0 ...
...