【问题标题】:UDEV Shell script permissions issueUDEV Shell 脚本权限问题
【发布时间】:2023-10-13 22:17:01
【问题描述】:

我有一个名为 media_change.sh 的 shell 脚本,它由 udev 角色在设备状态更改时运行。

UDEV

ACTION=="change", ATTRS{idVendor}=="057b", ATTRS{idProduct}=="0000", ENV{DISK_MEDIA_CHANGE}=="1", RUN+="/home/pi/media_change.sh $env{DEVNAME}"

media_change.sh

#!/bin/bash
exec >> /home/pi/mount.log 2>&1

echo "$(date) Start."
echo "$(date) Media change detected on device $1"
device=${1##*/}
echo $(whoami)

lsblk | grep $device

if [ $? -eq 0 ]; then
    echo "$(date) Device exists on machine."
    echo "$(date) Mounting device $1 to /mnt/floppy."
    sudo -u pi sh /home/pi/test.sh
else
    echo "$(date) Device does not exist on machine."
fi
echo "$(date) End."

这会执行另一个名为 test.sh 的 shell 脚本,它只是为我运行一个 nodejs 脚本

#!/bin/bash
echo $(whoami)
cd /home/pi/SpotifyDisk-node && node player.js file

如果我将 media_change.sh 作为 pi 运行,脚本会按预期运行

➜  ~ ./media_change.sh
Fri  6 Mar 13:57:23 GMT 2020 Start.
Fri  6 Mar 13:57:23 GMT 2020 Media change detected on device
pi
sda           8:0    1  1.4M  0 disk /mnt/floppy
Fri  6 Mar 13:57:23 GMT 2020 Device exists on machine.
Fri  6 Mar 13:57:23 GMT 2020 Mounting device  to /mnt/floppy.
pi
DiskPlayer Not found in device list
Fri  6 Mar 13:57:27 GMT 2020 End.

如果我运行 media_change.sh sudo,脚本也会按预期运行 -

Fri  6 Mar 13:57:50 GMT 2020 Start.
Fri  6 Mar 13:57:50 GMT 2020 Media change detected on device
root
sda           8:0    1  1.4M  0 disk /mnt/floppy
Fri  6 Mar 13:57:50 GMT 2020 Device exists on machine.
Fri  6 Mar 13:57:50 GMT 2020 Mounting device  to /mnt/floppy.
pi
DiskPlayer Not found in device list
Fri  6 Mar 13:57:54 GMT 2020 End.

但是当脚本通过 UDEV 在设备更改上运行时,它会给出以下错误 -

Fri Mar  6 14:02:27 GMT 2020 Start.
Fri Mar  6 14:02:27 GMT 2020 Media change detected on device /dev/sda
root
sda           8:0    1  1.4M  0 disk /mnt/floppy
Fri Mar  6 14:02:27 GMT 2020 Device exists on machine.
Fri Mar  6 14:02:27 GMT 2020 Mounting device /dev/sda to /mnt/floppy.
sudo: unable to resolve host DiskPlayer: Temporary failure in name resolution
pi


#
# Fatal error in , line 0
# Check failed: SetPermissions(buffer, allocated, PageAllocator::kReadExecute).
#
#
#
#FailureMessage Object: 0x7ec46800Illegal instruction
Fri Mar  6 14:02:27 GMT 2020 End.

【问题讨论】:

  • 环境可能不同。 player.js 长什么样子?
  • 相同的环境,我什至创建了一个简单的 test.js,它只是 console.log('test') 但这给了我同样的错误,再次,当通过 pi 或 sudo 执行时工作正常,只是没有不符合 UDEV 规则
  • 如果你运行./media_change.sh /dev/sda会发生什么?
  • dinofizzotti.com/blog/… 类似的想法仅适用于拇指驱动器?
  • 我用它作为基础,仍然使用软盘,但我想扩展它,不知道去,所以将它重写到nodejs中,但无法获得运行我的idea角色新的播放器文件..

标签: javascript node.js linux bash udev


【解决方案1】:

如果您的脚本希望使用“DiskPlayer”主机名进行连接,那么问题可能出在您的主机文件上。见https://askubuntu.com/questions/466122/why-i-got-unable-to-resolve-host-when-i-do-sudo

如果这不是问题,如果你删除 test.sh 并直接调用 node,你会得到同样的错误吗?

cd /home/pi/SpotifyDisk-node

sudo -u pi node player.js file

.

【讨论】:

  • 嗨,是的,我在直接调用节点时遇到了同样的错误,但只有在使用 pi/sudo 通过 UDEV 正常运行时才会再次出现
  • 嗯。您是否尝试通过这样做将当前环境传递给 test.sh? sudo -E -u pi sh /home/pi/test.sh