함수에서 sudo를 어떻게 사용하나요?

함수에서 sudo를 어떻게 사용하나요?

tee비슷하게 동작 하지만 날짜 스탬프를 앞에 추가하는 함수를 작성했습니다 . 루트 쓰기만 가능한 파일(내 경우에는 로그 파일 /var/log) 로 출력하려는 ​​것을 제외하면 모든 것이 잘 작동합니다 . 작동하지 않는 부분만 포함하도록 다음 코드 조각을 단순화했습니다.

#!/bin/bash
#script ~/test_logger.sh
logfile=/var/log/test.log
logger()
{
    while read data
    do
        echo $data >> $logfile
    done
    return 0
}
sudo ls ~ | logger

이렇게 전체 스크립트를 실행하면 제대로 작동 하지만 자동 실행 파일에서 로거 기능을 사용하고 sudo ~/test_logger.sh싶기 때문에 항상 그렇게 할 수는 없습니다 . while 루프의 에코 앞에 ~/.bash_logout넣으려고 했지만 작동하지 않았습니다. sudo어떤 아이디어가 있나요?

답변1

sudo일반적으로 스크립트를 넣는 것은 나쁜 습관입니다. 더 나은 옵션은 필요한 경우 스크립트를 사용하려는 곳이나 다른 곳 sudo에서 스크립트를 호출하는 것입니다. 또는 더 나은 방법은 세계를 쓰기 가능하게 만드는 것입니다.~/.bash_logout/var/log/test.log

답변2

아시다시피 sudo command >out"command"는 sudo에 의해 실행되기 때문에 작동하지 않지만 ">out"은 "command"가 아닌 셸의 기능입니다. 따라서 셸 자체를 업그레이드해야 합니다.

sudo sh -c "echo $data >>$logfile"

$data에 무엇이 있는지 매우 확실하게 확인하고 싶습니다.

~$ export data='good; touch /tmp/reallybad'
~$ echo $data
good; touch /tmp/reallybad
~$ sudo sh -c "echo $data>>/tmp/happy"
good
~$ ls /tmp/happy /tmp/reallybad
/tmp/happy  /tmp/reallybad

그래서 시몬은 경고를 발했습니다.

답변3

sudo리디렉션이나 파이프 연산자를 사용하면 생각과 다르게 작동할 수 있습니다. 허가를 받아 스트림 변경이 수행되지 않았습니다 sudo. 그렇기 때문에

sudo echo foo >> bar

bar에 루트만 쓸 수 있는 경우에는 아무런 효과가 없습니다.

에서 스크립트를 실행하면 sudo스크립트의 모든 항목에 슈퍼유저 권한이 부여되므로 이 경우에는 제대로 작동합니다.

해결 방법은 write 명령이 다음에서 실행되도록 하는 것입니다 sudo.

sudo echo foo | sudo tee bar > /dev/null

하지만 이 내용은 파일에 추가되지 않습니다. 파일을 덮어쓰게 됩니다.

답변4

sudo에 대한 매뉴얼 페이지를 보면 스크립트에서 이를 사용하는 방법에 대한 예를 볼 수 있습니다... -c 옵션은 명령을 실행합니다.

관련 정보