我是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。
谢谢!
答案 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但是为了完整性)lsof
上面你可以看到ssh用户的PID(添加ps列以便于解释)
lsof
$ 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
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
。
在这种情况下我正在检查标准ssh端口22上的SFTP连接(十六进制0016)
Step 2