process_paths
スクリプトが昇格された権限で実行されないように、次のコマンドが機能するようにします。これを行う方法はありますか?
sudo find /path/ -exec process_paths '{}' \+
これには、/path/
一般ユーザーに読み取り権限がないファイルがあります。スクリプトにはprocess_paths
パスのみが必要です。
答え1
これをサポートするシステム(GNUや他の多くのシステム)では、次のことができます。
sudo find /path/ -print0 | xargs -r0 process_paths
xargs
で実行されないため、sudo
変更された環境ではなく、元のuids / gidsと元の環境(より大きな意味)をそのままにしてくださいsudo
。
process_paths
xargs
ただし、標準入力は最終的に変更されます(実装に応じて開かれ、/dev/null
共有されます)。pipe
sudo
find
これを回避するには(GNUxargs
やシェルなどを使用するksh
か、プロセスの交換をサポートzsh
する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を設定しますsudo -u "$SUDO_USER"
。
次のことができます。
sudo sh -c '
exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'
ただし、環境変数(スペースで連結された引数を含む)を渡すため、ファイルのリストはsudo
2回渡されます。つまり、ファイルが非常に大きい場合、最大サイズ制限であるargs + envに達する可能性があります。$SUDO_COMMAND
process_paths
process_paths
ほとんどの実装では、su
次のことができるはずです。
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
同じ問題はsu
ありませんが。
答え2
あなたはそれを使用することができますsudo
:
sudo find <directory> -exec sudo -u <normal_user> <command> {} \;
しかし、コメントで述べたように、{}がsudoに比べて長すぎると明らかに失敗します。