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