파이프는 sudo를 유지하지만 리디렉션은 유지하지 않는 이유는 무엇입니까? [복사]

파이프는 sudo를 유지하지만 리디렉션은 유지하지 않는 이유는 무엇입니까? [복사]

파이프( |) 및 리디렉션( <, <<, >, >>) 모두 표준 스트림(표준 입력,표준 출력,표준 에러), 파이프만 sudo권한을 유지할 수 있지만 왜 그럴까요?

일하다:

sudo echo "hello" | tee /root/test

작동하지 않습니다:

sudo echo "hello" > /root/test

답변1

파이프(|)와 리디렉션(<, <<, >, >>) 모두 표준 스트림(stdin, stdout, stderr)을 사용하지만 파이프만 sudo 권한을 유지할 수 있는데 왜 그럴까요?

이것은 사실이 아닙니다. 당신은 뭔가를 섞었나 봐요

sudo echo "hello" | tee /root/test

이것은 echo루트로 실행 중이지만 tee루트 사용자가 아닌 현재 사용자로 실행 중입니다.

이것이 변화를 가져올 것이다

echo "hello" | sudo tee /root/test

여기서 tee프로그램은 루트로 실행되므로 /root/test 파일에 액세스할 수 있습니다.

답변2

리디렉션( ><) 및 파이프라인( |등)은 상위 프로세스에 의해 초기화됩니다.앞으로모든 명령이 실행됩니다.

예를 들어 상위 프로세스가 무언가를 실행하기로 결정하면 sudo ls /root | grep test두 개의 프로세스를 생성하고 표준 I/O 스트림을 적절하게 설정합니다( STDIN, STDOUT, STDERR).

튜닝될 프로세스에 대해서는 실행될 프로세스 에 연결 sudo됩니다 .STDOUTSTDINgrep

이것이 설정되면(상위 프로세스의 를 사용하여 UID:GID) sudogrep바이너리가 해당 프로세스에 로드되어 실행됩니다.

프로그램은 단순히 읽고 STDIN쓰고 STDOUT오류를 보낼 수 있으며 STDERR"파이프"는 상위 프로세스에 남겨집니다.

이는 Unix/Linux의 주요 설계 기능입니다. 나는 임시 저장소를 통해 모든 프로그램 간 연결을 지정할 수 있는 작업 제어 언어를 사용하여 시스템을 프로그래밍했습니다. 아.

관련 정보