어떻게 사용하 sudo 리디렉션하려면 출력을 위치지 않 쓸 수 있는 권한이 있는가?

StackOverflow https://stackoverflow.com/questions/82256

문제

가 되었습 sudo 액세스 중 하나에서 우리의 개발 RedHat linux 상자,나는 것을 찾아 자신이 자주 필요로 리디렉션하려면 출력을 위치지 않아요 일반적으로 쓰기 권한이 있습니다.

문제는 이 예제의 작동하지 않:

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.볼티 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 입하는 데 필요한지 tee 에서 출력하는 화면입니다.하기 append 대신 덮어 쓰기의 출력 파일 (>>),사용 tee -atee --append (마지막으로 하나정 GNU 않).

감사동 Jd, Adam J.포스터조나단 두 번째,세 번째와 네 번째는 솔루션입니다.

다른 팁

여기에 누군가가 그냥 제안 sudoing 티:

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

이 사용될 수도 있습 리디렉션하는 모든 명령에는 디렉토리로 당신은에 액세스 할 수 없습니다.그것은 작동하기 때문에 티 프로그램을 효과적으로는"에코 파일,프로그램"과 리다이렉션하는/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

그들은(작은)이점을 기억하지 않아도 모든 인수 sudosh/bash

명백하게 하는 비트에 왜 티 옵션이 바람직

다고 가정할 때 적절한 권한 명령을 실행하는 출력하는 경우를 파이프에 출력하는 명령 티,당신은 당신만을 상승시킬 필요가 티의 privledges 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 하지만 원본 명령은 스크립트는 당신이하지 않는 완전히 신뢰,그것은 매우 중요합니다.

참고 사용할 수 있다면-a 옵션을 사용하여 추가 append(아 >> 용)대상이 아닌 파일을 덮어 그것은(아 >).

게 sudo 실행하는 shell,다음과 같다:

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

는 방법에 대해 갈 것이 이 문제는:

필요하신 경우에는 쓰기/파일을 대체:

echo "some text" | sudo tee /path/to/file

필요하신 경우에는 추가 file:

echo "some text" | sudo tee -a /path/to/file

는 방법에 대한 스크립트를 작성?

름:노

#!/bin/sh

/bin/ls -lah /root > /root/test.out

# end script

다음 사용하 sudo 하는 스크립트를 실행합니다:

sudo ./myscript

나는 이 방법을 사용:

sudo su -c 'ls -hal /root/ > /root/test.out'

때마다 나는 뭔가를 다음과 같이 내가 그냥 뿌리:

# sudo -s
# ls -hal /root/ > /root/test.out
# exit

그것은 아마 최고의 방법이지만,그것은 작동합니다.

을 의미하지 않는 죽은 말을 이길지만,너무 많은 여기에 대한 답을 사용하는 tee, 즉,당신은 리디렉션 stdout 하기 /dev/null 지 않는 한 당신이보고 싶은 복사본을습니다.간단한 솔루션을 사용하여 cat 다음과 같다:

sudo ls -hal /root/ | sudo bash -c "cat > /root/test.out"

알 수 있는 방법을 리디렉션 안에 넣어 우리는 그것에 의해 평가되는 쉘에 의해 시작 sudo 대신 실행한다.

이에 따라 대답을 포함하는 tee.하는 것을 쉽게 쓴 작은 스크립트(나는 그것을 suwrite 고)에 넣 /usr/local/bin/+x 허가:

#! /bin/sh
if [ $# = 0 ] ; then
    echo "USAGE: <command writing to stdout> | suwrite [-a] <output file 1> ..." >&2
    exit 1
fi
for arg in "$@" ; do
    if [ ${arg#/dev/} != ${arg} ] ; then
        echo "Found dangerous argument ‘$arg’. Will exit."
        exit 2
    fi
done
sudo tee "$@" > /dev/null

과 같이 사용법 코드에서,당신이해야 할 모든 것이 파이프에 출력하는 이 스크립트는 다음에 원하는 유저 액세스할 수 있는 파일 이름과 그것이 자동으로 메시지를 표시합니다 당신의 비밀번호는 필요한 경우(기 때문이 포함됩 sudo).

echo test | suwrite /root/test.txt

참고로 이것은 간단한 래퍼 tee,그것은 또한 받아들이 티의 -a 옵션을 추가하고,또한 지원합 작성하여 여러 파일을 같은 시간에.

echo test2 | suwrite -a /root/test.txt
echo test-multi | suwrite /root/test-a.txt /root/test-b.txt

그것은 또한 일부 단순에 대한 보호에 쓰기 /dev/ 장치는 문제에서 언급하의 의견이 페이지에 있습니다.

어쩌면 당신은 주어진 sudo 스만 일부 프로그램/길?다음 방법은 없을 당신이 무엇을 원합니다.(지 않는 한 당신이 그것을 해킹이 어떻게 든)

되지 않은 경우 다음의 경우 어쩌면 당신은 쓸 수 있 bash 스크립트:

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

ctrl + d :

chmod a+x myscript.sh
sudo myscript.sh

희망 그것은 도움이됩니다.

sudo at now  
at> echo test > /tmp/test.out  
at> <EOT>  
job 1 at Thu Sep 21 10:49:00 2017  
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top