如何在没有 shell 的情况下运行 dpkg?
这是我的问题:
我在我的 USB 密钥中创建了 autorun.sh 脚本。
为了运行这个脚本,我创建了以下规则/etc/udev/rules/49-usb-rules
:
SUBSYSTEM=="block", KERNEL=="sd*1", ACTION=="add", RUN+="/bin/sh /opt/local/usb_autorun.sh %E{ID_FS_LABEL} %E{ID_FS_UUID}"
/opt/local/usb_autorun.sh
呼叫我autorun.sh
位于我的 USB 密钥上。
它运行良好,但是在该脚本中,我尝试运行dpkg -i
安装 Debian 档案但失败了。
经过一些研究,我尝试运行:
at -f /media/usb-key/autorun.sh -v 12:00
我也遇到了同样的问题。
所以我看到dpkg
似乎需要一个 shell 来运行。
我尝试了“dpkg-reconfigure --frontend=dialog debconf”并设置了非交互式,但它似乎也不起作用。
我怎样才能运行dpkg -i
我的autorun.sh
脚本?
这是我的 autorun.sh (在 USB 密钥上):
#!/bin/bash
touch /tmp/fic
echo "Installation du firmware" > /tmp/fic
DIR=$( readlink -f "$( dirname "$0" )")
export PATH=$PATH
/usr/bin/dpkg -i --force-all $DIR/radiolive.deb >> /tmp/fic 2>&1
echo "FIN" >> /tmp/fic
这是我的 usb_autorun.sh(在我的硬盘上):
#!/bin/bash
SCRIPT=autorun.sh
autorun() {
if [ -z ${1} ]; then
FILE=/media/${2}/${SCRIPT}
else
FILE=/media/${1}/${SCRIPT}
fi
sleep 10
if [ -f ${FILE} ]; then
/bin/bash ${FILE}
fi
}
autorun $@ &
答案1
我认为你的问题是这一行:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
BASH_SOURCE 是 sh 的“糟糕替代品”。
另一方面,我发现了这一点:
http://www.reactivated.net/writing_udev_rules.html#external-run
udev 不会在任何活动终端上运行这些程序,也不会在 shell 上下文中执行它们。请确保您的程序已标记为可执行,如果它是一个 shell 脚本,确保它以适当的 shebang 开头(例如#!/bin/sh),并且不要期望任何标准输出出现在您的终端上。
因此基本上问题可能是:
a) 您没有为 usb_autorun.sh 使用 shebang,您需要#!/bin/bash
同时添加到 autorun.sh 和 usb_autorun.sh
b) 尝试此行并在 autorun.sh 和 usb_autorun.sh 上使用 #!/bin/sh:
DIR=$( readlink -f "$( dirname "$0" )")
注意:此解决方案有点不安全(任何人都可以运行 autorun.sh 中的任何内容并使其执行),但我认为在本地它是无害的。不过,我会使用其他名称代替“autorun.sh”,例如“install_deb.sh”——只是为了避免任何恶意软件脚本。