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了;
至此:還不明白為啥封成介面就不支援了??