0

我在这个网站上潜伏了很长一段时间,因为我在一个期望/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
4

1 回答 1

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"
    }
}
于 2014-01-21T12:46:50.757 回答