在 udev 规则触发后从脚本执行时,scp 执行失败 - 如果手动或通过 cron 执行,脚本有效

问题描述

晚上好 我在一台旧笔记本电脑上设置了 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 触发器调用时,似乎没有任何东西使 scp 从脚本中工作

任何帮助将不胜感激 谢谢!

解决方法

Per man udev(7):“请注意,由于 systemd-udevd.service 强制使用默认沙箱,因此在 udev 规则中不允许运行访问网络或挂载/卸载文件系统的程序”。>

实现该限制的配置文件似乎是 /lib/systemd/system/systemd-udevd.service

RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...