自動(dòng)登錄管理linux主機(jī)
- #!/usr/bin/expect -f
-
- set port port_no
- set user user_name
- set host host_name
- set password my_password
- set timeout -1
-
- spawn ssh -p$port $user@$host
- expect "*assword:*"
- send "$password\r"
- expect "*]#" send "ifconfig \r" expect "*]#" send "exit\r"
- expect eof
自動(dòng)上傳文件
- #!/usr/bin/expect -f
- #輸入分析儀ip以及需要上傳的文件名和TSMIS_ROOT環(huán)境變量
- set ip [lindex $argv 0]
- set localfile [lindex $argv 1]
- set TSMIS_ROOT [lindex $argv 2]
- #scp拷貝需要傳輸?shù)奈募街付夸洠⑶姨^(guò)手動(dòng)輸入部分
- spawn scp -r $localfile root@$ip:$TSMIS_ROOT/tmp/$localfile
- set timeout 300
- expect {
- "yes/no" {send "yes\r" ; exp_continue}
- "*assword:" {send "111111\n"}
- }
- set timeout 300
- send "exit\r"
- expect eof
expect的具體用法
- #!/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)腳本里的代碼使用那一個(gè)shell來(lái)執(zhí)行。這里的expect其實(shí)和linux下的bash、windows下的cmd是一類東西。
注意:這一行需要在腳本的第一行。
2. [set timeout 30]
基本上認(rèn)識(shí)英文的都知道這是設(shè)置超時(shí)時(shí)間的,現(xiàn)在你只要記住他的計(jì)時(shí)單位是:秒
3. [spawn ssh -l username 192.168.1.1]
spawn是進(jìn)入expect環(huán)境后才可以執(zhí)行的expect內(nèi)部命令,如果沒(méi)有裝expect或者直接在默認(rèn)的SHELL下執(zhí)行是找不到spawn命令的。所以不要用 “which spawn“之類的命令去找spawn命令。好比windows里的dir就是一個(gè)內(nèi)部命令,這個(gè)命令由shell自帶,你無(wú)法找到一個(gè)dir.com 或 dir.exe 的可執(zhí)行文件。
它主要的功能是給ssh運(yùn)行進(jìn)程加個(gè)殼,用來(lái)傳遞交互指令。
4. [expect "password:"]
這里的expect也是expect的一個(gè)內(nèi)部命令,有點(diǎn)暈吧,expect的shell命令和內(nèi)部命令是一樣的,但不是一個(gè)功能,習(xí)慣就好了。這個(gè)命令的意思是判斷上次輸出結(jié)果里是否包含“password:”的字符串,如果有則立即返回,否則就等待一段時(shí)間后返回,這里等待時(shí)長(zhǎng)就是前面設(shè)置的30秒
5. [send "ispass/r"]
這里就是執(zhí)行交互動(dòng)作,與手工輸入密碼的動(dòng)作等效。
溫馨提示: 命令字符串結(jié)尾別忘記加上 “/r”,如果出現(xiàn)異常等待的狀態(tài)可以核查一下。
6. [interact]
執(zhí)行完成后保持交互狀態(tài),把控制權(quán)交給控制臺(tái),這個(gè)時(shí)候就可以手工操作了。如果沒(méi)有這一句登錄完成后會(huì)退出,而不是留在遠(yuǎn)程終端上。如果你只是登錄過(guò)去執(zhí)行一段命令就退出,可改為[expect eof]
批量處理linux主機(jī)~
這個(gè)是expect腳本~

這個(gè)是要讓遠(yuǎn)程執(zhí)行的命令集

下面是批量執(zhí)行~
上面腳本中的自動(dòng)交互用到了expect,那么什么是expect呢?
expect是一個(gè)基于Tcl的用于自動(dòng)交互操作的工具語(yǔ)言,它適合用來(lái)編寫需要交互的自動(dòng)化腳本,比如上面提到的SSH輸入用戶名密碼,自動(dòng)FTP等等場(chǎng)景。
除了具有Tcl的語(yǔ)法,expect提供了幾個(gè)常用的命令:
1. send
用來(lái)發(fā)送一個(gè)字符串,比如 send "hello world"。
初始情況下,這個(gè)字符串會(huì)發(fā)送到標(biāo)準(zhǔn)輸出。如果你用的是max OSX或者linux,可以在Terminal下直接輸入expect命令并回車,就進(jìn)入了expect交互環(huán)境,此時(shí),輸入send "hello world"就可以看到結(jié)果。
一旦你的程序已經(jīng)與其他程序進(jìn)行交互,字符串就會(huì)被發(fā)送到其他程序那里。如上面的例子腳本中,我們調(diào)用send ”$password\r"就是把密碼發(fā)送給SSH連接的服務(wù)器端指定端口。
2. expect
與send相反,expect用來(lái)等待你所期望的字符串。比如expect "hello"
在expect后面跟的字符串中,你可以指定一個(gè)正則表達(dá)式。
expect會(huì)一直等待下去,除非收到的字符串與預(yù)期的格式匹配,或者到了超期時(shí)間。
3. spawn
spawn用來(lái)啟動(dòng)一個(gè)新的進(jìn)程,比如上面的spawn ssh -D $port $user@$host,Expect會(huì)執(zhí)行命令“ssh -D $port $user@$host”。
在交互式的場(chǎng)景中,當(dāng)你輸入命令后,可能服務(wù)器端會(huì)返回一些操作提示符,以讓你輸入命令。Expect提供了這樣三個(gè)常用的命令,spawn, expect和send,恰好滿足這種需要。把它們結(jié)合起來(lái)使用,可以實(shí)現(xiàn)很多簡(jiǎn)單的自動(dòng)化腳本。
其它常用的命令還有:interact,比如你通過(guò)腳本自動(dòng)連接到了某個(gè)ftp,并輸入了用戶名密碼,此時(shí)需要人工輸入一些命令,就可以使用interact命令,它會(huì)把腳本的控制權(quán)交給用戶;sleep,等待多少秒等等。
由于expect是從Tcl繼承下來(lái)的,所以也支持Tcl的語(yǔ)法和命令,比如變量聲明、流程控制等等。
上面腳本的一些解釋:
1. set timeout 300:設(shè)置超時(shí)時(shí)間300s。如果設(shè)為-1,代表永不超時(shí)。
2. expect eof:等待接受文件結(jié)束符。
|
本文出自:億恩科技【1tcdy.com】
服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|