셸에서 출력 및 권한 리디렉션

셸에서 출력 및 권한 리디렉션

권한에 관해 질문이 있습니다.

배포판: Debian GNU/Linux 6.0.4(압축)

그래서 PHP 스크립트가 포함된 폴더가 있습니다. 폴더와 파일 모두 User1의 소유입니다.

내가 이렇게 하면:

php script.php

권한 거부 오류가 발생합니다. 충분합니다. 저는 사용자 1이 아니라 사용자 2입니다. 만약 내가한다면

sudo php script.php

내 사용자 계정이 이에 대해 설정되어 있기 때문에 작동합니다.

그래서 저는 "디버그" 모드와 같은 것을 출력하기 위해 선택적 매개변수를 받아들이도록 이 스크립트를 작성했습니다.

sudo php script.php debug

일부 콘텐츠를 CLI에 출력합니다. 여태까지는 그런대로 잘됐다.

하지만 때로는 스크립트의 출력이 너무 길어 위로 스크롤하여 처음부터 출력을 볼 수 없기 때문에 출력을 파일로 리디렉션할 수 있기를 원합니다.

그래서 다음을 시도했습니다.

이로 인해 권한 거부 오류가 발생했습니다.

sudo php script.php debug >> results.txt

이게 효과가 있어

sudo touch results.txt
sudo chown User1 results.txt
sudo chmod 777 results.txt
sudo php script.php debug >> results.txt

또는 이것이 작동합니다

sudo su -
php script.php debug >> results.txt

그래서 제가 알고 싶은 것은... 첫 번째 항목에서 권한 거부 오류가 발생하는 이유는 무엇입니까? sudo 접두어의 요점은 PHP 스크립트를 실행하는 데 작동하는 루트로 명령을 실행한다는 것입니다. 하지만 이것이 리디렉션 수행까지 확장되지 않는 것 같습니다. 누군가 이유를 설명할 수 있나요?

편집하다:

그래서 뭔가를 찾았어여기에 또 다른 게시물이 있습니다이것은 작동합니다:

sudo php script.php debug | sudo tee results.txt

거기에 대한 답변은 리디렉션이 sudo 대신 내 사용자로 계속 실행되고 있다는 의심을 확인시켜 주지만 이유는 설명하지 않습니다. 이유를 설명할 수 있는 사람이 있습니까?

답변1

명령줄에서 작업할 때 셸은 먼저 리디렉션을 수행한 다음 외부 명령을 실행합니다. 이는 사용자 권한을 변경하지 않고 리디렉션이 수행됨을 의미합니다(쉘은 나중에 sudo 실행에 신경 쓰지 않기 때문입니다).

쉽게 실행되는 sudo 명령은 >> results.txt이를 확인하지 않고 /dev/stdout에 대해 변경된 파일 설명자를 가져옵니다.

두 가지 가능성:

  1. 귀하(user2)가 쓸 수 있는 파일/디렉토리로 리디렉션됩니다.
  2. 이를 수행하기 위해 래퍼 스크립트를 작성하고 sudo를 통해 래퍼 스크립트를 호출합니다.

관련 정보