Bash脚本:使用Expect将文件发送到SFTP

Sql*_*ner 2 unix bash shell sftp expect

我必须从本地服务器向SFTP服务器发送一些压缩文件。

我的服务器信息

发行者ID:Ubuntu说明:Ubuntu 12.04.4 LTS版本:12.04代号:精确

创建了一个bash脚本,能够将文件发送到sftp,但是如果传输成功,我想发送电子邮件。

 #!/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
Run Code Online (Sandbox Code Playgroud)

现在,我希望上述传输是否成功,如果不成功,则发送成功电子邮件,并显示错误消息。

请帮忙!!

谢谢。

小智 5

您可以将错误信息从脚本传递到文件,然后使用grep通过第二个脚本传递错误信息。第二个脚本甚至可以运行第一个脚本,并且可能类似于以下内容:

/path/firstscript.sh 2>&1 > results.txt
if [ -n "$(grep 'error expected' results.txt)" ]
 then 
  echo "Found error" | mail -S "Error" you@example.com
 else
  echo "No error" | mail -s "Okay" you@example.com
 fi
Run Code Online (Sandbox Code Playgroud)

就个人而言,我发现最好通过执行第二个连接并在此处列出输出来检查目标站点上的文件。然后,我检查第二个连接日志中是否存在上载的文件。

我不能对我为文件传输编写脚本的三个不同的公司使用rsync或密钥身份验证,因此,我对那些回答“不这样做”的人表示同情。当您寻找答案时,情况会更糟,因为您已经知道人们的建议反而行不通。

以下示例基于我的实际工作而更加紧密:

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" you@example.com
 else
  echo "File not uploaded" |mail -s "Test fail" you@example.com
 fi
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)