我试图使以下命令以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
和 shell 等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
特殊变量,将 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_COMMAND
process_paths
process_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 来说太长,它显然会失败。