我试图使以下命令以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
没有同样的问题。