Problema com o caractere ':' no script Bash sobre o SSH

2

Atualmente, estou escrevendo um script que executará backups em um conjunto de bancos de dados, os conectará, criptografará, transferirá para uma máquina de armazenamento separada e verificará se o arquivo foi executado com êxito. Eu posso criar o backup e executar a compactação e criptografia padrão para que ele possa ser transferido e armazenado com segurança no local secundário. Depois disso, ssh é usado para verificar se existe um diretório na máquina de destino ou para forçar a criação desse diretório, então eu uso scp para transferir o arquivo e, por último, outro ssh para verificar se o arquivo existe o outro lado.

Isso funcionou bem no passado, mas foi feita uma alteração no script para incluir um registro de data e hora no nome do arquivo (além do registro de data existente) e os caracteres : nesse registro de data e hora estão causando a transferência para falha sob a scp transfer e o seguinte ssh para testar a existência do arquivo.

Atualmente, estou criando uma variável DATE na parte superior do script e configurando-a para o seguinte: $(date --date=today +%FT%H:%M:%S%z) , que produz um registro de data na correta ISO 8601 . Isso funciona bem para criar os despejos de banco de dados (postgres dumps criados com pg_dump ), bem como a compactação com gzip e a criptografia com openssl . Cada um deles gera um novo arquivo, com todos os nomes no formato HOSTNAME.DATABASE-dump-DATE.EXTENSION .

Quando a data estava sendo fornecida para o nome do arquivo sem o tempo e, portanto, sem o caractere : , funcionava perfeitamente. Os erros específicos que recebo agora que há : caracteres estão nos segmentos de código a seguir ( $1 refere-se ao argumento fornecido ao script, contendo o nome do banco de dados a ser salvo em backup e $ DATE foi definido acima ):

scp -P PORT "$(hostname).$1-dump-$DATE.backup.gz.aes" USER@HOST:"/backups/$(hostname)/"

Isso falha com o erro ssh: could not resolve hostname HOSTNAME.DATABASE-dump-2015-07-31T13: Name or service not known .

ssh HOST -p PORT <<"HERE"
if test -f /backups/$(hostname)/$(hostname).$1-dump-$DATE.backup.gz.aes;
then echo "File exists";
else echo "Transfer failed";
fi
HERE

Isso falha com Pseudo-terminal will not be allocated because stdin is not a terminal . Usar -t produz o mesmo erro e usar -t -t (a partir de informações encontradas em stackoverflow que levam à discussão sobre o Pseudo -terminal) não permite que os comandos dados após fluir, o que é provavelmente algo que eu perdi sobre o que realmente faz.

Eu gostaria de evitar o uso de qualquer software adicional que precisaria ser instalado nas máquinas (executando o Ubuntu 14.04 e o mais recente Postgresql para DB). Por favor, deixe-me saber se há alguma maneira scp/ssh pode ser feito para lidar com esses arquivos corretamente.

    
por Stephen Ross II 31.07.2015 / 16:40

1 resposta

5
scp -P PORT "$(hostname).$1-dump-$DATE.backup.gz.aes" USER@HOST:"/backups/$(hostname)/"

O Scp suporta a cópia de arquivos de um host remoto para outro, e a sintaxe para isso é especificar a origem e o destino usando a sintaxe "hostname: filename":

scp srchost:/src/file desthost:/dest/file

Seu arquivo de origem tem dois pontos em seu nome, então scp está tentando analisá-lo como nome de host e nome de arquivo de um arquivo remoto.

Você pode evitar que o scp trate o argumento do nome do arquivo de origem como um nome de arquivo remoto, certificando-se de que o argumento tenha um "/" antes dos dois primeiros pontos. Hostnames não podem ter "/" neles, e scp pára procurando por dois-pontos em um argumento de linha de comando após o primeiro "/". Isso deve funcionar:

scp -P PORT "./$(hostname).$1-dump-$DATE.backup.gz.aes" USER@HOST:"/backups/$(hostname)/"
             ^^-- Prepend a ref to the current directory
    
por 01.08.2015 / 15:17