sudo at -f <(echo "rm $file") 지금 + 2시간 생성: /dev/fd/63: 해당 파일 또는 디렉터리 없음

sudo at -f <(echo "rm $file") 지금 + 2시간 생성: /dev/fd/63: 해당 파일 또는 디렉터리 없음

만약 내가한다면:

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

관련 정보