it-swarm-ko.tech

Sudo가 사용 권한을 가지고 있지 않으면 리디렉션을 할 수 있습니까?

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

문제는이 인위적인 예제가 작동하지 않는다는 것입니다.

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

방금 응답을받습니다.

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

어떻게 작동시킬 수 있습니까?

795
Jonathan

/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의 answer 를 참조하십시오.

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

    [[email protected]]$ Sudo -s
    [[email protected]]# ls -hal /root/ > /root/test.out
    [[email protected]]# ^D
    [[email protected]]$
    
  • Sudo tee를 사용하십시오 (-c 옵션을 사용할 때 많이 탈출해야하는 경우).

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

    tee 화면으로의 출력을 중지하려면 /dev/null로 리디렉션해야합니다. 출력 파일 (>>)을 덮어 쓰는 대신 add 를 추가하려면 tee -a 또는 tee --append (마지막 파일은 GNU coreutils ).

두 번째, 세 번째 및 네 번째 솔루션에 대해서는 Jd , Adam J. ForsterJohnathan 로 이동하십시오.

1134
Cristian Ciupitu

여기 누군가가 sudoing tee를 제안했습니다.

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

또한이 명령을 사용하여 액세스 권한이없는 디렉토리로 모든 명령을 리디렉션 할 수 있습니다. tee 프로그램이 효과적으로 "파일에 에코"프로그램이고/dev/null로 리다이렉트하면 화면에 출력을 멈추고 위의 원래의 고안된 예제와 동일하게 유지하기 때문에 작동합니다.

93
Jonathan

내가 생각한 트릭은

Sudo ls -hal /root/ | Sudo dd of=/root/test.out
74
rhlee

문제는 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"
    
40
dsm

테마의 또 다른 변형 :

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

또는 물론 :

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

그들은 Sudo 또는 sh/bash에 대한 인수를 기억할 필요가없는 (작은) 장점이 있습니다.

20
Steve Bennett

티 옵션이 바람직한 이유에 대한 설명을 분명히합니다

출력을 생성하는 명령을 실행할 적절한 권한이 있다고 가정하면 명령 출력을 tee로 파이프하면 Sudo로 tee의 권한을 높이고 문제의 파일에 쓰기 (또는 추가) 만하면됩니다.

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

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 옵션을 사용하면 >>와 같이 파일을 덮어 쓰지 않고 첨부 파일에 >와 같이 추가 할 수 있습니다.

18
jg3

Sudo가 다음과 같이 쉘을 실행하게 만듭니다.

Sudo sh -c "echo foo > ~root/out"
16
Penfold

이 문제에 관해 제가 갈 방법은 :

파일을 쓰거나 바꿀 필요가있는 경우 :

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

파일에 추가해야하는 경우 :

echo "some text" | Sudo tee -a /path/to/file
9
Nikola Petkanski

스크립트 작성은 어떻습니까?

파일 이름 : myscript

#!/bin/sh

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

# end script

그런 다음 Sudo를 사용하여 스크립트를 실행하십시오.

Sudo ./myscript
5
Jd

나는 이렇게 할 것이다 :

Sudo su -c 'ls -hal /root/ > /root/test.out'
4
fardjad

이런 식으로해야 할 때마다 나는 뿌리가됩니다.

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

아마 최선의 방법은 아니지만 작동합니다.

3
Adam J. Forster

죽은 말을 이기지는 말고 teename__을 사용하는 응답이 너무 많습니다. 즉, 화면에서 사본을보고 싶지 않으면 stdoutname__을 /dev/null로 리디렉션해야합니다. 더 간단한 해결책은 다음과 같이 catname__을 사용하는 것입니다.

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

리다이렉션을 따옴표 안에 어떻게 두어 리디렉션을 실행중인 Sudoname__으로 시작한 셸에서 평가하는지 확인합니다.

3
haridsv

이것은 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 "[email protected]" ; do
    if [ ${arg#/dev/} != ${arg} ] ; then
        echo "Found dangerous argument ‘$arg’. Will exit."
        exit 2
    fi
done
Sudo tee "[email protected]" > /dev/null

코드에서 USAGE와 같이이 스크립트에 결과를 파이프하고 원하는 수퍼 유저가 액세스 할 수있는 파일 이름을 입력하면됩니다. (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/ 장치에 대한 쓰기에 대한 단순한 보호 기능도 있습니다.

2
jamadagni

어쩌면 일부 프로그램/경로에만 Sudo 액세스 권한을 부여 했습니까? 그러면 원하는 것을 할 방법이 없습니다. (당신이 그것을 어떻게 든 해킹하지 않는다면)

그런 경우가 아니면 bash 스크립트를 작성할 수 있습니다.

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

프레스 ctrl + d :

chmod a+x myscript.sh
Sudo myscript.sh

희망이 도움이됩니다.

1
user15453
Sudo at now  
at> echo test > /tmp/test.out  
at> <EOT>  
job 1 at Thu Sep 21 10:49:00 2017  
0
user8648126