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

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

我试图使以下命令以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或共享。pipesudofind

为了避免这种情况(使用 GNUxargs和 shell 等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特殊变量,将 uids、gids 设置为用户数据库中相应用户的 uids、gids,就像这样sudo -u "$SUDO_USER"做一样。

你可以这样做:

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

但是,由于将环境变量(包含参数与空格的串联)sudo传递给,因此文件列表最终会被传递两次,这意味着如果有很大的文件,则可能会达到 args+env 的最大大小限制文件数量。$SUDO_COMMANDprocess_pathsprocess_paths

对于大多数su实现,您应该能够执行以下操作:

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

虽然 assu没有同样的问题。

答案2

您可以使用sudo

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

但正如评论中所述,如果 {} 对于 sudo 来说太长,它显然会失败。

相关内容