2013-10-24 161 views
2

我有一個文件,有IP地址,文件和密碼的位置。我無法使用ssh密鑰驗證,這就是爲什麼我僅限於在bash腳本中使用expect。該文件包含的信息如下,用空格分隔:希望SSH無密碼

IP位置密碼

IP位置密碼

我的腳本是:

VAR=$(expect -c " 
     set fid [open "file.conf" w] 
     set content [read $fid] 
     close $fid 
     set records [split $content "\n"] 
     foreach rec $records { 
     set fields [split $rec] 
     lassign $fields\ ip location password 
     puts "$ip" 
     puts "$location" 
     puts "$password"} 
     spawn ssh $ip tail -f $location > /home/log_$ip 2>/dev/null & 
     expect { 
       ".*Are.*.*yes.*no.*" { send "yes\n" } 
       "*?assword:*" { send "$password\r" } 
      } 
    ") 

回聲「$ VAR 「

當我運行腳本時,它給我是錯誤:

錯誤#參數:應該是「讀取channelId?numChars?」或在執行 「讀?-nonewline?渠道ID」 「讀」 從 中調用「設置內容[閱讀]」

+0

可以請人幫我做尾巴-f在後臺運行 – user2864207

回答

1

您需要封閉預期體在單引號,所以預計不會擴展變量在期望開始執行之前由shell執行。另外,如果您點擊「是...是...否」提示,那麼您需要使用exp_continue,以便您可以繼續期待密碼提示。

請勿使用「w」打開配置文件 - 您將銷燬文件內容。你是從中讀取,所以打開閱讀

VAR=$(expect -c ' 
    set fid [open "file.conf" r] 
    while {[gets $fid line] != -1} { 
     lassign [split $line] ip location password 
     puts "$ip" 
     puts "$location" 
     puts "$password" 
     spawn ssh $ip tail -n 20 $location > /home/log_$ip 2>/dev/null & 
     expect { 
      -re "Are.*yes.*no" { send "yes\r"; exp_continue } 
      -gl "*?assword:*" { send "$password\r" } 
     } 
    } 
') 

我不知道,如果當你重定向輸出產卵這將工作:我擔心,預計將在什麼都沒有的工作。如果這也不行,刪除「> /home/log_$ip 2>/dev/null &」或使用

spawn ssh $ip tail -n 20 $location 2>/dev/null | tee /home/log_$ip 

利於讓一個後臺,你可能不得不這樣做(未經測試)

expect -c '...' > /home/log_$ip 2>&1 & 
expect_pid=$! 

# ... 

# later 
wait $expect_pid 
VAR=$(< /home/log_$ip) 
do something with "$VAR" 
+0

這看起來不錯,我實際上使用尾巴-f,我希望它在後臺運行,所以我添加&到你的線路spawn ssh $ ip tail -f $ location 2>/dev/null | tee/home/log_ $ ip,但它不起作用。 – user2864207

+0

如果我只能在後臺運行該命令,則您的答案非常有用。 – user2864207

+0

您可以在後臺啓動整個expect程序,但是$ VAR不會捕獲任何內容。 –