Bash
如何在函式中使用 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
但我不能總是這樣做,因為我想在~/.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
因此西蒙的警告。