我试着:
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
使用
logger
命令,它是syslog
系统日志模块的 shell 命令行界面。您可以使用该-p
开关来更改引发日志消息的优先级,这反过来又用于确定将消息写入哪个日志文件。从手册:撇开“为什么”不谈,任何读取标准输入并写入命名输出文件的命令都可以。我最喜欢的是“dd”,但我已经足够大,可以使用“dd”所指的东西了。
应该可以正常工作。
我知道你要求的东西没有 shell 重定向,但你可以
sudo
通过将它更改为以下内容来使你的命令工作:sudo su -c 'echo "$USER: my message" > /dev/kmsg'