Sudo

如何在不使用 shell 輸出重定向的情況下從命令行寫入文件?

  • January 1, 2019

我試圖:

sudo echo "$USER: my message" > /dev/kmsg

將消息寫入 dmesg 日誌。這會導致“權限被拒絕”錯誤,因為它將“sudo”的輸出(雖然不再具有特權)重定向到 /dev/kmsg。因此“echo”命令以 root 身份執行,而對 /dev/kmsg 的寫入以我身份執行。引用“echo”命令和重定向(“>/dev/kmsg”)不起作用,因為重定向是 sudo 不理解的 shell 服務。(有問題的使用者 ID 在帶有 NOPASSWD 的 sudoers 中。)

是否有一些 Linux 命令將文件名作為選項並將其參數寫出來?像:’tee /dev/kmsg – 我要記錄的消息’ 我知道’logger’ 命令,但這不會寫入’dmesg’ 看到的任何日誌文件。(我想將我的一些消息散佈在引導過程中,以了解某些事情何時發生。)

這可行,但需要有一些地方將文件寫入:

echo "$USER: My msg" >/tmp/foo
sudo cp /tmp/foo /dev/kmsg
rm /tmp/foo

來自 ctrl-alt-delor 評論的解決方案如下:

echo "my message" | sudo tee /dev/kmsg >/dev/null

儘管它確實使用管道和重定向,但它發生在非特權 shell 中。對“/dev/kmsg”的特權訪問發生在“sudo”中的“tee”命令中。而且它不需要寫入磁碟文件(可能有問題)。

還有@stolenmoments 解決方案:

echo something | sudo dd of=/dev/kmsg

撇開“為什麼”不談,任何讀取標準輸入並寫入命名輸出文件的命令都可以。我最喜歡的是“dd”,但我已經足夠大,可以使用“dd”所指的東西了。

迴聲| sudo dd of=/dev/kmsg

應該可以正常工作。

使用logger命令,它是syslog系統日誌模組的 shell 命令行界面。您可以使用該-p開關來更改引發日誌消息的優先級,這反過來又用於確定將消息寫入哪個日誌文件。從手冊:

  -p, --priority priority
         Enter the message into the log with the specified priority.  The priority may be specified numerically or as a facility.level pair.  For example, -p local3.info logs the message as infor‐
         mational in the local3 facility.  The default is user.notice.

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