从PID中查找IP

时间:2011-11-17 13:03:26

标签: shell ip ubuntu-11.04 pid

我是shell编程的新手,我想从进程ID中找到IP地址。现在,我可以从以下位置获取特定进程的PID:

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

上述方法返回PID,但如何从pid获取端口?如果我得到端口,是否有命令获取IP地址? 我正在使用Ubuntu 11.04,上面的脚本实际上是试图找出使用这种方法在KVM上运行的虚拟机的IP。

谢谢!

3 个答案:

答案 0 :(得分:1)

PID和计算机的IP地址是两个完全不相关的东西。

PID代表进程ID,它是操作系统跟踪程序的一个句柄,等等。

IP地址与网络接口有关。大多数计算机都有一个或两个(在以太网卡/无线设备的情况下。)

无论如何,获取计算机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

所以最后一个命令会在你的脚本中找到你想要的东西。剩下的就是向你展示我如何构建到最后一个命令。

答案 1 :(得分:1)

您可以使用 lsof 实用程序。它给出了进程的打开文件列表。使用 lsof -p pid 。您需要在输出上grep以获取例如的端口值。像这样的东西 - lsof -p pid | grep TCP 。这将列出该进程打开或连接的所有端口。请参阅该实用程序的手册。对于大多数系统,该实用程序预先捆绑了您的操作系统。但是,如果它未预先捆绑,则需要安装此实用程序。

答案 2 :(得分:0)

在我开始之前{@ 1}}应该按@Drona的建议使用$key并且root / su / sudo访问权限可用。

为了完整性,我正在研究这个问题,以获取当前登录的chrooted SFTP用户的IP地址,以获取我不想为其创建sudoers规则的nagios脚本。

简单方法(不像lsof那么容易,需要root但是为了完整性)

第1步

lsof

上面你可以看到ssh用户的PID(添加ps列以便于解释)

第2步

lsof

替代方案(更复杂有可能不需要工作)

第2步 - 需要root访问权限,但是可选

$ 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

第3步

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

这里fgrep使用socked上的数字和PID来提取信息。

重要信息为$ 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] $ fgrep 29209894 /proc/2481/net/tcp 8: 0101A8C0:0016 0201A8C0:B0B0 ... 。第一个与服务器有关,第二个是连接的客户端,其中第一部分(由冒号分割)是反向IP地址的十六进制表示,第二部分是端口的十六进制表示。即 0101A8C0:0016。如果您知道服务器正在侦听的端口,则可以跳过0201A8C0:B0B0并使用以下内容代替0101A8C0 -> 1.1.168.192 -> 192.168.1.1

步骤2 + 3了解服务器端口时的替换 - 如果没有可用的根

在这种情况下我正在检查标准ssh端口22上的SFTP连接(十六进制0016)

Step 2