編集1

編集1

私は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を使用すると、パスワードなしでコマンドを期待どおりに実行できますが、欠落しているファイルはアクセスエラーとして表示されません。 grepなしでrawリストを実行すると、sudoが所有するファイルのみが表示されるため、sudoコマンドは機能しないようです。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)のルートが所有するfdディレクトリを表示できません。しかし、rootでsuすると見ることができます。私も次のようにsudoers行を作成してみました。

user ALL=(ALL) NOPASSWD: /usr/bin/ls*

パスワードを入力しなくてもコマンドを実行できますが、返されるデータは同じです。ルート所有ファイルはありません。

なぜこれが起こるのですか? sudoが本当にルートだと思いましたか?

ユーザーに/proc/を介してgrepするための最小限の権限を付与するにはどうすればよいですか?/fd/インデックスノードの場合

ベストアンサー1

問題は、シェルのグロービングがsudo開始前、つまり一般ユーザー権限で発生することです。

あなたは次のようなものが必要です

sudo bash -c 'ls -l /proc/*/fd/*'

編集1

sudoersは次のとおりです。

user ALL=(ALL) NOPASSWD: /usr/bin/bash -c ls -l /proc/\*/fd/\*

おすすめ記事