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
이것은 에 대한 단순한 래퍼이므로 주의해 주십시오.tee
tee)도 수 있습니다-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
'programing' 카테고리의 다른 글
텍스트 파일에서 새 줄을 제거하려면 어떻게 해야 합니까? (0) | 2023.04.15 |
---|---|
이벤트 처리를 위해 WPF 자원 딕셔너리 뒤에 코드를 설정할 수 있습니까? (0) | 2023.04.15 |
Xcode의 숨겨진 특징 (0) | 2023.04.15 |
NPM이 스택되어 같은 오류가 발생함EISDIR: 디렉토리에서 잘못된 조작, 오류 시 읽기(네이티브) (0) | 2023.04.15 |
@import vs #import - iOS 7 (0) | 2023.04.15 |