一泌辫、概述
·我們通過Shell
可以實現(xiàn)簡單的控制流功能巩步,如:循環(huán)虱饿、判斷等哩俭。但是對于需要交互的場合則必須通過人工來干預绷跑,有時候我們可能會需要實現(xiàn)和交互程序如telnet
服務(wù)器等進行交互的功能。而expect
就使用來實現(xiàn)這種功能的工具凡资。
二砸捏、腳本代碼詳解
##############################################
#!/usr/bin/expect
set timeout 30
spawn ssh -l username 192.168.1.1
expect "password:"
send "ispass\r"
interact
##############################################
1·[#!/usr/bin/expect]
·這一行告訴操作系統(tǒng)腳本里的代碼使用那一個shell來執(zhí)行。這里的expect
其實和linux
下的bash
隙赁、windows
下的cmd
是一類東西垦藏。
·注意:這一行需要在腳本的第一行。
2.[set timeout 30]
·基本上認識英文的都知道這是設(shè)置超時時間的伞访,現(xiàn)在你只要記住他的計時單位是:秒
3.[spawn ssh -l username 192.168.1.1]
·spawn
是進入expect
環(huán)境后才可以執(zhí)行的expect
內(nèi)部命令膝藕,如果沒有裝expect
或者直接在默認的SHELL
下執(zhí)行是找不到spawn
命令的。所以不要用 “which spawn“
之類的命令去找spawn
命令咐扭。好比windows
里的dir
就是一個內(nèi)部命令,這個命令由shell自帶,你無法找到一個dir.com
或 dir.exe
的可執(zhí)行文件蝗肪。
·它主要的功能是給ssh
運行進程加個殼袜爪,用來傳遞交互指令。
4. [expect "password:"]
·這里的expect
也是expect
的一個內(nèi)部命令薛闪,有點暈吧辛馆,expect
的shell
命令和內(nèi)部命令是一樣的,但不是一個功能豁延,習慣就好了昙篙。這個命令的意思是判斷上次輸出結(jié)果里是否包含“password:”
的字符串,如果有則立即返回诱咏,否則就等待一段時間后返回苔可,這里等待時長就是前面設(shè)置的30秒
5. [send "ispass\r"]
·這里就是執(zhí)行交互動作,與手工輸入密碼的動作等效袋狞。
·溫馨提示: 命令字符串結(jié)尾別忘記加上 “\r”
焚辅,如果出現(xiàn)異常等待的狀態(tài)可以核查一下。
6. [interact]
·執(zhí)行完成后保持交互狀態(tài)苟鸯,把控制權(quán)交給控制臺同蜻,這個時候就可以手工操作了。如果沒有這一句登錄完成后會退出早处,而不是留在遠程終端上湾蔓。如果你只是登錄過去執(zhí)行一段命令就退出,可改為[expect eof]
三砌梆、實現(xiàn)演示
·1默责、首先創(chuàng)建一個expect
腳本ssh_expect
,文件內(nèi)容如下:
#!/usr/bin/expect -f
set hostname [lindex $argv 0]
set user [lindex $argv 1]
set passwd [lindex $argv 2]
set timeout 30
set force_conservative 1
if {$force_conservative} {
set send_slow {128 .1}
}
spawn ssh $user@$hostname;
expect {
"*continue connecting (yes/no)?" { send -s "yes\r"; exp_continue }
"*assword:" {
send -s "$passwd\r";
}
}
interact
·2么库、然后定義一些命令別名傻丝,比如:
alias h101='ssh_expect 192.168.0.101 <user> <password>'
alias h102='ssh_expect 192.168.0.102 <user> <password>'
這些別名可以寫到~/.bashrc
文件中
然后執(zhí)行 h101
就可以自動登錄192.168.0.101
機器了。
參考文獻:
http://www.jb51.net/article/72609.htm
http://www.cnblogs.com/Javame/p/4281637.html
http://www.linuxidc.com/Linux/2014-02/96262.htm
http://blog.csdn.net/zhuying_linux/article/details/6657020
http://www.cnblogs.com/iloveyoucc/archive/2012/06/25/2561179.html