Bash

如何在函式中使用 sudo?

  • November 18, 2018

我寫了一個函式,它的行為方式與日期戳相似,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但我不能總是這樣做,因為我想在~/.bash_logout自動執行的文件中使用記錄器功能。我嘗試sudo在 while 循環中將 echo 放在前面,但這不起作用。有任何想法嗎?

放入sudo腳本通常是不好的做法。sudo更好的選擇是使用from或您想使用它的任何其他地方呼叫腳本~/.bash_logout,如果必須的話,或者最好還是讓/var/log/test.log世界可寫。

正如您所發現的,sudo command >out它不起作用,因為 ‘command’ 由 sudo 執行,但 ‘>out’ 是 shell 的功能,而不是 ‘command’。因此,您需要升級 shell 本身:

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

因此西蒙的警告。

引用自:https://unix.stackexchange.com/questions/8727