`sudo find`コマンドで、` -exec`コマンドが通常のユーザーとして実行されていることを確認するにはどうすればよいですか?


10

process_pathsスクリプトが昇格された特権で実行されないように、次のコマンドを機能させようとしています。これを行う方法はありますか?

sudo find /path/ -exec process_paths '{}' \+

ここに/path/は、通常のユーザーに読み取り権限のないファイルがいくつかあります。スクリプトprocess_pathsにはパスが必要です。


... -exec sudo -u user process_paths {} \+
桂佐藤

@SatoKatsuraは時々これが失敗しsudo: unable to execute /usr/bin/perl: Argument list too longます:/
pii_ke

1
はい、SUDO_COMMAND変数に関する注記をfind
ステファンChazelas

2
あなたがしたい場合-execのコマンドは、ユーザーとして呼び出されるように、なぜあなたが実行しているfind使用してsudo最初の場所で?
マルセルム2017

2
@marcelm質問の最後の文があなたの答えになると思います。
2017

回答:


16

それをサポートするシステム(GNUおよび他のかなりの数)では、次のことができます。

sudo find /path/ -print0 | xargs -r0 process_paths

xargssudoはで実行されないため、元のuid / gidsと元の環境(より広い意味で)があり、によって変更された環境ではありませんsudo

process_pathsstdinは最終的には変更されます(xargs実装によっては/dev/nullpipefrom sudo/で開いているか共有しfindます。

これを回避するには(GNU xargsおよびのようなシェルkshzshまたはbashプロセス置換をサポートするシェルを使用)、次のようにします。

xargs -r0a <(sudo find /path/ -print0) process_paths

zsh

sudo zsh -c '
   files=(/path/**/*(D))
   USERNAME=$SUDO_USER
   autoload zargs
   zargs $files -- process_paths'

ではzsh$USERNAME特別な変数にユーザー名を割り当てると、uidとgidが、ユーザーデータベースの対応するユーザーのuidに設定されsudo -u "$SUDO_USER"ます。

あなたがすることができます:

 sudo sh -c '
   exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'

ただしsudo$SUDO_COMMAND環境変数(引数とスペースの連結を含む)をprocess_pathsに渡すため、ファイルのリストが2回渡さprocess_pathsれることになり、大きな場合はargs + envの最大サイズの制限に達する可能性が高くなります。ファイルの数。

ほとんどのsu実装では、次のことができるはずです。

 sudo sh -c '
   exec find /path/ -exec su "$SUDO_USER" -c '\''
     exec "$0" "$@"'\'' process_paths {} +'

あたかもsu同じ問題を持っていません。


1

使用できますsudo

sudo find <directory> -exec sudo -u <normal_user> <command> {} \;

しかし、コメントで述べたように、{}がsudoに対して長すぎると、明らかに失敗する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.