无 shell 的 dpkg

无 shell 的 dpkg

如何在没有 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”——只是为了避免任何恶意软件脚本。

相关内容