A intenção desse blog sempre foi “guardar” para o futuro e obviamente compartilhar coisas que aprendemos no dia-a-dia do trabalho em TI.
Nesse post esta detalhado um script simples que criei para transferir arquivos, via terminal, por SFTP entre dois servidores Unix – poderia ser Linux. O script é bem simples, mas a intenção de publica-lo foi explicar os macetes:
#!/usr/bin/bash
SFTP_USER=usuario
SFTP_HOST=10.0.0.1
SFTP_PASS=senha
SFTP_SRHOME=/home/origem
BATCH_FILE=batchtemp
DATE_WORK=`TZ=EST26EDTdate +%Y%m%d`
DEST_DIR=/home/destino
LOG_FILE=./log-`date +%Y%m%d%k%M%S`.log
function createBatchFile {
cp /dev/null $BATCH_FILE
echo "cd $DEST_DIR" > $BATCH_FILE
for foundedFiles in `find $SFTP_SRHOME -name "*_$DATE_WORK_*" -exec ls -tr {} \;`
do
echo "put $foundedFiles" >> $BATCH_FILE
done
echo "bye" >> $BATCH_FILE
}
function sendFTP {
expect &> ${LOG_FILE} <<EOF
spawn sftp -oBatchMode=no -b $BATCH_FILE $SFTP_USER@$SFTP_HOST
expect {
"password:"
{
send "${SFTP_PASS}\n"
}
}
expect eof
EOF
}
createBatchFile
sendFTP
Explicando:
Endereço do servidor remoto – para onde irão ser transferidos os arquivos:
SFTP_HOST=10.0.0.1
Usuário do SFTP que irá se conectar no servidor remoto:
SFTP_USER=usuario
Senha do usuário de SFTP:
SFTP_PASS=senha
Local onde estão os arquivos que serão transferidos:
SFTP_SRHOME=/home/origem
Arquivo temporário que irá armazenar os comandos do SFTP:
BATCH_FILE=batchs=/home/origem
Data do dia anterior no formato AAAAMMDD:
DATE_WORK=`TZ=EST26EDT date +%Y%m%d`
Diretório destino dos arquivos a serem transferidos:
DEST_DIR=/home/destino
Arquivo que irá guardar o histórico da transferência, o nome do arquivo ser “log-AAAAMMDDHHMMSS.log”:
LOG_FILE=./log-`date +%Y%m%d%k%M%S`.log
Função que cria o arquivo temporário com os comandos do SFTP:
function createBatchFile {
Cria ou zera o arquivo de batch:
cp /dev/null $BATCH_FILE
Inclui ao arquivo de batch a instrução para mudar de diretório do servidor de destino:
echo "cd $DEST_DIR" > $BATCH_FILE
Traz uma lista de arquivos que contenham em seu nome a data do dia anterior e os armazena na variável foundedFiles, um detalhe importe é o “do” na linha seguinte, isso é obrigatório! Caso se deseje o “do” na mesma linha do “for” é necessário haver um “;”, ou seja “for foundedFiles in `find $SFTP_SRHOME -name “*_$DATE_WORK_*” -exec ls -tr {} \;`; do”
Em seguida é adicionado ao arquivo de batch o comando “put <nome do arquivo a ser transferido>” :
for foundedFiles in `find $SFTP_SRHOME -name "*_$DATE_WORK_*" -exec ls -tr {} \;`
do
echo "put $foundedFiles" >> $BATCH_FILE
done
Finaliza o arquivo batch com a instrução de saída do SFTP.
echo "bye" >> $BATCH_FILE
Função que efetivamente envia os arquivos, a função o comando SFTP se conecta ao servidor remoto e executa as instruções do arquivo batch
function sendFTP {
O comando expect cria um espécie de robô que responde aos prompts do aplicativo, nesse caso ele faz log no arquivo LOG_FILE. É interessante notar que a opção “&>” diz que a saída padrão e de erro são armazenadas nesse mesmo arquivo:
expect &> ${LOG_FILE} <<EOF
A diretiva spawn habilita o preenchimento automático de prompts de aplicação, como uma espécie de robô. Nesse caso o SFTP solicita a senha do usuário com “password:” e a instrução send envia a resposta ao prompt
O “expect eof” aponta o final do tratamento de prompts, e o EOF termina o expect, importante o EOF tem que estar na primeira coluna, ou seja, não pode estar identado:
expect eof
EOF
As linhas abaixo executam as funções:
createBatchFile sendFTP