1. 程式人生 > >expect檢查ssh登陸對端是否免密

expect檢查ssh登陸對端是否免密

由於公司專案,升級需要涉及到對端ssh過去取資料,但是如果碰到非免密登陸的,則會一直提示輸入密碼,卡死在程序裡面;

網上查詢思路,只有找到expect自動登陸;之前想過寫自動登陸指令碼,由於密碼不太確定,且防止洩密風險;沒有做

expect指令碼如下,使用方法:/usr/bin/expect expect.sh  $dstIp

 1 #/usr/bin/expect
 2 set dstIp [lindex $argv 0]
 3 set timeout 15
 4 spawn /usr/bin/ssh $dstIp
 5 expect {
 6     "*yes/no*" { send "
yes\r";exp_continue } 7 "*password*" { exit 126 } 8 "*Last login:*" { exit 0 } 9 timeout { exit 127 } 10 }

 lindex引數,argv從0開始,代表第一個引數

set引數,賦值

spawn引數,啟動後期引數,如果執行完需要直接互動,最後加上interact

expect捕獲結果,send引數,傳送指令

timeout設定超時時間,以秒為單位;如果不滿足其他條件,超過timeout就拖出

找了臺沒有設定免密登陸的機器,執行/usr/bin/expect expect.sh $dstIp

echo $?結果返回126;隨便發了個ip測試超時,返回127

皆大歡喜啊;以為就這麼完了;

然後再程式碼中執行,呼叫/usr/bin/expect expect.sh  $dstIp;悲催,一直都是返回0;

使用-x執行,檢視細節,發現執行進去了,然後就出來了,exit值收不到啊;

此刻開始懷疑人生,查詢expect的細節,-d可以檢視expect的細節;

呼叫/usr/bin/expect -d expect.sh  $dstIp,一陣莫名激動

發現所有的expect都執行了,就是走到  "*password*" { exit 126 }  然後退出了;

感覺exit 錯誤,應該沒有地方接收;怎麼辦,很絕望;

繼續學習expect,spawn類似起一個子程序,可能子程序還沒有結束,拿不到結果。

想到EOF,這個無底洞,肯定能夠塞進去一萬個結果了;

修改程式碼:

 1 #/usr/bin/bash
 2 desIp=$1
 3 /usr/bin/expect<<EOF
 4 set timeout 15
 5 spawn /usr/bin/ssh $dstIp
 6 expect {
 7       "*yes/no*" { send "yes\r";exp_continue }
 8       "*password*" { exit 126 }
 9       "*Last login:*" { exit 0 }
10       timeout { exit 127 }
11 }
12 expect eof
13 exit 0
14 EOF

呼叫指令碼,echo $?能夠拿到了,都正確;

激動激動,想到馬上嵌入到使用指令碼中

還是不行;絕望了;

最後沒辦法,只能不封裝介面了,把這段程式碼直接加入到指令碼之中,就ok了;

至此:還不明白為啥封成介面就不支援了??