web-dev-qa-db-ja.com

udevRUNコマンドからのファイルへの書き込み

特定のUSBドライブが挿入されるたびにログファイルに書き込むudevルールセットの作成に取り組んでいます。 /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ドライブの挿入時。そのため、コマンドは成功しますが、何らかの理由で出力がファイルに書き込まれません。 This 質問は、ファイルへの書き込みが機能するはずであることを示しています。

補遺

このプロジェクトの要件の1つは、ファイルにアスタリスク(*)を書き込める必要があることです。 @Kamil Maciorowskiによる優れた回答からの情報を使用して、ファイルに書き込むことはできますが、シェルがアスタリスクを展開するのを防ぐことはできません。

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.
2
fuumind

|>>などの演算子は、シェル内で何かを意味しますが、唯一の/bin/echo 1 | …が実行されると、シェルは存在せず、|echo自体に対する単なる別の引数です。 。

これらの演算子を使用するには、それらを解析するシェルを開始する必要があります。これは機能するはずです:

…
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'"
…

ここでは、/bin/echoではなくecho(シェル組み込み)を選択しました。

または 1つのシェルスクリプト(適切なシバンを使用)にいくつかのコマンド(またはすべて)を収集し、ルールセットからスクリプトのみを実行できます。それは次のようになります:

#!/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"
…
3

Udevdが実行を開始しても、rootfsは読み取り専用オプションでマウントされます。したがって、udevRUNキーを使用してファイルに変更することはできません。

起動プロセスは次のとおりです。 init->カーネル仮想ファイルシステムのマウント(etc./run /)-> udev running-> mount all(/ etc/fstab)

1
IGI

私自身の質問の補遺に答える:アスタリスクのエスケープは機能します。

ACTION=="add", RUN+="/bin/sh -c 'echo \* >> /home/myusername/udevtest.txt'"

ファイルにアスタリスクを書き込みます。

0
fuumind