如何在不使用 shell 输出重定向的情况下从命令行写入文件?

如何在不使用 shell 输出重定向的情况下从命令行写入文件?

我试图:

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'

相关内容