2013-07-16 44 views
0

因爲我在expect/SH腳本中執行SFTP,所以我在此站點潛伏了很長一段時間。由於我們無法訪問遠程服務器,所以我們正在考慮使用expect來爲SFTP提供密碼參數,因此SSH keygen不適用於我們。如何從預期成功捕獲SFTP傳輸

這是我正在處理的腳本,除了我想要捕獲或記錄到輸出文件(如果我的傳輸(「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 [email protected]$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

您應該使用看跌期權,而不是放我不會依賴於$ expect_out(緩衝)錯誤檢查。而是使用嵌套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" 
    } 
}