sudo를 사용하여 루트가 소유한 파일에 텍스트를 삽입하는 방법은 무엇입니까? [복사]

sudo를 사용하여 루트가 소유한 파일에 텍스트를 삽입하는 방법은 무엇입니까? [복사]

중복 가능성:
쓰기 권한이 없는 파일로 표준 출력을 리디렉션합니다.

다음과 같은 명령을 실행하면 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/passwdsudo sh -o noclobber -c 'echo >/etc/passwd'noclobbershsudo

답변2

bash에게 파일을 열고 해당 파일에 명령 출력을 추가하라고 지시합니다 sudo echo 'text'. 물론 bash가 루트가 아닌 사용자로 실행 중이기 때문에 작동하지 않습니다. 대화형으로 저는 일반적으로 sudo -s이 문제를 해결하기 위해 실행합니다(그때부터 셸은 루트로 실행되고 파일을 열 수 있습니다). 또는 실행 sudo sh -c "echo 'text' >> /file.txt"하면 작동하지만 모든 보간/이스케이프가 간섭할 수 있는 복잡한 표현식이 있는 경우 약간 번거로울 수 있습니다.

관련 정보