dpkg sem shell

3

Como executar o dpkg sem shell?

Aqui está o meu problema:

Eu fiz e autorun.sh script na minha chave USB.

Para executar este script, criei regras em /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 chama meu autorun.sh localizado na minha chave USB.

Funciona bem, mas nesse script, tento executar o dpkg -i para instalar um repositório Debian e ele falha.

Após algumas pesquisas, tentei executar:

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

E eu tive o mesmo problema.

Então eu vi que dpkg parece precisar de um shell para ser executado.

Eu tentei 'dpkg-reconfigure --frontend = dialog debconf' 'e configurei o não-interativo, mas não parece funcionar nem um pouco.

Como posso executar dpkg -i do meu script autorun.sh ?

Aqui está o meu autorun.sh (na chave 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

Aqui está o meu usb_autorun.sh (no meu disco rígido):

 #!/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 $@ &
    
por Korigan 05.07.2012 / 13:43

1 resposta

1

Eu acho que o seu problema é esta linha:

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

BASH_SOURCE é uma "má substituição" para sh.

Por outro lado, encontrei isto:

link

udev does not run these programs on any active terminal, and it does not execute them under the context of a shell. Be sure to ensure your program is marked executable, if it is a shell script ensure it starts with an appropriate shebang (e.g. #!/bin/sh), and do not expect any standard output to appear on your terminal.

Então, basicamente, os problemas podem ser:

a) Você não está usando um shebang para o usb_autorun.sh e precisa adicionar #!/bin/bash para autorun.sh e usb_autorun.sh

b) tente esta linha e use #! / bin / sh em ambos autorun.sh e usb_autorun.sh:

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

Nota: Esta solução é um pouco insegura (qualquer um pode rodar qualquer coisa no autorun.sh e executá-la), mas em uma base local eu acredito que ela é inofensiva. No entanto, eu usaria algum outro nome em vez de "autorun.sh", como "install_deb.sh" - apenas para evitar scripts de malware.

    
por Savvas Radevic 05.07.2012 / 20:13