dpkg без оболочки

Как выполнить dpkg без оболочки?

Вот моя проблема:

Я сделал и 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 расположенный на моей флеш-карте.

Это работает хорошо, но в том сценарии, я пытаюсь работать dpkg -i для установки архива Debian и это перестало работать.

После некоторого исследования я пытался работать:

at -f /media/usb-key/autorun.sh -v 12:00

И у меня была та же проблема.

Таким образом, я видел это dpkg кажется, нуждается в оболочке, которая будет выполнена.

Я попробовал, 'dpkg-реконфигурировали - frontend=dialog debconf'' и настраивают неинтерактивная, но это не сделало, кажется, не работает ни один.

Как я могу работать dpkg -i от моего autorun.sh сценарий?

Вот мой autorun.sh (на флеш-карте):

#!/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 $@ &
3
задан 6 July 2012 в 16:53

1 ответ

Я думаю, что Вашей проблемой является эта строка:

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

BASH_SOURCE является "плохой заменой" на sh.

С другой стороны, я нашел это:

http://www.reactivated.net/writing_udev_rules.html#external-run

udev не запускает эти программы ни на каком активном терминале, и он не выполняет их под контекстом оболочки. Обязательно удостоверьтесь, что Ваша программа отмечена исполняемый файл, если это - сценарий оболочки, гарантируют, что это запускается с соответствующей хижины (например, #!/bin/sh), и не ожидайте, что любой стандартный вывод появится на Вашем терминале.

Таким образом, в основном проблемы могли быть:

a) Вы не используете хижину для usb_autorun.sh, и необходимо добавить #!/bin/bash и к autorun.sh и к usb_autorun.sh

b) попробуйте эту строку вместо этого и используйте #!/bin/sh и на autorun.sh и на usb_autorun.sh:

DIR=$( readlink -f "$( dirname "$0" )")

Примечание: Это решение немного небезопасно (Любой может выполнить что-либо в autorun.sh и выполнять его), но на локальной основе я полагаю, что это безопасно. Тем не менее, я использовал бы некоторое другое имя вместо "autorun.sh", такого как "install_deb.sh" - только для предотвращения любых вредоносных сценариев.

1
ответ дан 6 July 2012 в 16:53

Другие вопросы по тегам:

Похожие вопросы: