sudo echo“무언가”>> / etc / privilegedFile이 작동하지 않습니다


586

이것은 리눅스에서 sudo 권한에 관한 것 같은 최소한 간단한 질문입니다.

난 그냥 뭔가 추가 할 때가 많이 있습니다 /etc/hosts또는 유사한 파일을하지만 모두 때문에 할 수없는 끝 >>>심지어 루트로 허용되지 않습니다.

필요없이이 일을하기 위해 거기에 어떻게든지인가 su또는 sudo su루트로는?

답변:


855

tee --append또는을 사용하십시오 tee -a.

echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list

따옴표 안에 따옴표를 사용하지 마십시오.

콘솔로 데이터를 다시 인쇄하지 않으려면 출력을 / dev / null로 리디렉션하십시오.

echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list > /dev/null

( -a/ --append) 플래그를 기억하십시오 ! 그냥 tee작동 >하고 파일을 덮어 씁니다. 파일의 끝에서 tee -a작동 >>하고 작성합니다.


3
나는 이것을 절대적으로 선호합니다. 그것은 가장 간단합니다 (그리고 다른 시나리오에서도 유용하게 사용되는 티에 대해 힘들었습니다).
Joachim Sauer

5
동의한다. 특히 환경 등의 일을 할 가능성이있는 새로운 sh를 시작하는 것보다 깔끔한 것 같습니다.
Sam Brightman

39
주의해야 할 중요한 사항 : -a를 절대 잊지 마십시오! 그냥 무엇을 상상 echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstab할 것
mic_e

21
OS X에서는이 tee -a대신 이어야합니다 tee --append.
8:17에

26
@mic_e가 말한 것을 이해하지 못하는 사람들을 위해 : ( ) 플래그 없으면 -a명령은 파일 을 끝에 추가하는 대신 주어진 문자열로 전체 파일덮어 씁니다 . --append
totymedli

314

문제는 쉘이 sudo 또는 echo가 아닌 출력 경로 재 지정을 수행하므로 일반 사용자로 수행된다는 것입니다.

다음 코드 스 니펫을 사용해보십시오.

sudo sh -c "echo 'something' >> /etc/privilegedfile"

"스도 권한 경계"란 무엇입니까? 명백한 이유로 명령보다 우선 순위가 높은 리디렉션 연산자를 구문 분석하는 것은 단지 쉘일뿐입니다.
Vinko Vrsalovic

1
에 따라 shecho는 \t작은 따옴표 안에있는 것처럼 이스케이프 시퀀스를 해석 할 수 있습니다 . printf %s 'something'대신 사용할 수 있습니다 .
Lri

티를 사용하는 것이 더 인기 있고 최신 배포판과 호환됩니다.
Eduardo B.

1
이것은 원격 노드에서 실행될 수있는 SSH 명령으로있는 그대로 작동합니다.
Duncan Lock

다른 게시물에 동의합니다. 이것은 쉘과 쉘 만 사용하므로 tee와 같은 다른 프로그램은 필요하지 않습니다. 예, 티가 이미 설치되어 있다는 것을 알고 있지만 맨발의 알파인처럼 사용하는 마이크로 배포판에 따라 다를 수 있습니다. 쉘 옵션도 있습니다. sudo /bin/bash -c "echo 'fs.inotify.max_user_watches = 524288' > /etc/sysctl.d/60-golang-inotify.conf"예를 들어.
Ligemer 2016 년

35

문제는 리디렉션을 처리하는 것이 쉘이라는 것입니다. sudo에서 실행중인 프로세스 권한이 아닌 권한으로 파일을 열려고합니다 .

아마도 다음과 같은 것을 사용하십시오 :

sudo sh -c "echo 'something' >> /etc/privilegedFile"

@GordonSun 이것은 sudo(보안상의 이유로) 환경을 하위 프로세스로 전파하지 않기 때문 입니다. sudo -E이 제한을 우회 하는 데 사용할 수 있습니다 .
arielf

1
@ GordonSun 네, 왜 당신 이이 진술을 계속 반복하는지 이해할 수 없습니다! 당신이 할 경우 sudo sh -c "echo 'something' >> $FILENAME", 큰 따옴표로,이 일 - 변수 대체는 외부 쉘이 아닌 sudoed 쉘에 의해 수행된다.
Nadav Har'El


13

하기

sudo sh -c "echo >> somefile"

작동해야합니다. 문제는>와 >>가 "sudoed"명령이 아닌 셸에 의해 처리되므로 권한은 "sudoed"하려는 사용자의 권한이 아니라 사용자의 권한입니다.


9

궁금한 점은 heredoc (큰 블록의 경우)을 인용 할 수도 있습니다.

sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf
<?xml version=\"1.0\" encoding=\"UTF-8\"?>

<plist version=\"1.0\">
  <dict>
    <key>Label</key>
    <string>com.company.ipfw</string>
    <key>Program</key>
    <string>/sbin/ipfw</string>
    <key>ProgramArguments</key>
    <array>
      <string>/sbin/ipfw</string>
      <string>-q</string>
      <string>/etc/ipfw.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true></true>
  </dict>
</plist>
EOIPFW"

1
이것은 \로 이스케이프해야 할 수 있습니다 포함 된 따옴표를 제외하고 잘 작동합니다
N 존스에게

맞아요 @NJones! 답변을 수정하겠습니다. (그러나, 이렇게 "하지 않으면 내부 가 제거 되지만 명령이 실패하지는 않습니다.)
msanford

8

bash에서는 stdout을 깨끗하게 유지하기 위해 tee와 함께 사용할 수 있습니다 > /dev/null.

 echo "# comment" |  sudo tee -a /etc/hosts > /dev/null

4

유의 대답을 사용하여 다음에 넣으십시오 ~/.bashrc.

sudoe() {
    [[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
    echo "$1" | sudo tee --append "$2" > /dev/null
}

이제 당신은 실행할 수 있습니다 sudoe 'deb blah # blah' /etc/apt/sources.list


편집하다:

파일을 입력하거나 파일에서 리디렉션 할 수 있고 -a추가 기능을 해제 하는 스위치가 포함 된보다 완전한 버전입니다 (기본적으로 켜져 있음).

sudoe() {
  if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then
    shift &>/dev/null || local failed=1
  else
    local append="--append"
  fi

  while [[ $failed -ne 1 ]]; do
    if [[ -t 0 ]]; then
      text="$1"; shift &>/dev/null || break
    else
      text="$(cat <&0)"
    fi

    [[ -z "$1" ]] && break
    echo "$text" | sudo tee $append "$1" >/dev/null; return $?
  done

  echo "Usage: $0 [-a|--no-append] [text] <file>"; return 1
}

2

패키지 sponge에서 사용할 수도 moreutils있고 출력을 리디렉션 할 필요가 없습니다 (즉, tee숨길 잡음이 없음 ).

echo 'Add this line' | sudo sponge -a privfile

0

sed -i 를 사용하여$ a 이면 마지막 줄 뒤에 변수와 특수 문자를 모두 포함하는 텍스트를 추가 할 수 있습니다.

예를 들어, $ NEW_IP와 함께 $ NEW_HOST를 / etc / hosts에 추가하십시오.

sudo sed -i "\$ a $NEW_IP\t\t$NEW_HOST.domain.local\t$NEW_HOST" /etc/hosts

sed 옵션 설명 :

  • -i 에서-장소
  • 마지막 줄에 $
  • APPEND에 대한


0

어떻습니까 :
에코 텍스트 | sudo dd status = none of = privilegedfile
/ proc / sys / net / ipv4 / tcp_rmem을 변경하고 싶습니다.
내가 한 :
sudo dd status = none of = / proc / sys / net / ipv4 / tcp_rmem <<< "4096 131072 1024000"
은 한 줄 짜리 문서로 에코를 제거합니다.


1
스루 읽어 보시기 바랍니다 편집 도움도움말 센터를 . 스택 오버플로에서의 서식은 다른 사이트와 다릅니다.
Dharman

-1

이것은 나를 위해 일했다 : 원래 명령

echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment

작업 명령

echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment

1
이어야 tee -a합니다. 그냥 tee파일을 덮어 쓰게됩니다!
codeforester

-6

파일 소유권을 변경 한 다음 cat >>추가에 사용한 후 다시 변경할 수 있습니까?

sudo chown youruser /etc/hosts  
sudo cat /downloaded/hostsadditions >> /etc/hosts  
sudo chown root /etc/hosts  

이 같은 일이 당신을 위해 작동합니까?


4
Chown은 사용하는 파괴적인 명령입니다. 구성 관리자가이를 사용하여 / etc / hosts를 업데이트하는 경우 갑자기 / etc / hosts는 루트가 아닌 구성 사용자에 속합니다. 잠재적으로 다른 프로세스가 / etc / hosts에 액세스 할 수 없게됩니다. sudo의 요점은 루트에 무언가가 로그인되지 않도록하는 것이며 sudoers를 통해 더 많은 제한 사항이 쌓일 수 있습니다.
David
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.