파일에 sudo로 추가하는 방법은 무엇입니까?


271

나하고 싶어:

echo "something" >> /etc/config_file

그러나 루트 사용자만이 파일에 대한 쓰기 권한을 가지고 있기 때문에 그렇게 할 수 없습니다. 그러나 다음도 작동하지 않습니다.

sudo echo "something" >> /etc/config_file

해당 상황에서 파일을 먼저 sudo'd 편집기로 연 다음 새 콘텐츠를 직접 추가 하지 않고도 파일에 추가하는 방법이 있습니까?


우분투 9.04를 사용하고 있으며 지금까지 필요한 모든 명령에 sudo를 사용할 수 있습니다. 서브 쉘을 스폰하는 것이 효과가있었습니다.
매트 노리스

답변:


391

와 함께 사용 tee -a(또는 tee --append)sudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

그래서 당신의 명령은

echo "something" | sudo tee -a /etc/config_file

tee관리 권한으로 Bash를 초과 실행하면 다음과 같은 장점이 있습니다.

  • 관리자 권한으로 Bash를 실행하지 않습니다
  • '파일에 쓰기'부분 만 고급 권한으로 실행됩니다.
  • 복잡한 명령을 인용하는 것이 훨씬 쉽다

2
OS X 티에서는 -a 플래그 만있는 것 같습니다.
Lri

데비안 8 tee에는 -aappend 플래그가 있습니다.
clay

9
echo "output" | sudo tee -a file > /dev/null콘솔 출력을 건너 뛰려면 사용하십시오 .
Moshe Bixenshpaner

WSL에서도 잘 작동합니다.
kayleeFrye_onDeck

50

리디렉션은 현재 셸에서 실행됩니다. 상승 된 권한으로 리디렉션을 수행하려면 상승 된 권한으로 셸 자체를 실행해야합니다.

sudo bash -c "somecommand >> somefile"

26

sudo가 서브 쉘을 생성하게합니다 :

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

이 예에서 sudo는 나머지를 인수로 사용하여 "sh"를 실행합니다.

(이것은 sudo 매뉴얼 페이지에 예제로 표시되어 있습니다)


8
그 이유는 sudo가 아닌 리디렉션을 수행하는 쉘 (당신처럼 실행)이기 때문입니다. 파일에 쓸 수있는 권한이 없으므로 권한 거부 오류가 발생합니다. 이 답변은 루트로 실행중인 새 쉘을 시작하여 파일에 쓸 수 있습니다.
랜디 올리 슨

이것은 정답이 아닙니다. 정답입니다. Akira는 그 대답에 제공된 논리에 대해 더 나은 것을 얻었습니다.
TOOGAM

6

나는 보통 sudo tee -a 와 함께 쉘 HERE 문서 를 사용 합니다. 다음과 같은 내용이 있습니다.

sudo tee -a /etc/profile.d/java.sh << 'EOF'
# configures JAVA
JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
EOF

4

제 생각에는이 경우 가장 좋은 것은 dd입니다.

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END

3

여기 sudo 및 리디렉션에 문제가있을 수 있습니다. 선을 추가하려면 대신 원하는 텍스트 편집기를 사용하십시오.

sudo nano /etc/profile

또는 대신 su를 사용해보십시오.

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

불행히도 이것은 같은 결과를 낳았습니다.
매트 노리스

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'작동해야합니다. 쉘이 실수로 에코하기 위해 arg에 확장 할 수있는 것은 없기 때문에 전체 명령을 작은 따옴표로 묶습니다.
quck quixote

환상적입니다. 이제 스크립트의 일부로이 작업을 수행하십시오.
어니 던바

0

>>sudo의 출력 을 리디렉션 (사용 ) 하려고 시도하면 작동하지 않습니다 . 실제로하고 싶은 것은의 출력을 리디렉션하는 것입니다 echo. 좋아하는 편집기를 사용하여 해당 행을에 수동으로 추가하는 것이 좋습니다 /etc/profile. 이것은 /etc/profile이미 설정되어 있는지 확인할 수있는 추가 이점이 있습니다 JAVA_HOME.


0

ex- way 사용 :

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

및 교체 FOO추가 할 귀하의 변수.

일부 시스템 (예 : OS X)에서 /etc/profile파일에는 444 권한이 있으므로 권한이 여전히 거부 되면 권한을 먼저 확인하고 수정하십시오.

sudo chmod 644 /etc/profile

그런 다음 다시 시도하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.