programing

sudo echo "something" >> /etc/privilegedFile이 작동하지 않습니다.

projobs 2023. 5. 14. 23:27
반응형

sudo echo "something" >> /etc/privilegedFile이 작동하지 않습니다.

이것은 리눅스의 sudo 권한에 대한 꽤 간단한 질문입니다.

저는 그저 무언가를 덧붙이고 싶을 때가 많습니다./etc/hosts또는 유사한 파일이지만 둘 다 때문에 결국 할 수 없습니다.>그리고.>>루트를 사용하는 경우에도 허용되지 않습니다.

이 일을 할 필요 없이 할 수 있는 방법이 있습니까?su또는sudo su뿌리에?

사용하다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와 같이 작동합니다.>>그리고 파일의 끝에 쓸 것입니다.

문제는 셸이 sudo나 echo가 아닌 출력 리디렉션을 수행하기 때문에 일반 사용자가 이 작업을 수행하고 있다는 것입니다.

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

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

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

다음과 같은 것을 사용합니다.

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

하고있다

sudo sh -c "echo >> somefile"

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

흥미롭게도, 저는 당신이 (큰 블록의 경우) 유전자를 인용할 수 있다는 것에 주목할 것입니다.

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"

bash에서 사용할 수 있습니다.tee와 결합하여> /dev/null스타드아웃을 깨끗하게 유지하기 위해.

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

일부 사용자는 여러 줄을 사용할 때 솔루션을 알지 못합니다.

sudo tee -a  /path/file/to/create_with_text > /dev/null <<EOT 
line 1
line 2
line 3
EOT

유씨의 대답을 이용해서 이것을 당신의 것에 넣으시오.~/.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
}

사용할 수도 있습니다.sponge에서moreutils출력을 리디렉션할 필요가 없는 패키지(예: 아니오)tee숨길 노이즈):

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

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

예를 들어 $NEW_HOST를 $NEW_와 함께 추가합니다./etc/hosts에 대한 IP:

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

sed 옵션 설명:

  • -in-place의 경우 i
  • 최후의 수단으로
  • 맹장

echo 'Hello World' | (sude -a /etc/apt/sources.list)


text | status = text | sudd status = =▁echo▁|삭제▁|=ech▁sud파privile일있none▁su▁text▁ofo권▁textgeddofile
proc/sys/net/ipv4/tcp_rmem을 변경하고 .
제가 했습니다.
= =/ dlld status= =/dll/dll/net/dll4/dll_rmem <"4096131072000"
줄 합니다.

이것은 나에게 효과가 있었습니다: 원래 명령.

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

작업 명령

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

할 수 있습니까?cat >>추가하시겠습니까?

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

당신에게 이런 일이 있나요?

언급URL : https://stackoverflow.com/questions/84882/sudo-echo-something-etc-privilegedfile-doesnt-work

반응형