0

私は、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
4

1 に答える 1

1

put の代わりに puts を使用する必要があり、エラー チェックのために $expect_out(buffer) に依存しません。一般的な sftp シナリオ/エラーをトラップするには、ネストされた expect ステートメントを使用します。

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 (決して) のタイムアウトを使用することはお勧めしません。これは遅かれ早かれプロセスのスタックにつながるためです。むしろ、タイムアウト値を作成し、expect ブロックでタイムアウトが発生する可能性をトラップします。

set timeout 60
expect {
    #Process timed out
    timeout {
       puts $logf "File transfer timed out"
    }
}
于 2014-01-21T12:46:50.757 に答える