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

时间:2014-07-10 23:08:52

标签: bash shell unix sftp expect

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

我的服务器信息

分销商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

现在我想要,如果上述转移成功,请发送成功电子邮件,如果没有失败电子邮件,则显示错误消息。

请帮助!!

感谢。

3 个答案:

答案 0 :(得分: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

就个人而言,我发现通过第二次连接并在那里列出输出来检查目标站点上的文件会更好。然后我检查第二个连接日志是否存在上传文件。

我无法对三个不同的公司使用rsync或密钥身份验证我编写文件传输,所以我对那些得到答案的人表示同情并且不会这样做#34;当他们问一个问题。当你正在寻找答案时,情况会更糟,因为你已经知道人们所推荐的内容却无法工作。

这里的示例更贴切地基于我的实际操作:

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

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

答案 1 :(得分:0)

sftp可以使用ssh密钥身份验证,这应该优于密码登录期望,正如您当前所做的那样。除了传递类似于rube goldberg装置的密码之外,在脚本中使用明文密码将成为每个系统管理员的噩梦。 作为替代方案,使用相同的身份验证机制,但非常易编,可以通过ssh和scp进行rsync。 scp和sftp只是ssh子系统,服务器端。 rsync可以使用ssh作为数据传输的隧道,并提供优于sftp或scp的几个优点。

答案 2 :(得分:-1)

sftp是交互式shell,当发生错误时,它会输出错误消息。

但很难解析错误信息。

在您的情况下,我建议使用scp(http://linux.die.net/man/1/scp)命令。

如果无法传输文件,scp会将错误代码返回给shell。