![编辑1](https://linux22.com/image/221899/%E7%BC%96%E8%BE%911.png)
我使用的是 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/进行grep/fd/对于一个索引节点?
答案1
问题是 shell 通配发生在sudo
启动之前,即使用常规用户权限。
你需要类似的东西
sudo bash -c 'ls -l /proc/*/fd/*'
编辑1
该sudoers
行将是这样的:
user ALL=(ALL) NOPASSWD: /usr/bin/bash -c ls -l /proc/\*/fd/\*