为什么使用 sudo 生成的文件不属于 root?

为什么使用 sudo 生成的文件不属于 root?

我在终端中运行以下命令。

sudo tcpdump -c 2 -w /tmp/z.pcap icmp

然后在终端中运行以下命令。

ping 8.8.8.8

生成的文件属于用户 tcpdump,而不是 root。

$ stat /tmp/z.pcap 
  File: /tmp/z.pcap
  Size: 158             Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 4068722     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  115/ tcpdump)   Gid: (  120/ tcpdump)
Access: 2021-02-25 10:05:52.910772287 -0500
Modify: 2021-02-25 10:06:00.102859691 -0500
Change: 2021-02-25 10:06:00.102859691 -0500
 Birth: 2021-02-25 10:05:52.910772287 -0500

命令 tcpdump 属于 root。为什么生成的文件不属于 root?

$ ls -l $(which tcpdump)
-rwxr-xr-x 1 root root 1261512 2021/01/15-17:41:47 /usr/bin/tcpdump

答案1

请参阅man tcpdump。一般来说,如果没有必要,最好不要以 root 身份运行,因此开发人员补充道:

  -Z user
  --relinquish-privileges=user
         If  tcpdump is running as root, after opening the capture device
         or input savefile, change the user ID to user and the  group  ID
         to the primary group of user.

         This  behavior  is  enabled  by default (-Z tcpdump), and can be
         disabled by -Z root.

换句话说:tcpdump 一旦生成,就不需要保留 root 权限,因此它会放弃这些权限。

答案2

因为tcpdumpwill 将产生一个由 拥有的子进程tcpdump

$ ps auf | grep [t]cpdump
root       47749  0.0  0.0  16432  7264 pts/1    S+   16:16   0:00  \_ sudo tcpdump -c 2 -w /tmp/z.pcap icmp
tcpdump    47750  0.0  0.0  11084  6252 pts/1    S+   16:16   0:00      \_ tcpdump -c 2 -w /tmp/z.pcap icmp

它会放弃权限,因为它不再需要它。使用-Z选项来更改该行为。请参阅这个答案了解详情。

相关内容