【问题标题】:How to capture SFTP transfer if successful from expect如果预期成功,如何捕获 SFTP 传输
【发布时间】:2013-07-14 23:11:45
【问题描述】:

我在这个网站上潜伏了很长一段时间,因为我在一个 expect/SH 脚本中做一个 SFTP。 SSH keygen 对我们来说不是一个选项,因为我们无法访问远程服务器,所以我们正在研究使用 expect 来为 SFTP 提供密码 arg。

这是我正在处理的脚本,除了我想在传输(“mput”)成功完成时捕获或记录到输出文件之外,一切正常。关于在“mput”之后放置什么代码的任何建议,因为如果我在之后添加一个 expect_out(buffer),它就会失败。

#!/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

【问题讨论】:

    标签: shell unix solaris sftp expect


    【解决方案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"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多