我试图:
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
答案1
使用logger
命令,该命令是 shell 系统日志模块的命令行界面syslog
。您可以使用该-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.
答案2
抛开“为什么”不谈,任何读取 stdin 并写入指定输出文件的命令都可以。我最喜欢的是“dd”,但我已经足够大了,已经使用了“dd”所指的内容。
回声某事| sudo dd of=/dev/kmsg
应该可以正常工作。
答案3
我知道您要求不需要 shell 重定向的东西,但您可以sudo
通过将其更改为以下内容来使命令正常工作:
sudo su -c 'echo "$USER: my message" > /dev/kmsg'