Programa da Bash: enviar os ficheiros para o SFTP usando o Expect

Tenho de enviar alguns ficheiros gzipados do servidor local para o servidor SFTP.

A Informação Do Meu Servidor

distribuidor ID: Ubuntu Descrição: Ubuntu 12.04.4 LTS Libertação: 12.04 Nome de código: preciso

criou um script bash e poderia enviar arquivos para sftp, mas eu quero enviar e-mail se a transferência for bem sucedida.

 #!/bin/bash
 HOST=hostname.domain
 PORT=22
 USER=username
 PASSWORD=password
 SOURCE_FILE=path/filename
 TARGET_DIR=PATH

 /usr/bin/expect<<EOD

 spawn /usr/bin/sftp -o Port=$PORT $USER@$HOST
 expect "password:"
 send "$PASSWORD\r"
 expect "sftp>"
 send "put $SOURCE_FILE $TARGET_DIR\r"
 expect "sftp>"
 send "bye\r"
 EOD

Agora eu quero se a transferência acima é sucesso enviar email de sucesso se não falha email com mensagem de erro.

Por favor. Socorro!!

Obrigado.

Author: John O, 2014-07-11

3 answers

Poderá transferir a informação de erro do seu programa para um ficheiro e grep para um erro com um segundo programa. O segundo script poderia até executar o primeiro e poderia parecer algo assim:

/path/firstscript.sh 2>&1 > results.txt
if [ -n "$(grep 'error expected' results.txt)" ]
 then 
  echo "Found error" | mail -S "Error" [email protected]
 else
  echo "No error" | mail -s "Okay" [email protected]
 fi
Pessoalmente, acho melhor verificar o ficheiro no local de destino, fazendo uma segunda ligação e listando o resultado lá. Depois verifico o segundo registo de ligações para verificar a existência do ficheiro carregado. Não posso usar rsync ou autenticação de chaves com três empresas diferentes. transferência de arquivo de script para, então eu tenho alguma simpatia para as pessoas que recebem a resposta "não faça isso" quando eles fazem uma pergunta. É pior quando se está à procura da resposta Porque já se sabe que o que as pessoas recomendam não vai funcionar. Aqui estão exemplos mais próximos baseados no que eu realmente faço:

Email_result.bash

#!/bin/bash
./uploadfile_example.bash 2>&1 > log.txt
if [ -n "$(grep "$(date +%b' '%d)" log.txt|grep "testfile")" ]
 then
  echo "File uploaded" |mail -s "Test success" [email protected]
 else
  echo "File not uploaded" |mail -s "Test fail" [email protected]
 fi

Uploadfile_example.bash

#!/bin/bash
datestamp=$(date +%s)
/bin/cp -v testfile.txt testfile.${datestamp}.txt
HOST="localhost"
USER="testuser"
PASS="YourPasswordHere"

expect -c "
spawn sftp ${USER}@${HOST}
expect \"password: \"
send \"${PASS}\r\"
expect \"sftp>\"
send \"put testfile.${datestamp}.txt\r\"
expect \"sftp>\"
send \"ls -l testfile.${datestamp}.txt\r\"
expect \"sftp>\"
send \"bye\r\"
expect \"#\"
"

/bin/rm -vf testfile.${datestamp}.txt
 3
Author: Ancientt, 2016-10-17 19:13:46

O Sftp é uma shell interactiva, e quando ocorre um erro, imprime mensagens de erro.

Mas é difícil processar a mensagem de erro.

No seu caso, recomeço a usar o scp ( http://linux.die.net/man/1/scp comando.

Quando não conseguir transferir o ficheiro, o scp irá devolver o código de erro à shell.

 0
Author: ganachoco, 2014-07-11 01:28:57

O Sftp pode usar a autenticação da chave ssh, que deverá ser preferível ao login da senha através do expect, como está a fazer actualmente. Além de passar a senha que se assemelha a uma geringonça de Rube goldberg, ter senhas de texto simples em um script seria um pesadelo de todos os administradores de Sistema. Como alternativas, usando o mesmo mecanismo de autenticação, mas muito scriptável, são rsync sobre SSH, e scp. scp e sftp são apenas subsistemas ssh, lado do servidor. o rsync pode usar o SSH como túnel para dados transfere e oferece várias vantagens sobre a sftp ou a scp.

 0
Author: Deleted User, 2014-07-11 20:59:07