sudo 리디렉션 권한이 거부되었습니다.

sudo 리디렉션 권한이 거부되었습니다.

루트가 소유한 "s"라는 파일이 있습니다. sudo를 사용하여 내용을 다른 것으로 바꾸고 싶지만 실패합니다. "sudo ls -l > s" 권한이 거부되었습니다. 그러나 sudo su 이후에 동일한 작업을 수행하면 모든 것이 잘 작동합니다.

내 sudo 명령이 실패하는 이유를 알고 싶습니다. ">" 작업이 아닌 루트 권한으로 ls만 실행된 것 같아서 실패했습니다. 그렇다면 어떻게 sudo를 합니까?

배경: 스크립트에서 이것을 사용하고 싶기 때문에 sudo su를 사용할 수 없습니다.

참고로 제가 시도한 것은 다음과 같습니다.

xropi@xropi-VirtualBox2:~/w$ ls -l
total 4
-rw-r--r-- 1 root root 18 Dec 25 01:33 s

xropi@xropi-VirtualBox2:~/w$ cat s
asdf
sadf
dsf
sdf

xropi@xropi-VirtualBox2:~/w$ sudo ls -l > s
bash: s: Permission denied

하지만 sudo su를 사용하면 모든 것이 잘 작동합니다.

xropi@xropi-VirtualBox2:~/w$ sudo su

root@xropi-VirtualBox2:/home/xropi/w# ls -l > s

root@xropi-VirtualBox2:/home/xropi/w# cat s
total 0
-rw-r--r-- 1 root root 0 Dez 25 01:34 s

root@xropi-VirtualBox2:/home/xropi/w#

답변1

출력 리디렉션은 sudo가 실행하는 프로세스가 아닌 셸에서 평가됩니다. 쉘은 명령을 실행하기 전에 리디렉션(>)과 같은 것을 해석하므로 sudo는 사용자가 파일로 리디렉션하고 있다는 것을 모르고 쉘은 tty 대신 명령의 stdout 파일 핸들을 파일에 추가합니다.

쉘이 귀하의 계정으로 실행 중이므로 귀하의 계정으로 파일을 쓰려고 시도하므로 실패합니다.

파일에 루트로 쓰려면 tee다음 예와 같이 다음과 같은 것을 사용하십시오.

ls -l | sudo tee s

이렇게 하면 리디렉션하는 대신 출력이 명령 ls -l으로 파이프되고 sudo에서 루트로 실행됩니다.tee

쉘 리디렉션을 반드시 사용하려면 다음을 수행해야 합니다.

sudo sh -c ‘ls -l > s’

이는 루트로 쉘을 실행하고 기본적으로 라이너처럼 "sudo su"에서 실행하는 작업을 수행합니다.

관련 정보