Как выполнить 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 $@ &
Я думаю, что Вашей проблемой является эта строка:
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" - только для предотвращения любых вредоносных сценариев.