파이프( |
) 및 리디렉션( <
, <<
, >
, >>
) 모두 표준 스트림(표준 입력,표준 출력,표준 에러), 파이프만 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
됩니다 .STDOUT
STDIN
grep
이것이 설정되면(상위 프로세스의 를 사용하여 UID:GID
) sudo
및 grep
바이너리가 해당 프로세스에 로드되어 실행됩니다.
프로그램은 단순히 읽고 STDIN
쓰고 STDOUT
오류를 보낼 수 있으며 STDERR
"파이프"는 상위 프로세스에 남겨집니다.
이는 Unix/Linux의 주요 설계 기능입니다. 나는 임시 저장소를 통해 모든 프로그램 간 연결을 지정할 수 있는 작업 제어 언어를 사용하여 시스템을 프로그래밍했습니다. 아.