만약 내가한다면:
at -f <(echo "rm $file") now + 2 hours
좋은 결과
하지만 이렇게 하면:
sudo at -f <(echo "rm $file") now + 2 hours
나는 얻다:
at: /dev/fd/63: No such file or directory
나는 이것이 명령이 처리되는 순서 때문이라고 생각합니다. sudo 명령을 사용하여 이 문제를 해결할 수 있는 방법이 있습니까? 내가 생각할 수 있는 유일한 방법은 명령을 스크립트에 넣고 스크립트를 sudo하는 것입니다(그건 옵션입니다). 그런데 이제 왜 이런 일이 발생하는지 궁금합니다.
이 질문에 대한 답변이 이미 어딘가에 있었다면 죄송합니다. 무엇을 찾아야 할지 모르기 때문에 찾을 수 없습니다.
답변1
쉘은 명령에 대한 파이프를 열고 <(...)
실행되는 하위 프로세스에 파일 핸들을 전달하기 때문입니다( sudo
이 경우). Path /dev/fd/63
는 일반 경로 이름을 통해 이미 열려 있는 파일 핸들에 대한 액세스를 허용하는 커널에서 제공하는 방법입니다.
그러나 sudo
핸들은 보안상의 이유로 실행되는 프로세스에 전달되지 않습니다. 기본적으로 stdin, stdout 및 stderr을 제외한 모든 파일 핸들을 닫으므로 결국 실행하는 프로그램에는 해당 파일이 없으며 /dev/fd/63
핸들이 잘못되었습니다.
sudo 내의 셸을 교체하여 이 문제를 해결할 수 있습니다.
sudo bash -c 'cat <(echo something)'
물론 이는 내부 교체도 높은 권한으로 실행된다는 것을 의미합니다.
$ sudo bash -c 'cat <(id)'
uid=0(root) gid=0(root) groups=0(root)
플래그는 다른 방법을 -C
제공 sudo
하지만 추가 구성을 허용해야 할 수도 있습니다.
-C 번호, --close-from=번호
명령을 실행하기 전에 num보다 크거나 같은 모든 파일 설명자를 닫습니다. 3보다 작은 값은 허용되지 않습니다. 기본적으로 sudo는 명령을 실행할 때 표준 입력, 표준 출력 및 표준 오류를 제외한 모든 열려 있는 파일 설명자를 닫습니다. 보안 정책에 따라 사용자가 이 옵션을 사용하는 기능이 제한될 수 있습니다. sudoers 정책은 관리자가 closefrom_override 옵션을 활성화한 경우 -C 옵션만 허용합니다.
답변2
나는 귀하의 의도가 모든 파일을 루트로 갖는 것이라고 가정합니다 cat
. 현재 ls
?
대신 파이프를 사용하는 것이 xargs
현명할 수 있습니다 . 이것을 사용해 보세요:
ls | xargs sudo cat