我现在潜伏在这个网站上已经有一段时间了,因为我正在使用expect / SH脚本进行SFTP。 SSH keygen对我们来说不是一个选项,因为我们无法访问远程服务器,所以我们正在考虑使用expect为SFTP提供密码arg。
这是我正在处理的脚本,一切都在这里工作,除非我想要捕获或登录到输出文件,如果我的传输(“mput”)成功完成。关于在“mput”之后输入什么代码的任何建议,因为如果我之后添加了expect_out(缓冲区),它就会失败。
#!/bin/ksh
DIRROOT=/apps/gen/e2k/sys/bpp
COPYDIR=$DIRROOT/SENT
FILEHASH=TEST.SOME.FILE.*
if [ ! -f $COPYDIR/$FILEHASH ]; then
echo "No File"
fi
# New FTP credential from GIC
FTPSERV=**********
FTPUSER=**********
FTPPWD=**********
FTPDIR=/to-scs
/usr/local/bin/expect -f - <<EOFEXPECT1
#exp_internal 1
set timeout -1
set log [open "/dir/dir1/dir2/MIKETEST.txt" w]
spawn sftp -oPort=10022 $FTPUSER@$FTPSERV
expect "password:"
send "$FTPPWD\r";
expect "sftp> "
send "lcd $COPYDIR \r";
expect "sftp> "
send "cd /recipient \r";
expect "sftp> "
send "mput TEST.SOME.FILE.*\r";
put $log $expect_out(buffer)
close $log
expect "sftp> "
send "bye\r";
expect eof
EOFEXPECT1
if [ $? -eq 0 ]
then
echo "success"
else
echo "fail"
fi
答案 0 :(得分:1)
你应该使用puts而不是put,我不会依赖$ expect_out(buffer)来进行错误检查。而是使用嵌套的expect语句来捕获常见的sftp场景/错误。
set timeout -1
send "mput TEST.SOME.FILE.*\r";
expect {
#Check for progress, note does not work with all versions of SFTP
#If a match is found restart expect loop
-re "\[0-9]*%" {
set percent $expect_out(0,string)
puts $logf "File transfer at $percent, continuing..."
exp_continue
}
#Check for common errors, by no means all of them
-re "Couldn't|(.*)disconnect|(.*)stalled" {
puts $logf "Unable to transfer file"
exit 1
}
#OK continue
"sftp>" {
puts $logf "File transfer completed"
}
}
最后,我不建议使用超时-1(从不),因为这会迟早导致卡住的过程。而是让我们使用超时值并捕获在期望块中发生超时的可能性。
set timeout 60
expect {
#Process timed out
timeout {
puts $logf "File transfer timed out"
}
}