Bashスクリプトを使用してUSBデバイスにアクセスする

Bashスクリプトを使用してUSBデバイスにアクセスする

私はラズベリーパイ4モデルBを使用しています。 USBデバイスを接続すると、自動的に実行されるスクリプトを作成しようとします。 USBデバイスのテキストファイルから読み取りを試みます。

これが私がこれまでに達成したことです。 USBはudev私のスクリプトを実行するイベントをトリガーします。このスクリプトにはroot権限があります。実行すると、インストールされているls /media/usernameすべてのデバイスの後に実行されます。

ここではいくつかの問題が発生します。スクリプト(イベントによって実行されたときudev)が私のUSBデバイスを見つけることができません。しかし、スクリプトを手動で実行すると機能します。したがって、スクリプトは失敗せず(絶対パスを使用して環境変数を使用しない)、端末にコマンドなどを入力すると、すべてのコマンドが機能します。権限の問題のようですが、間違っている可能性があります。

答え1

udev(セキュリティホールを防ぐために追加された)プライベートマウントネームスペースを無効にする代わりに、代替ソリューションを提案します。

まず、デバイスに一致するudevルールを作成してTAG+="systemd"追加します。これにより、udevデバイスを単位で呼び出すようにsystemd求められます*.device

デフォルトでは、デバイス名はデバイスのsysfsパスと一致し、スラッシュはダッシュに置き換えられます。つまり、 にある場合、対応するデバイスデバイスttyS0は と表示されます。この名前が気に入らない場合は、追加して決定できる2番目の名前を作成してください。/sys/sys/devices/pnp0/00:01/tty/ttyS0sys-devices-pnp0-00:01-tty-ttyS0.deviceENV{SYSTEMD_ALIAS}+="<desired device unit name>"

エイリアスはまだスラッシュ - ダッシュプロセスを経ているので、似たようなものが必要な場合sys-subsystem-media-devices-somename.device(他のサブシステムがすでに実行しているものと似ています)ENV{SYSTEMD_ALIAS}+="/sys/subsystem/media/devices/somename"

デバイスが*.device適切な名前のデバイスとして表示されたら、カスタムsystemdスクリプトを指定されたサービスに渡して、デバイスが表示さWantedBy="sys-subsystem-media-devices-somename.device"れたときにシステムデバイスを起動できます。スクリプトにrootアクセスが必要なく、ログインしたユーザーがいる場合にのみ実行する必要がある場合は、次のように設定することもできます。ユーザーサービス/etc/systemd/user/*.serviceつまり、すべてのユーザーに対して定義されるか、~/.config/systemd/user/*.service特定のユーザーに対してのみ定義されます。

あるいは、udevルールで次のいずれかを指定して、udevルールにサービスの依存関係を提供することもできます。

  • ENV{SYSTEMD_WANTS}="<system service to start on hotplug>.service"
  • ENV{SYSTEMD_USER_WANTS}="<user service to start on hotplug>.service"

これは、ソフトウェアがどのようにモジュール化されているか、ユーザーにどれだけ選択的であるかに応じて、udevルールとサービスの間で責任を分配するさまざまな方法を提供します。

  • システムサービスへの依存関係として指定すると、ユーザーがログインしているかどうかにかかわらずサービスがトリガーされます。無効にするには、そのサービスをブロックまたは削除する必要があります(root権限を使用)。
  • これがユーザー・サービスに対する udev 指定の依存関係として指定されている場合、ユーザーは、すべてのユーザーの基本ユーザー・サービスとともに、root 権限を必要とせずにサービスを実行できるかどうかを選択できます。個々のユーザーのための-outメカニズム。
  • udevルールでデバイス単位を生成するためにudevオプションのみを指定すると、デバイスが表示されたときにサービスが自動的に開始されるように選択できます。これは、サービス部分を独立して更新したい場合に便利です。

関連情報