파일에 대한 쓰기 권한이없는 파일을 수정하려고하면 오류가 발생합니다.
> 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
예, tee
를 사용하십시오. 그래서 echo test > /tmp/foo
됩니다
echo test | Sudo tee /tmp/foo
(>>
)
echo test | Sudo tee -a /tmp/foo
파일의 내용을 echo
의 출력으로 바꾸려면 (>
셸 리디렉션 연산자와 같이).
echo test | Sudo dd of=/tmp/foo
파일에 쓰려면 (1<>
Bourne Shell 연산자와 같이) 잘리지 않고 처음에 seek
를 사용하여 다른 오프셋으로 출력 할 수 있습니다.
echo test | Sudo dd of=/tmp/foo conv=notrunc
GNU dd
)를 사용하여 파일에 추가하려면 (예 : >>
) :
echo test | Sudo dd of=/tmp/foo oflag=append conv=notrunc
기존 파일 (POSIX 셸의 conv=excl
와 같은) 및 set -o noclobber
와 같은 기존 파일을 방해하지 않으려면 GNU dd
의 conv=nocreat
도 참조하십시오. 반대의 경우 (기존 파일 만 업데이트).
tee
가 최선의 선택 일 수 있지만 상황에 따라 다음과 같이 충분할 수 있습니다.
Sudo sh -c 'echo test > /tmp/foo'
동의하지만 | Sudo tee
는 정식 방법이며 때로는 sed (여기서 GNU sed
) 가정 할 수도 있습니다.
cat sudotest
line 1
Sudo sed -i '1iitest' sudotest && cat sudotest
itest
line 1
Sudo sed -i '$aatest' sudotest && cat sudotest
itest
line 1
atest
-i
는 파일을 수정합니다. 1i
은 1 행 전 insert 를 의미합니다. $a
는 마지막 줄 이후에 추가 를 의미합니다.
또는 xclipboard로 복사하십시오.
somecommand | xclip
Sudo gedit sudotest
move cursor to desired place, click middle mouse button to insert, save
비슷한 문제에 대한 마음의 생각을 뒷받침하고 다음 해결책을 생각해 냈습니다.
Sudo uncat
여기서 uncat
는 표준 입력을 읽고 명령 줄에 이름이 지정된 파일에 기록하는 프로그램이지만 아직 uncat
을 작성하지 않았습니다.
sudocat
아직 작성하지 않은 sudoedit
의 변형 Sudo cat
또는 Sudo uncat
.
또는 쉘 스크립트 인 EDITOR와 함께 sudoedit
를 사용하는이 작은 트릭
#!/bin/sh
# uncat
cat > "$1"
|Sudo ./uncat file
또는 | EDITOR=./uncat sudoedit
그러나 흥미로운 부작용이 있습니다.
Moreutils 패키지의 스폰지를 사용하십시오. stdout에 쓰지 않는 이점이 있습니다.
echo test | Sudo sponge /tmp/foo
파일을 겹쳐 쓰지 않고 추가하려면 -a 옵션을 사용하십시오.
셸이 수행하는 순서에서 오류가 발생합니다.
셸이 Sudo
를 실행하기 전에 리디렉션이 처리되므로 현재 작업중인 사용자의 권한으로 수행됩니다. 리디렉션 대상을 만들거나자를 수있는 쓰기 권한이 없으므로 permission denied
쉘에서 오류가 발생했습니다.
해결책은 출력 파일이 Sudo
에 의해 제공된 신원에 따라 생성되도록하는 것입니다. tee
사용시 :
$ generate_output | Sudo tee target_file