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.