쓰기 권한 없이 파일을 수정하려고 하면 다음 오류 메시지가 나타납니다.
> touch /tmp/foo && sudo chown root /tmp/foo
> echo test > /tmp/foo
zsh: permission denied: /tmp/foo
Sudoing은 명령을 루트로 실행하기 때문에 도움이 되지 않지만 쉘은 stdout 리디렉션과 파일 열기를 사용자가 수행한 방식으로 처리합니다.
> sudo echo test > /tmp/foo
zsh: permission denied: /tmp/foo
루트로 쉘을 열고 그런 식으로 파일을 조작하는 것 외에 쓰기 권한이 없는 파일로 stdout을 리디렉션하는 쉬운 방법이 있습니까?
> sudo su
# echo test > /tmp/foo
답변1
예, 사용 하십시오 tee
.echo test > /tmp/foo
echo test | sudo tee /tmp/foo
>>
( )를 추가할 수도 있습니다.
echo test | sudo tee -a /tmp/foo
답변2
파일 내용을 쉘 리디렉션 연산자의 출력 echo
으로 바꿉니다.>
echo test | sudo dd of=/tmp/foo
잘림 없이 파일에 쓰려면(처음에는 seek
출력에 다른 오프셋을 사용할 수 있지만) ( 1<>
Bourne 쉘 연산자와 유사):
echo test | sudo dd of=/tmp/foo conv=notrunc
GNU를 사용하여 파일에 추가하려면(예 >>
: ) dd
:
echo test | sudo dd of=/tmp/foo oflag=append conv=notrunc
기존 파일이 손상되는 것을 방지 dd
하려면 ( POSIX 셸에서와 같이) GNU를 참조하고 그 반대(기존 파일만 업데이트하는 경우) 도 참조하세요 .conv=excl
set -o noclobber
conv=nocreat
답변3
tee
아마도 최선의 선택일 것입니다. 하지만 상황에 따라 다음과 같이 해도 충분할 수 있습니다.
sudo sh -c 'echo test > /tmp/foo'
답변4
sponge
moreutils 패키지에서 사용됩니다. 표준 출력에 쓰지 않는다는 장점이 있습니다.
echo test | sudo sponge /tmp/foo
-a
파일을 덮어쓰는 대신 파일에 추가하려면 이 옵션을 사용하십시오 .