Android 的 udev 规则无法与 go-mtpfs 配合使用

Android 的 udev 规则无法与 go-mtpfs 配合使用

在 Ubuntu 12.04 上,当 Motorola Moto E 连接到机器 USB 端口时,我的规则会触发一个脚本motoe.sh。我的自定义规则不起作用。

规则是:

ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="2e76", RUN+="/usr/local/bin/motoe.sh"

motoe.sh是:

#!/bin/bash

motoemount.sh & motoedesktop.sh

motoemount.sh是:

#!/bin/bash

go-mtpfs /media/MyAndroid

motoedesktop.sh是:

#!/bin/bash

gmessage -center -timeout 3 -buttons OK:0 "message to "

rdesktop -u username -d domain -r disk:motoe=/media/MyAndroid/Interno/Download ip_address -a 8 -k pt-br

gmessage -center -timeout 3 -buttons OK:0 "another message to the user" &
umount /media/MyAndroid/

所有.sh脚本都设置了执行权限。

我尝试过使用 SUBSYSTEM、SUBSYSTEMS、带 DRIVER 和不带 DRIVER,都没有效果。

我不知道我错过了什么。如果我motoe.sh从终端执行,它会正确运行。

答案1

-1- 运行外部程序时要小心,因为udev在外部程序执行期间执行将被暂停。更确切地说,它将等到外部程序退出后再继续。您仍然可以执行冗长的程序,但必须立即“分离”它,方法是在后台运行它。在这种情况下,yrmotoe.sh可能应该显示为:

#!/bin/bash
{ 
   motoemount.sh
   motoedesktop.sh
} &

这相当于{ motoemount.sh; motoedesktop.sh }&,即执行motoedesktop.sh 无条件地motoemount.sh退出后。

注意 :

$ motoemount.sh &; motoedesktop.sh

意味着motoemount.shmotoedesktop.sh是异步执行的,即在退出motoedesktop.sh之前就开始执行motoemount.sh

$ motoemount.sh && motoedesktop.sh

不一样。在这种情况下,motoedesktop.sh仅当退出值为motoemount.sh“0”时才执行。

[...] 如果我从终端执行 motoe.sh,它可以正确运行

-2-udev不在任何活动终端上运行外部程序,也不在 shell 上下文中执行它们。请确保您的程序被标记为可执行,如果它是 shell 脚本,请确保它以适当的 shebang 开头(例如 #!/bin/sh)。udev看到的环境与您(或任何 $USER)在控制台上获得的环境不同。因此,请为所有命令指定绝对路径:

motoemount.sh -> /path/to/motoemount.sh
motoedesktop.sh -> /path/to/motoedesktop.sh
go-mtpfs-> ...
gmessage-> ...
rdesktop-> ...
umount ->/bin/umount

为了找到系统命令的路径(例如umount),您可以使用不带括号的 cmd which [cmd],例如:

$ which umount
/bin/umount

-3- 验证您的进程是否具有足够的权限来卸载/media/MyAndroid/

[...] 如果我从终端执行 motoe.sh,它可以正确运行

-4- 如果您打印到屏幕(不确定您是否会这样做,因为我不熟悉,gmessage但看起来您这样做了),请确保您的 DISPLAY 环境变量已设置(udev 已知)并导出(传递给子 shell)。否则,不要指望任何标准输出出现在您的终端上。有关示例,请参阅,特别是该# set DISPLAY部分。

相关内容