우리의 개발 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 -a
tee --append
두 번째, 세 번째 및 네 번째 솔루션에 대해 Jd , Adam J. Forster 및 Johnathan 에게 감사드립니다 .
답변
여기 누군가 방금 티를 제안했습니다.
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"