rm ou wget falha no script baseado em uma variável com um glob

1

Estou tendo problemas com um nome de arquivo glob em rm ou com uma expansão de variável em wget .

No Ubuntu 16.04, fiz o seguinte:

set -a
export drt="/var/www/html"
export pma="[pP][hH][pP][mM][yY][aA][dD][mM][iI][nN]"
set +a
echo $drt # Got the above.
echo $pma # Got the above.

Em seguida, executei um script executável ( ~/myScripts/tp_pma.sh ):

#!/bin/bash
rm -rf ${drt}/${pma}*
wget -P ${drt} https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
unzip ${drt}/${pma}*.zip
mv ${drt}/${pma}*/ ${drt}/phpmyadmin/
rm ${drt}/${pma}*.zip

O script foi bem-sucedido parcialmente:

  1. O primeiro rm pode ter tido sucesso ou pode ter causado todos os problemas abaixo.
  2. O wget foi parcialmente concluído - um zip com uma nova cópia do PMA foi baixado para o meu diretório inicial, em vez de drt .
  3. O unzip foi bem-sucedido, o zip foi descompactado e recebi um diretório phpmyadmin mais recente.
  4. O mv falhou (veja o erro abaixo). Como o diretório phpMyAdmin-4.7.7-all-languages permaneceu no meu diretório inicial: ele não foi movido para drt e não teve seu nome alterado para phpmyadmin como eu esperava.
  5. O último rm foi bem-sucedido - o zip foi excluído no meu diretório pessoal.

Não recebi um erro fr wget .

Além disso, parece que o valor de pma mudou de alguma forma para phpMyAdmin-4.7.7-all-languages . Eu não mudei para esse valor.

O que é provável que tenha falhado aqui e por quê?

    
por user9303970 11.02.2018 / 19:58

2 respostas

1

O comando unzip que você usou extrai o arquivo no diretório unzip é executado, não onde está o arquivo. Você pode alterar para o diretório que contém o archive primeiro ou usar the -d option :

[-d exdir]
An optional directory to which to extract files. By default, all files and subdirectories are recreated in the current directory;

Eu provavelmente usaria a opção chdir:

#!/bin/bash
cd "$drt"
rm -r ${pma}*
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
unzip phpMyAdmin-latest-all-languages.zip
mv ${pma}*/ phpmyadmin/
rm phpMyAdmin-latest-all-languages.zip

Além disso, quando você diz "o valor de pma mudou de alguma forma para phpMyAdmin-4.7.7-all-languages ", observe que usar a variável sem aspas fará com que seja usado como um padrão de nome de arquivo, portanto echo $pma* mostrará os nomes de os arquivos existentes, se algum deles corresponder ao padrão.

(Não tenho certeza se o padrão não diferencia maiúsculas de minúsculas é necessário; há uma razão realista para esperar que o formato do nome mude de phpMyAdmin para phpmyadmin ?)

    
por 11.02.2018 / 20:09
1

Sugestão de script alternativo:

#!/bin/sh -ex

destdir="/var/www/html/phpmyadmin"

tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT    # remove temporary directory on termination

wget -O "$tmpdir/archive.zip" \
    "https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip"

cd "$tmpdir" && {
    unzip archive.zip
    rm -f archive.zip

    # The only thing in the current (temporary) directory now is the
    # directory with the unpacked zip file.

    mkdir -p "$destdir"
    mv ./* "$destdir"/
}

Se o arquivo for descompactado em um subdiretório chamado phpMyAdmin-4.7.7-all-languages , o script moverá para /var/www/html/phpmyadmin , para que o conteúdo do arquivo fique disponível em /var/www/html/phpmyadmin/phpMyAdmin-4.7.7-all-languages .

O -ex faz o script

  1. Saia assim que um utilitário falhar ( -e ) e
  2. Informações de rastreamento de saída que podem ser úteis ( -x ).

A execução deste script duas vezes fará com que o último mv falhe, pois já existe um diretório com o mesmo nome no destino. O diretório existente em $destdir não será modificado por este script.

Quando o script terminar, terminar devido a um erro ou for eliminado, o script removerá o diretório temporário usado para armazenar e descompactar o arquivo baixado.

Sobre root e segurança neste script:

Se forem necessárias permissões de root para escrever para $tmpdir , então não execute o script como root! Em vez disso, insira sudo na frente do último mv .

Existe, o que eu posso ver, nenhum risco de qualquer remoção acidental ser realizada, pois o único parâmetro é $destdir e nunca é usado em nenhum comando rm $var1/$var2* -type. De fato, a desativação de $destdir fará com que o script falhe normalmente em mkdir .

    
por 11.02.2018 / 20:51