在 `sudo find` 命令中,如何确保以普通用户身份运行 `-exec` 命令?

pii*_*_ke 10 su sudo find

我试图使以下命令以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或股票pipesudo/ find

为避免这种情况(使用 GNUxargs和 shell 之类的kshzshbash支持进程替换的),您可以执行以下操作:

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没有同样的问题。