我正在做这个
$ strace -f ping -s 1 www.google.com
execve("/bin/ping", ["ping", "-s", "1", "www.google.com"],
[/* 80 vars */]) = 0
getuid() = 1001
setuid(1001) = 0
getuid() = 1001
geteuid() = 1001
capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
capget({_LINUX_CAPABILITY_VERSION_3, 0}, {0, 0, 0}) = 0
socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = -1 EPERM (Operation not permitted)
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(1025),
sin_addr=inet_addr("74.125.28.105")}, 16) = 0
write(3, "ping: icmp open socket: Operatio"..., 48
ping: icmp open socket: Operation not permitted) = 48
close(3) = 0
exit_group(2) = ?
+++ exited with 2 +++
我已经排除了很多多余的行,但问题的关键是它返回退出代码 2。
如果我执行 ping 而不进行 stracing,我会收到退出代码 0。
运行 strace 时我是否缺少一些选项?
答案1
这是一个有效的问题,它不是命令的重复strace sudo
。过去曾经/bin/ping
是setuid
可执行文件,因此在过去的某个时间点,它可能是重复的,但今天它不是重复的。
sudo
是setuid
可执行文件。 ping
使用cap_net_raw
。因此,我相信答案是strace
也需要授予cap_net_raw
:
setcap cap_net_raw+p /usr/bin/strace
这对我有用。
或者...也许setuid
/cap_net_raw
情况是发行版的功能。我正在使用 RHEL 7。