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 옵션은 명령을 실행합니다.