Ping 是 root 拥有的一个程序,它设置了用户 ID 位。
$ ls -l `which ping`
-rwsr-xr-x 1 root root 35752 Nov 4 2011 /bin/ping
据我了解,如果用户运行 ping 进程,那么有效用户 id 将从真实用户 id(即启动该进程的人的用户 id)更改为用户 id root。但是,当我尝试此操作并查看 ps 的输出以查看 ping 进程是否以 root 用户身份运行时,我仍然显示真实的用户 ID。
ps -e -o user,ruser,euser,cmd,args | grep ping
sashan sashan sashan ping -i 10 -c 1000 www.goog ping -i 10 -c 1000 www.google.com
答案1
ping
需要 root 才能以原始模式打开套接字。这实际上是它启动时所做的第一件事:
icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
socket_errno = errno;
这是它唯一需要root权限的事情,所以像许多程序一样,它会立即将其权限级别降回到您的普通用户帐户:
uid = getuid();
if (setuid(uid)) {
perror("ping: setuid");
exit(-1);
}