2015-04-02 38 views
0

我無法確定我在哪裏做錯了。請讓我知道如果我做錯了。我無法使用期望腳本連接sftp

#!/usr/bin/bash 

File_Sftp() 
{ 
    set user="xxxx" 
    set password="xxxxx" 
    set host="ftp.xxxx.xxxx.com" 

    STATUS=$(
    expect << EOF 
    spawn sftp [email protected]$host 
    expect "User Name:" 
    send "$user\r" 
    expect "Password:" 
    send "$password\r" 
    expect "sftp> " 
    send "cd in\r" 
    expect "sftp> " 
    send "get $1\r" 
    expect "sftp> " 
    send "exit\r" 
EOF 
    ) 

    if [ "$(echo $STATUS | grep -c 226)" -ge 1 ]; then 
     echo "Success"; 
    else 
     echo "Unsuccessful" ; 
    fi 
} 

File_Sftp "/usr/local/bin/xxxxxx.txt" 

每當我試圖執行上面的shell腳本我有以下錯誤:

send: spawn id exp4 not open 
    while executing 
"send "\r"" 
Unsuccessful 
+0

是它可能的證書是aski ng更新?我總是喜歡用'USER @ SERVER的密碼:'格式。 – mmmmmpie 2015-04-02 11:47:48

回答

2

這些慶典線不這樣做,你認爲:

set user="xxxx" 
set password="xxxxx" 
set host="ftp.xxxx.xxxx.com" 

他們不設置變量值,他們將位置參數$1設置爲給定的字符串。實際變量是仍然未設置

spawn就失敗嘗試推出sftp [email protected]$host(實際上sftp @與尚未設定的變量),該expect "User Name:"會後默認已超時10秒,然後將錯誤消息來自send "$user\r"(或send "\r"與尚未設定的變量) - - 沒有產生與之交互的過程。

你可以看到這一點,如果你使用expect -d <<EOF在測試(打開期望的詳細調試輸出)

你想

user="xxxx" 
password="xxxxx" 
host="ftp.xxxx.xxxx.com" 

或者,因爲這是bash中,我們要以促進良好的編程習慣(沒有全局變量)

local user="xxxx" 
local password="xxxxx" 
local host="ftp.xxxx.xxxx.com" 

添加


發送 「退出」 後,要查看是否 226出現在期望的輸出,我會改變這個

if [ "$(echo $STATUS | grep -c 226)" -ge 1 ]; then 

if grep -q '\<226\>' <<< "$STATUS" ; then 

if [[ $STATUS == *226* ]]; then