如果期望成功,如何捕获SFTP传输

时间:2013-07-16 16:34:23

标签: shell unix solaris sftp expect

我现在潜伏在这个网站上已经有一段时间了,因为我正在使用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

1 个答案:

答案 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"
    }
}