it-swarm-ko.tech

쓰기 권한이없는 파일로 stdout 리디렉션

파일에 대한 쓰기 권한이없는 파일을 수정하려고하면 오류가 발생합니다.

> 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
115
Michael Mrozek

예, tee를 사용하십시오. 그래서 echo test > /tmp/foo됩니다

echo test | Sudo tee /tmp/foo

(>>)

echo test | Sudo tee -a /tmp/foo
119
Gert

파일의 내용을 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 ddconv=nocreat도 참조하십시오. 반대의 경우 (기존 파일 만 업데이트).

27
Chris Jepeway

tee가 최선의 선택 일 수 있지만 상황에 따라 다음과 같이 충분할 수 있습니다.

Sudo sh -c 'echo test > /tmp/foo'
14
phunehehe

동의하지만 | 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
5
user unknown

비슷한 문제에 대한 마음의 생각을 뒷받침하고 다음 해결책을 생각해 냈습니다.

  • Sudo uncat 여기서 uncat는 표준 입력을 읽고 명령 줄에 이름이 지정된 파일에 기록하는 프로그램이지만 아직 uncat을 작성하지 않았습니다.

  • sudocat 아직 작성하지 않은 sudoedit의 변형 Sudo cat 또는 Sudo uncat.

  • 또는 쉘 스크립트 인 EDITOR와 함께 sudoedit를 사용하는이 작은 트릭

    #!/bin/sh
    # uncat
    cat > "$1"
    

    |Sudo ./uncat file 또는 | EDITOR=./uncat sudoedit 그러나 흥미로운 부작용이 있습니다.

2
hildred

Moreutils 패키지의 스폰지를 사용하십시오. stdout에 쓰지 않는 이점이 있습니다.

echo test | Sudo sponge /tmp/foo

파일을 겹쳐 쓰지 않고 추가하려면 -a 옵션을 사용하십시오.

1
Hontvári Levente

셸이 수행하는 순서에서 오류가 발생합니다.

셸이 Sudo를 실행하기 전에 리디렉션이 처리되므로 현재 작업중인 사용자의 권한으로 수행됩니다. 리디렉션 대상을 만들거나자를 수있는 쓰기 권한이 없으므로 permission denied 쉘에서 오류가 발생했습니다.

해결책은 출력 파일이 Sudo에 의해 제공된 신원에 따라 생성되도록하는 것입니다. tee 사용시 :

$ generate_output | Sudo tee target_file
0
Kusalananda