我正在创建一个 udev 规则集,每次插入某个 USB 驱动器时都会写入日志文件。我的规则集存储在 中/etc/udev/rules.d /99-log-USB-drive.rules
,目前包含以下内容:
# Skip if not the expected USB drive
ENV{ID_FS_UUID}!="SOMEUUID", GOTO="end"
# Try different ways of interacting with the file system
ACTION=="add", RUN+="/usr/bin/touch /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/chmod 664 /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/echo 2 >> /home/myusername/udevtest.txt"
# Exit
LABEL="end"
touch 和 chmod 命令均按预期工作,但当我尝试写入文件时,却什么也没得到。使用以下命令启用 udev 调试
udevadm control --log-priority=debug
将以下输出呈现为/var/log/syslog
:
Dec 3 18:00:49 Hostname systemd-udevd[9629]: starting '/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: '/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt'(out) '1 | /usr/bin/tee /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: Process '/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt' succeeded.
Dec 3 18:00:49 Hostname systemd-udevd[9630]: starting '/bin/echo 2 >> /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: '/bin/echo 2 >> /home/myusername/udevtest.txt'(out) '2 >> /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: Process '/bin/echo 2 >> /home/myusername/udevtest.txt' succeeded.
插入 USB 驱动器后。因此,命令成功执行,但由于某些我看不懂的原因,输出未写入文件。这问题表明写入文件应该可行。
附录
该项目的要求之一是我需要能够将星号 ( *
) 写入文件。使用 @Kamil Maciorowski 的出色答案中的信息,我可以写入文件,但无法阻止 shell 扩展星号。
ACTION=="add", RUN+="/bin/sh -c 'echo * >> /home/myusername/udevtest.txt'"
插入 USB 驱动器后,将根文件夹的内容列表写入文件中。
ACTION=="add", RUN+="/bin/sh -c 'echo "*" >> /home/myusername/udevtest.txt'"
不向文件写入任何内容并将以下输出呈现到/var/log/syslog
:
Jan 1 12:26:45 Hostname systemd-udevd[12359]: starting '/bin/sh -c 'echo '
Jan 1 12:26:45 Hostname systemd-udevd[12346]: '/bin/sh -c 'echo '(out) ''
Jan 1 12:26:45 Hostname systemd-udevd[12346]: Process '/bin/sh -c 'echo ' succeeded.
尽管
ACTION=="add", RUN+="/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt'"
也不会向文件写入任何内容并将以下输出呈现到/var/log/syslog
:
Jan 1 12:30:48 Hostname systemd-udevd[12477]: starting '/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt''
Jan 1 12:30:48 Hostname systemd-udevd[12464]: '/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt''(out) ''
Jan 1 12:30:48 Hostname systemd-udevd[12464]: Process '/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt'' succeeded.
答案1
|
诸如等操作符>>
在 shell 中具有某些含义,但/bin/echo 1 | …
运行 sole 时,则不存在 shell,而|
只是echo
其自身的另一个参数。
要使用这些运算符,您需要启动一个可以解析它们的 shell。这应该可以工作:
…
ACTION=="add", RUN+="/bin/sh -c 'echo 1 | /usr/bin/tee /home/myusername/udevtest.txt'"
ACTION=="add", RUN+="/bin/sh -c 'echo 2 >> /home/myusername/udevtest.txt'"
…
这里我选择了echo
(shellbuiltin) 而不是/bin/echo
。
或者您可以将几个命令(或所有命令)收集到一个 shell 脚本中(使用适当的 shebang),然后仅运行规则集中的脚本。它将是这样的:
#!/bin/sh
logfile="/home/myusername/udevtest.txt"
# /usr/bin should be in the defalut $PATH,
# so you probably don't need full paths to executables here
touch "$logfile"
chmod 664 "$logfile"
echo 1 | tee "$logfile"
echo 2 >> "$logfile"
不要忘记使脚本可执行。然后在规则集中:
…
ACTION=="add", RUN+="/path/to/the/script"
…
答案2
当 udevd 开始运行时,rootfs 仍然以只读选项挂载。因此您无法使用 udev RUN 键对文件进行任何更改。
以下是启动过程。init -> 挂载内核虚拟文件系统 (etc. /run/) -> udev 运行 -> 全部挂载 (/etc/fstab)
答案3
回答我自己的问题的附录:转义星号是有效的。
ACTION=="add", RUN+="/bin/sh -c 'echo \* >> /home/myusername/udevtest.txt'"
在文件中写入星号。