programing

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

javamemo 2023. 4. 15. 08:12
반응형

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

개발 RedHat Linux 박스 중 하나에 대해 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의 답변을 참조하십시오.

  • 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
    

    the로 ./dev/null티가 화면에 출력되지 않도록 하는 데 필요합니다.출력 파일을 덮어쓰는 대신 추가하는 방법(>>를 사용합니다tee -a ★★★★★★★★★★★★★★★★★」tee --append(마지막은 GNU coreutils에 고유합니다).

Jd에게 가줘서 고마워, Adam J. 번째, 세 번째, 네 번째 솔루션에는 Forster와 Jonathan이 있습니다.

여기 있는 누군가가 티를 하자고 제안했습니다.

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

액세스 권한이 없는 디렉토리로 명령을 리디렉션하는 데도 사용할 수 있습니다.TE 프로그램이 효과적으로 "파일에 대한 에코" 프로그램이기 때문에 작동하며 /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

    이것은 특히 One of compound 명령어에 도움이 됩니다.예를 들어 다음과 같습니다.

    sudo bash -c "{ command1 arg; command2 arg; } > /log/file.txt"
    
  • 필요한 권한을 가진 파이프/서브셸(sudo)을 배열합니다.

    # Read and append to a file
    cat ./'file1.txt' | sudo tee -a '/log/file.txt' > '/dev/null';
    
    # Store both stdout and stderr streams in a file
    { command1 arg; command2 arg; } |& sudo tee -a '/log/file.txt' > '/dev/null';
    

또 다른 테마의 변형:

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

또는 물론:

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

두 가지 은 여러분이 .sudo ★★★★★★★★★★★★★★★★★」sh/bash

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

출력을 생성하는 명령을 실행할 수 있는 적절한 권한이 있는 경우 명령 출력을 tee로 파이핑할 경우 tee의 권한을 sudo 및 direct 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그러나 source 명령어가 완전히 신뢰하지 않는 스크립트일 경우 매우 중요합니다.

할 수 예: -a 옵옵옵(((((((((((((((((((((((().>>등).>를 참조해 주세요.

sudo에게 다음과 같이 셸을 실행시킵니다.

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

이 문제에 대한 나의 견해는 다음과 같다.

파일을 쓰거나 치환해야 하는 경우:

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

파일에 추가할 필요가 있는 경우:

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

많은 이 .tee '다, 하다, 하다'의 방향을 stdout로로 합니다./dev/null카피를 화면에 표시하고 싶은 경우는 제외합니다.

보다 간단한 해결책은 단지 다음과 같이 사용하는 것입니다.cat음음음같 뭇매하다

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

안에 있는 . 안에 .이것에 의해 리다이렉션은, 에 의해서 개시된 셸에 의해서 평가됩니다.sudo운영자가 아니라요.

대본을 써보는 건 어때요?

파일명: myscript

#!/bin/sh

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

# end script

그런 다음 sudo를 사용하여 스크립트를 실행합니다.

sudo ./myscript

이런 걸 해야 할 때마다 뿌리가 되는 거죠.

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

최선의 방법은 아닐지도 모르지만, 효과가 있어요.

저는 이렇게 하겠습니다.

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

이는 다음 질문에 대한 답변에 기초하고 있습니다.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

코드의 USAVE에 나타나 있듯이, 이 스크립트에 출력을 파이프로 접속하고, 그 후에 필요한 슈퍼 유저 액세스 가능한 파일명을 지정하면, 필요에 따라서 패스워드를 자동적으로 입력하도록 요구됩니다(이 스크립트는 다음을 포함합니다).sudo).

echo test | suwrite /root/test.txt

이것은 에 대한 단순한 래퍼이므로 주의해 주십시오.teetee)도 수 있습니다-a추가 옵션 및 동시에 여러 파일에 쓸 수 있습니다.

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

,, 의, 의, 의에 쓰는 보호 ./dev/이 페이지의 코멘트 중 하나에 기재되어 있는 우려 사항인 디바이스.

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

일부 프로그램/경로에만 sudo 액세스 권한이 부여되었을 수 있습니다.그러면 네가 원하는 걸 할 방법이 없어.(당신이 어떻게든 해킹하지 않는 한)

그렇지 않은 경우 bash 스크립트를 작성할 수 있습니다.

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

+ 를 누릅니다.

chmod a+x myscript.sh
sudo myscript.sh

도움이 됐으면 좋겠다.

언급URL : https://stackoverflow.com/questions/82256/how-do-i-use-sudo-to-redirect-output-to-a-location-i-dont-have-permission-to-wr

반응형