중복 가능성:
쓰기 권한이 없는 파일로 표준 출력을 리디렉션합니다.
다음과 같은 명령을 실행하면 sudo echo 'text' >> /file.txt
실패합니다.
bash: /file.txt: Permission denied
답변1
리디렉션은 적용된 명령이 아닌 쉘에 의해 수행되기 때문에 작동하지 않습니다. 그러나 쉘은 root 처럼 루트로 실행되지 않습니다 echo 'text'
.
파일에 쓰기 위해 루트 액세스가 필요하지만 데이터를 생성할 필요가 없는 경우 일반적인 방법은 다음을 사용하는 것입니다 tee
.
echo 'text' | sudo tee -a /file.txt
tee
또한 텍스트를 표준 출력으로 인쇄합니다. 이를 침묵시키고 쉘 추가( >>
) 처럼 동작하게 하려면 stdout을 다음으로 라우팅하십시오 /dev/null
.
echo 'text' | sudo tee -a /file.txt > /dev/null
데이터를 생성하기 위해 루트 액세스가 정말로 필요한 경우 두 개의 별도 sudo
명령을 실행하거나 내부에서 셸을 실행 sudo
하고 그곳으로 리디렉션할 수 있습니다(따옴표에 주의하세요).
sudo echo 'text' | sudo tee -a /file.txt
sudo sh -c 'echo "text" >>/file.txt'
추가하지 않고 덮어쓸 때 연산자 >
( )를 사용하여 set -o noclobber
기존 파일 자르기를 거부하는 셸에 익숙하다면 이 보호 기능이 적용되지 않는다는 점을 명심하세요 . 무시 sudo sh -c 'echo >/etc/passwd'
하고 해당 설정을 실행 프로그램 에도 적용 해야 합니다 .sudo tee /etc/passwd
/etc/passwd
sudo sh -o noclobber -c 'echo >/etc/passwd'
noclobber
sh
sudo
답변2
bash에게 파일을 열고 해당 파일에 명령 출력을 추가하라고 지시합니다 sudo echo 'text'
. 물론 bash가 루트가 아닌 사용자로 실행 중이기 때문에 작동하지 않습니다. 대화형으로 저는 일반적으로 sudo -s
이 문제를 해결하기 위해 실행합니다(그때부터 셸은 루트로 실행되고 파일을 열 수 있습니다). 또는 실행 sudo sh -c "echo 'text' >> /file.txt"
하면 작동하지만 모든 보간/이스케이프가 간섭할 수 있는 복잡한 표현식이 있는 경우 약간 번거로울 수 있습니다.