如何在函数中使用 sudo?

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放在前面,但这不起作用。有任何想法吗?

sim*_*mon 8

放入sudo脚本通常是不好的做法。一个更好的选择是sudo~/.bash_logout你想使用它的地方或任何其他地方调用脚本,如果你必须的话,或者最好还是让/var/log/test.log世界可写。


Sha*_*aun 8

正如您所发现的,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)

因此西蒙的警告。