【发布时间】:2021-03-15 04:37:34
【问题描述】:
晚上好 我在一台旧笔记本电脑上设置了 proxmox 服务器,在那里我运行了几个虚拟机。我创建了一个 udev 规则,用于在断电时将文件(uevent)从主机(Proxmox)复制到 VM 之一(家庭助理) 我遇到的问题是当 udev 执行脚本时 scp 行超时。
从主机到虚拟机的 ssh 工作正常,我什至可以手动运行 scp 命令:
/usr/bin/scp -v /root/uevent1.json root@192.168.7.48:/root/config/BAT1
我也可以运行 udev 应该执行的脚本并且工作正常(batupdate1.sh):
#!/usr/bin/bash
FILE=/sys/class/power_supply/BAT1/uevent
awk -F'=' 'BEGIN {printf "{"} /POWER_SUPPLY/ {printf "\"" $1 "\":\"" $2 "\","} END {print "}"}' $FILE | sed 's/,}/}/' >/root/uevent1.json
/usr/bin/scp -v /root/uevent1.json root@192.168.7.48:/root/config/BAT1
udev 规则:
SUBSYSTEM=="power_supply", ACTION=="change", RUN+="/usr/local/bin/batupdate1.sh"
这是这个特定脚本的系统日志的样子:
: ADP1: RUN '/usr/local/bin/batupdate1.sh' /etc/udev/rules.d/80-local.rules:2
: Starting '/usr/local/bin/batupdate1.sh'
: '/usr/local/bin/batupdate1.sh'(err) 'Executing: program /usr/bin/ssh host 192.168.7.48, user root, command scp -v -t /root/config/BAT1'
: '/usr/local/bin/batupdate1.sh'(err) 'OpenSSH_7.9p1 Debian-10+deb10u2, OpenSSL 1.1.1d 10 Sep 2019'
: '/usr/local/bin/batupdate1.sh'(err) 'debug1: Reading configuration data /root/.ssh/config'
: '/usr/local/bin/batupdate1.sh'(err) 'debug1: Reading configuration data /etc/ssh/ssh_config'
: '/usr/local/bin/batupdate1.sh'(err) 'debug1: /etc/ssh/ssh_config line 19: Applying options for *'
: '/usr/local/bin/batupdate1.sh'(err) 'debug1: Connecting to 192.168.7.48 [192.168.7.48] port 22.'
: Spawned process '/usr/local/bin/batupdate1.sh' [30840] is taking longer than 59s to complete
: '/usr/local/bin/batupdate1.sh'(err) 'debug1: connect to address 192.168.7.48 port 22: Connection timed out'
: '/usr/local/bin/batupdate1.sh'(err) 'ssh: connect to host 192.168.7.48 port 22: Connection timed out'
: '/usr/local/bin/batupdate1.sh'(err) 'lost connection'
: Process '/usr/local/bin/batupdate1.sh' failed with exit code 1.
我已经尝试了一切,启动并重新启动了 udev 服务,整个服务器,当从 udev 触发器调用时,似乎没有任何东西可以使脚本从脚本中工作
任何帮助将不胜感激 谢谢!
【问题讨论】:
-
你用什么用户测试了这个,你的脚本以什么用户身份运行(即 id > /tmp/id.log)? IE。确认两者都是root。我的猜测是您的 udev 脚本没有发出网络请求的能力(权限)。只是为了好玩,如果您通过
at now运行命令,它是否手动工作?如果是这样,如果您使用at now从 udev 运行它,它是否有效? -
askubuntu.com/questions/1166849/… 似乎表明上述内容是正确的:“请注意,由于默认沙箱,在 udev 规则中不允许运行访问网络或挂载/卸载文件系统的程序这是在 systemd-udevd.service 上强制执行的。”
-
嗨,Allan,该进程使用 root 运行脚本。如果通过
at now手动执行,它也可以工作,但是如果在 udev 规则中使用它会失败,所以我认为你是对的,udev 触发器中不允许使用 scp(网络命令)