[linux] sudo를 사용하여 쓰기 권한이없는 위치로 출력을 리디렉션하려면 어떻게합니까?

우리의 개발 RedHat 리눅스 박스 중 하나에 sudo 액세스 권한을 부여 받았으며 일반적으로 쓰기 권한이없는 위치로 출력을 리디렉션 해야하는 경우가 종종 있습니다.

문제는이 고안된 예제가 작동하지 않는다는 것입니다.

sudo ls -hal /root/ > /root/test.out

나는 단지 응답을 받는다 :

-bash: /root/test.out: Permission denied

이 기능을 작동 시키려면 어떻게해야합니까?



답변

쓰기 권한이없는 쉘이 경로 재 지정을 수행하므로 명령이 작동하지 않습니다 /root/test.out. sudo 출력의 리디렉션을 수행 하지 않습니다 .

여러 가지 솔루션이 있습니다.

  • sudo로 쉘을 실행하고 -c옵션 을 사용하여 명령을 제공하십시오 .

    sudo sh -c 'ls -hal /root/ > /root/test.out'
    
  • 명령으로 스크립트를 작성하고 sudo를 사용하여 해당 스크립트를 실행하십시오.

    #!/bin/sh
    ls -hal /root/ > /root/test.out
    

    를 실행하십시오 sudo ls.sh. Steve Bennett ‘s 참조임시 파일을 만들지 않으려면 답변을 .

  • 쉘을 sudo -s시작한 다음 명령을 실행하십시오.

    [nobody@so]$ sudo -s
    [root@so]# ls -hal /root/ > /root/test.out
    [root@so]# ^D
    [nobody@so]$
    
  • 사용 sudo tee( -c옵션을 사용할 때 많이 탈출 해야하는 경우 ) :

    sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
    

    가 화면에 출력되는 /dev/null것을 막으려면로 리디렉션 이 필요합니다 . 하려면 추가 하는 대신 출력 파일 (덮어 쓰는 ), 사용 또는 (마지막 하나에 고유 GNU의로 coreutils ).>>tee -atee --append

두 번째, 세 번째 및 네 번째 솔루션에 대해 Jd , Adam J. ForsterJohnathan 에게 감사드립니다 .


답변

여기 누군가 방금 티를 제안했습니다.

sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null

또한 액세스 권한이없는 디렉토리로 명령을 리디렉션하는 데 사용할 수도 있습니다. tee 프로그램은 사실상 “파일에 대한 에코”프로그램이기 때문에 작동하며 / dev / null 로의 경로 재 지정은 위의 원래 구성 예제와 동일하게 유지하기 위해 화면으로 출력하는 것도 중지하는 것입니다.


답변

내가 알아 낸 속임수는

sudo ls -hal /root/ | sudo dd of=/root/test.out


답변

문제는 명령 이에서 실행 sudo되지만 리디렉션 이 사용자에서 실행 된다는 것 입니다. 이것은 쉘에 의해 수행되며 당신이 할 수있는 일은 거의 없습니다.

sudo command > /some/file.log
`-----v-----'`-------v-------'
   command       redirection

이것을 우회하는 일반적인 방법은 다음과 같습니다.

  • sudo에서 호출하는 스크립트로 명령을 래핑하십시오.

    명령 및 / 또는 로그 파일이 변경되면 스크립트에서이를 인수로 사용하도록 할 수 있습니다. 예를 들면 다음과 같습니다.

    sudo log_script command /log/file.txt
    
  • 쉘을 호출하고 명령 행을 매개 변수로 전달하십시오. -c

    이것은 특히 복합 명령 하나에 유용합니다. 예를 들면 다음과 같습니다.

    sudo bash -c "{ command1 arg; command2 arg; } > /log/file.txt"
    

답변

주제에 대한 또 다른 변형 :

sudo bash <<EOF
ls -hal /root/ > /root/test.out
EOF

또는 물론 :

echo 'ls -hal /root/ > /root/test.out' | sudo bash

그들은 당신이 sudo또는 sh/에 대한 논쟁을 기억할 필요가 없다는 (작은) 장점을 가지고 있습니다.bash


답변

티 옵션이 바람직한 이유에 대한 설명

출력을 작성하는 명령을 실행할 수있는 적절한 권한이 있다고 가정하면 명령의 출력을 티로 파이프하는 경우 sudo 및 티를 사용하여 티의 권한을 상승시켜 해당 파일에 쓰거나 추가 할 수 있습니다.

질문에 주어진 예에서 다음을 의미합니다.

ls -hal /root/ | sudo tee /root/test.out

몇 가지 더 실용적인 예 :

# kill off one source of annoying advertisements
echo 127.0.0.1 ad.doubleclick.net | sudo tee -a /etc/hosts

# configure eth4 to come up on boot, set IP and netmask (centos 6.4)
echo -e "ONBOOT=\"YES\"\nIPADDR=10.42.84.168\nPREFIX=24" | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth4

이러한 각 예에서 권한이없는 명령의 출력을 가져 와서 일반적으로 루트 만 쓸 수있는 파일에 작성합니다.

출력을 생성하는 명령이 높은 권한으로 실행되지 않기 때문에 이런 식으로하는 것이 좋습니다. 여기서 중요한 것은 echo아니지만 source 명령이 완전히 신뢰할 수없는 스크립트 인 경우 중요합니다.

-a 옵션을 사용하여 >>대상 파일에 추가 (예 :)를 덮어 쓰지 않고 추가 (예 🙂 할 수 있습니다 >.


답변

sudo가 다음과 같이 쉘을 실행하도록하십시오.

sudo sh -c "echo foo > ~root/out"