我使用的是 Debian 12,我正在尝试编写一个脚本来识别具有某些 inode 的进程(来自 /proc/net/raw 和 /proc/net/packet)。
我原来的 grep 命令是这样的(只获取 pid 本身):
inode=$(cat /proc/net/packet | sed -r 's/\s+/,/g' | cut -d"," -f9 | sed '1d')
sudo ls -l /proc/*/fd/* 2>/dev/null | grep -oP "(?<=proc\/)[0-9]+(?=\/fd.*\[$inode\])"
我使用了一个更简单的例子,如下所示
将运行该脚本的用户不是 root,但需要能够读取 /proc 中唯一的 root 可访问文件。为此,我选择在 sudoers 中使用 nopasswd 行,专门将 ls 命令放入特定的 /proc 目录(而不是对整个脚本使用 sudo)。
user ALL=(ALL) NOPASSWD: /usr/bin/ls -l /proc/*/fd/*
Sudo 允许命令按预期在没有密码的情况下运行,但丢失的文件甚至不会显示为访问错误。似乎 sudo 命令甚至不起作用,因为在没有 grep 的情况下进行原始列表仅显示以下拥有的文件user
来自用户的 Sudo
user@localhost:~/# sudo /usr/bin/ls -l /proc/*/fd/* | grep "946"
lr-x------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/17 -> pipe:[89462]
l-wx------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/18 -> pipe:[89462]
lr-x------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/19 -> pipe:[89463]
l-wx------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/20 -> pipe:[89463]
lr-x------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/44 -> pipe:[89464]
l-wx------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/45 -> pipe:[89464]
lrwx------ 1 user user 64 Jun 30 12:14 /proc/1424/fd/12 -> socket:[24946]
lr-x------ 1 user user 64 Jun 30 07:53 /proc/2958/fd/44 -> pipe:[32946]
l-wx------ 1 user user 64 Jun 30 07:53 /proc/2958/fd/45 -> pipe:[32946]
苏入根
root@localhost:~/# sudo /usr/bin/ls -l /proc/*/fd/* | grep "946"
lr-x------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/17 -> pipe:[89462]
l-wx------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/18 -> pipe:[89462]
lr-x------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/19 -> pipe:[89463]
l-wx------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/20 -> pipe:[89463]
lr-x------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/44 -> pipe:[89464]
l-wx------ 1 user user 64 Jun 30 11:39 /proc/10251/fd/45 -> pipe:[89464]
lrwx------ 1 root root 64 Jun 30 12:14 /proc/1191/fd/22 -> socket:[946]
lrwx------ 1 user user 64 Jun 30 12:14 /proc/1424/fd/12 -> socket:[24946]
lr-x------ 1 user user 64 Jun 30 07:53 /proc/2958/fd/44 -> pipe:[32946]
l-wx------ 1 user user 64 Jun 30 07:53 /proc/2958/fd/45 -> pipe:[32946]
Sudo 无法看到 PID 1191 (NetworkManager) 的 root 拥有的 fd 目录。但如果我su到root,我就可以看到它。我什至尝试像这样制作 sudoers 行:
user ALL=(ALL) NOPASSWD: /usr/bin/ls*
虽然该命令无需输入密码即可运行,但返回数据是相同的 - 没有 root 拥有的文件。
为什么会发生这种情况?我以为sudo实际上是root?
如何向用户授予最少的权限,以便能够通过 /proc/ /fd/查找inode?
问题是 shell 通配发生在
sudo
启动之前,即使用常规用户权限。你需要类似的东西
编辑1
该
sudoers
行将是这样的: