我试图使以下命令以process_paths脚本不在提升权限下运行的方式工作。有没有办法做到这一点?
sudo find /path/ -exec process_paths '{}' \+
Run Code Online (Sandbox Code Playgroud)
这里/path/有一些文件对普通用户没有读取权限。脚本process_paths只需要路径。
Sté*_*las 16
在支持它的系统(GNU 和很多其他系统)上,您可以执行以下操作:
sudo find /path/ -print0 | xargs -r0 process_paths
Run Code Online (Sandbox Code Playgroud)
xargs不在 下运行sudo,因此它仍然具有原始 uids/gids 以及原始环境(在更大的意义上),而不是由sudo.
process_paths标准输入最终被修改,但(这取决于xargs实施,它的开放/dev/null或股票pipe从sudo/ find。
为避免这种情况(使用 GNUxargs和 shell 之类的ksh,zsh或bash支持进程替换的),您可以执行以下操作:
xargs -r0a <(sudo find /path/ -print0) process_paths
Run Code Online (Sandbox Code Playgroud)
与zsh:
sudo zsh -c '
files=(/path/**/*(D))
USERNAME=$SUDO_USER
autoload zargs
zargs $files -- process_paths'
Run Code Online (Sandbox Code Playgroud)
在 中zsh,将用户名分配给$USERNAME特殊变量,将 uids、gids 设置为用户数据库中相应用户的 uids、gids,就像sudo -u "$SUDO_USER"会做的那样。
你可以这样做:
sudo sh -c '
exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'
Run Code Online (Sandbox Code Playgroud)
但是因为sudo将$SUDO_COMMAND环境变量(包含参数与空格的连接)传递给process_paths,文件列表最终会被传递两次,process_paths这意味着如果有一个大的,可能会达到 args+env 的最大大小的限制文件数。
对于大多数su实现,您应该能够:
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
Run Code Online (Sandbox Code Playgroud)
虽然su没有同样的问题。