Corrigir um script de shell antes de executar

2

Eu tenho um script de shell ( arch-chroot do Arch Linux arch-install-scripts pacote) que manipula a montagem e a desmontagem de dispositivos (com verificação de erros) antes de iniciar um chroot . Ele inicia o chroot na linha final com:

SHELL=/bin/sh unshare --fork --pid chroot "$chrootdir" "$@"

Para o meu caso de uso, gostaria de usar exatamente o mesmo script com um "patch" para a linha final

SHELL=/bin/bash chroot "$chrootdir" "$@"

Qual é a melhor maneira de fazer isso? Se for importante, o script arch-chroot precisa ser executado com privilégios de root. Agora eu só tenho uma cópia do script. Se o script original for atualizado, minha versão corrigida será "desatualizada". Eu estava pensando em fazer a cópia e o patch conforme necessário em um local temporário, mas não tenho certeza se isso é melhor.

Existe uma maneira de corrigir temporariamente um script no local?

O script original só será alterado quando o pacote ao qual ele pertence for atualizado. Meu objetivo é manter o script original inalterado, mas tenho um jeito de chamar uma versão com patch da versão mais recente do script original.

    
por StrongBad 28.01.2016 / 19:45

3 respostas

4

Uma solução simples e crua seria escrever um pequeno script que cria um arquivo temporário com a cópia modificada do original arch-chroot e, em seguida, executa o tmpfile. Por exemplo:

#!/bin/sh
scriptfile=$(mktemp /tmp/tempscript.XXXXX)
sed 's#SHELL=.*#SHELL=/bin/bash chroot "$chrootdir" "$@"#' /usr/bin/arch-chroot > $scriptfile

$scriptfile "$@"

Observe que isso pressupõe que haja apenas uma linha correspondente à string SHELL= em /usr/bin/arch-chroot e falhará silenciosamente se houver mais ou nenhum.

    
por 28.01.2016 / 20:13
2

Se o script que você está usando for fornecido na distribuição do SO, as chances de ele ser atualizado são muito altas. Eu sugiro que você escreva um script wrapper em torno deste original, que vai cortar a última linha do script original e acrescenta sua linha personalizada ao final. Em seguida, chama a cópia recém-criada. É a maneira mais simples na minha opinião.

mv original_script original_script.orig  # make a backup copy of original
sed -i '$ d' original_script.orig > original_script  # remove last line
echo 'SHELL=/bin/bash chroot "$chrootdir" "$@"' >> original_script # add your line to the end
original_script # run the script
mv original_script.orig original_script  #restore the original in place
    
por 28.01.2016 / 20:21
1

Crie seu próprio pacote modificado para isso. Tome cuidado para mantê-lo atualizado e, talvez, use algum hack específico de distribuição para evitar a atualização automática.

Eu não entendo o motivo da mudança que você propõe (nenhum conhecimento do Arch), mas à primeira vista é algo que você deve não fazer por motivos de segurança, ou talvez seu caso de uso é relevante o suficiente para garantir um patch upstream para permitir isso de alguma forma. Em qualquer um dos casos, sugiro que você converse com pessoas conhecedoras, através do sistema de solicitação de relatórios / aprimoramentos de bugs para sua distribuição.

Ou discuta aqui o que você quer realizar (não como você está tentando ir para lá, como essa pergunta faz).

    
por 28.01.2016 / 21:49