sudo at -f

sudo at -f

만약 내가한다면:

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경로는 /dev/fd/63일반 경로 이름을 통해 이미 열려 있는 파일 핸들에 대한 액세스를 허용하기 위해 커널에서 제공하는 방법입니다.

그러나 보안상의 이유로 실행되는 프로세스에 핸들을 전달하지 않습니다. 기본적으로 stdin, stdout 및 stderr을 제외한 모든 파일 핸들을 닫으므로 결국 실행되는 프로그램에는 및 sudo에 해당하는 파일 핸들이 없습니다. /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

관련 정보