【问题标题】:scp execution fails when when executed from a script after udev rule trigger - Script works if executed manually or through cron在 udev 规则触发后从脚本执行时,scp 执行失败 - 如果手动执行或通过 cron 执行脚本,则脚本有效
【发布时间】: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(网络命令)

标签: bash scp udev


【解决方案1】:

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

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

RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2023-03-06
    • 2013-02-20
    • 2018-04-29
    • 1970-01-01
    相关资源
    最近更新 更多