附录

附录

我正在创建一个 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'"

在文件中写入星号。

相关内容