mul*_*sen 3 bash sudo function
我编写了一个函数,它的作用与tee日期戳类似,但也预先设置了日期戳。一切正常,除非我想输出到一个只有 root 可写的文件(在我的例子中是一个日志文件/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
Run Code Online (Sandbox Code Playgroud)
如果我像这样运行整个脚本,它工作正常,sudo ~/test_logger.sh但我不能总是这样做,因为我想在~/.bash_logout自动运行的文件中使用记录器功能。我试过sudo在 while 循环中把 echo放在前面,但这不起作用。有任何想法吗?
放入sudo脚本通常是不好的做法。一个更好的选择是sudo从~/.bash_logout你想使用它的地方或任何其他地方调用脚本,如果你必须的话,或者最好还是让/var/log/test.log世界可写。
正如您所发现的,sudo command >out它不起作用,因为 'command' 是由 sudo 运行的,但是 '>out' 是 shell 的一个函数,而不是 'command'。因此,您需要升级 shell 本身:
sudo sh -c "echo $data >>$logfile"
Run Code Online (Sandbox Code Playgroud)
请注意,您想真正确定 $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
Run Code Online (Sandbox Code Playgroud)
因此西蒙的警告。