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
이를 방지하려면(GNU xargs
및 쉘 등을 사용 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
특수 변수에 할당하고 사용자 데이터베이스에 있는 해당 사용자의 uid, gid를 설정합니다 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 {} +'
같은 문제 는 su
없지만.
답변2
당신은 그것을 사용할 수 있습니다 sudo
:
sudo find <directory> -exec sudo -u <normal_user> <command> {} \;
하지만 주석에서 언급했듯이 {}가 sudo에 비해 너무 길면 분명히 실패할 것입니다.