`sudo find` 명령에서`-exec` 명령이 일반 사용자로 실행되도록하려면 어떻게해야합니까?


10

process_paths스크립트가 높은 권한으로 실행되지 않는 방식으로 다음 명령을 작동 시키려고합니다 . 이것을 할 수있는 방법이 있습니까?

sudo find /path/ -exec process_paths '{}' \+

여기 /path/에는 일반 사용자에 대한 읽기 권한이없는 파일이 있습니다. 스크립트 process_paths는 경로 만 있으면됩니다.


... -exec sudo -u user process_paths {} \+
Satō Katsura

@SatoKatsura 때때로 실패합니다 sudo: unable to execute /usr/bin/perl: Argument list too long: /
pii_ke

1
예, findSUDO_COMMAND변수에 대한 참고 사항을 참조하십시오 . . [^.] *-타입 f -print0 | xargs -0 sudo chmod 664; 작동하지 않음
Stéphane Chazelas

2
당신이 원하는 경우 -exec명령은 사용자로 호출 할, 당신은 왜 실행 find하여 sudo첫 번째 장소에서?
marcelm

2
@marcelm 나는 질문의 마지막 문장이 당신의 대답이라고 생각합니다.
Hey

답변:


16

이를 지원하는 시스템 (GNU 및 기타 몇 가지)에서 다음을 수행 할 수 있습니다.

sudo find /path/ -print0 | xargs -r0 process_paths

xargs에서 실행되지 않으므로 sudo원래 uid / gid와 원래 환경 (더 큰 의미에서)으로 변경되지 않습니다 sudo.

process_pathsstdin은 결국 수정됩니다 ( xargs구현 에 따라 from / 에서 열거 /dev/null나 공유합니다 .pipesudofind

그 (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통과 $SUDO_COMMAND에 (공백 인수의 연결을 포함하는) 환경 변수를 process_paths두 번 전달되는 최대 파일 끝의 목록에 process_paths있는 인수의 최대 크기에 대한 제한을 의미 큰이 있다면 + ENV 가능성에 도달 할 수있다 파일 수

대부분의 su구현으로 다음을 수행 할 수 있어야합니다.

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

그러나 su같은 문제가 없습니다.


1

당신은 사용할 수 있습니다 sudo:

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

그러나 의견에서 말했듯이 {}가 sudo에 비해 너무 길면 분명히 실패 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.