偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Expect 技巧大揭秘:輕松應(yīng)對腳本中的交互挑戰(zhàn)

運(yùn)維 自動(dòng)化
簡單來說,Expect程序用于自動(dòng)處理通常需要人工操作的交互式任務(wù),比如在使用SSH或FTP時(shí)自動(dòng)輸入指令,從而實(shí)現(xiàn)更自動(dòng)化的運(yùn)維工作。

什么是Expect

Expect 是一個(gè)很實(shí)用的工具,能幫我們自動(dòng)完成那些需要手動(dòng)交互的任務(wù)。簡單來說,它就是用來讓這些交互過程自動(dòng)化的。它是用TCL這種腳本語言寫的,既容易學(xué)又功能強(qiáng)大。

為什么要使用Expect

現(xiàn)在的企業(yè)運(yùn)維里,自動(dòng)化運(yùn)維越來越流行了。但有時(shí)候,系統(tǒng)在執(zhí)行某些命令或程序時(shí),還是會要求運(yùn)維人員手動(dòng)輸入一些信息才能繼續(xù)。比如,給用戶設(shè)置密碼的時(shí)候,通常需要手動(dòng)輸入兩次密碼。如下所示:

[root@didiplus ~]# passwd root
Changing password for user oldboy.
New password:          #<需要手工輸入密碼。
Retype new password:   #<需要再次手工輸入密碼。
passwd: all authentication tokens updated successfully.

比如說,當(dāng)你第一次用SSH遠(yuǎn)程連接到服務(wù)器時(shí),你需要進(jìn)行兩次輸入操作,如下所示:

[root@didiplus ~]# ssh root@192.168.33.130
The authenticity of host'192.168.33.130 (192.168.33.130)' can't be established.
RSA key fingerprint is fd:2c:0b:81:b0:95:c3:33:c1:45:6a:1c:16:2f:b3:9a.
Are you sure you want to continue connecting (yes/no) yes  #<需要手工輸入yes。
Warning: Permanently added '192.168.33.130' (RSA) to the list of known hosts.
root@192.168.33.130's password:                         #<需要手工輸入密碼。
Last login: Tue Oct 11 00:06:35 2016 from 192.168.33.128
[root@node ~]#

通過上面的例子,大家應(yīng)該都清楚為什么需要用Expect程序了。簡單來說,Expect程序用于自動(dòng)處理通常需要人工操作的交互式任務(wù),比如在使用SSH或FTP時(shí)自動(dòng)輸入指令,從而實(shí)現(xiàn)更自動(dòng)化的運(yùn)維工作。

安裝Expect軟件

首先,確保你的機(jī)器能正常上網(wǎng),并設(shè)置好yum的安裝源。接著,運(yùn)行yum install expect -y命令來安裝Expect軟件。如下所示:

[root@didiplus ~]# rpm -qa expect         #<檢查是否安裝。
[root@didiplus ~]# yum install expect -y  #<執(zhí)行安裝命令。
[root@didiplus ~]# rpm -qa expect         #<==再次檢查是否安裝。
expect-5.44.1.15-5.el6_4.x86_64

案例演示

首先,請準(zhǔn)備好兩臺虛擬機(jī)或真實(shí)服務(wù)器。具體的IP地址和主機(jī)名信息如下:

IP地址

主機(jī)名

192.168.33.128

didiplus

192.168.33.130

node1

在運(yùn)行下面的例子前,先手動(dòng)在128這臺服務(wù)器上執(zhí)行以下命令:

ssh  root@192.168.33.130 uptime#<==連接到130上查看負(fù)載值。

執(zhí)行結(jié)果如下:

[root@didiplus ~]# ssh  root@192.168.33.130 uptime
The authenticity of host'192.168.33.130 (192.168.33.130)' can't be established.
RSA key fingerprint is fd:2c:0b:81:b0:95:c3:33:c1:45:6a:1c:16:2f:b3:9a.
Are you sure you want to continue connecting (yes/no) yes #<根據(jù)提示手工輸入yes。
Warning: Permanently added '192.168.33.130' (RSA) to the list of known hosts.
root@192.168.33.130's password    #<手工輸入密碼。
21:20:35 up 1 day,  9:08,  1 user,  load average: 0.08, 0.02, 0.01

每次執(zhí)行ssh命令時(shí),都得手動(dòng)輸入密碼,不然就用不了。接下來,咱們試試用Expect這個(gè)工具來自動(dòng)處理這個(gè)過程,讓它自動(dòng)填入密碼并運(yùn)行ssh命令。

[root@didiplus ~]# cat didiplus.exp      #<擴(kuò)展名使用exp代表是Expect腳本。
#!/usr/bin/expect      #<腳本開頭解析器,和Shell類似,表示程序使用Expect解析。
spawn ssh root@192.168.33.130 uptime#<執(zhí)行ssh命令(注意開頭必須要有spawn,
                                            否則無法實(shí)現(xiàn)交互)。
expect"*password"#<利用Expect獲取執(zhí)行上述ssh命令輸出的字符串是否為期待的
                               字符串*password,這里的*是通配符。
send "123456\n"#<當(dāng)獲取到期待的字符串*password時(shí),則發(fā)送123456密碼給系統(tǒng),\n為換行。
expect eof     #<處理完畢后結(jié)束Expect。

執(zhí)行腳本:

[root@didiplus ~]# which expect
/usr/bin/expect
[root@didiplus ~]# expect didiplus.exp   #<使用Expect執(zhí)行腳本是個(gè)好習(xí)慣。
spawn ssh root@192.168.33.130 uptime
root@192.168.33.130's password       #<這里再也不需要手工輸入密碼了。
 21:24:05 up 1 day,  9:12,  1 user,  load average: 0.00, 0.00, 0.00
[root@oldboy ~]# expect oldboy.exp
spawn ssh root@192.168.33.130 uptime
root@192.168.33.130's password       #<==這里再也不需要手工輸入密碼了。
21:24:08 up 1 day,  9:12,  1 user,  load average: 0.00, 0.00, 0.00

我們現(xiàn)在還沒手動(dòng)輸入密碼,就已經(jīng)自動(dòng)連接到遠(yuǎn)程機(jī)器執(zhí)行ssh命令了,是不是很神奇?

常用命令

(1) spawn命令

在使用Expect編寫自動(dòng)交互程序時(shí),你需要先用spawn命令啟動(dòng)程序或執(zhí)行命令。隨后的自動(dòng)交互操作都將基于這個(gè)已啟動(dòng)的程序或命令進(jìn)行。簡而言之,沒有spawn命令,你的Expect程序就無法完成自動(dòng)交互。

spawn命令的語法為:

spawn [選項(xiàng)][需要自動(dòng)交互的命令或程序]

例如:

spawn ssh root@192.168.33.130 uptime

當(dāng)你使用spawn命令時(shí),可以直接在后面加上你想要運(yùn)行的命令或程序,比如這里的ssh命令。此外,spawn還提供了幾個(gè)額外的選項(xiàng):

  • 使用 -open 可以啟動(dòng)一個(gè)文件進(jìn)程。
  • 使用 -ignore 可以讓程序忽略特定的信號。

(2) expect命令

在編寫自動(dòng)交互腳本時(shí),首先使用spawn命令啟動(dòng)程序或執(zhí)行命令。如果該命令輸出需要響應(yīng)的信息,則使用expect命令來等待并匹配這些輸出。一旦匹配成功,就執(zhí)行預(yù)設(shè)的動(dòng)作。此外,通過使用如-re這樣的選項(xiàng),可以利用正則表達(dá)式進(jìn)行更靈活的匹配。

expect命令的語法為:

expect  表達(dá)式  [動(dòng)作]

示例如下:

spawn ssh root@192.168.33.130 uptime
expect"*password"{send  "123456\r"}

不能直接在Linux的命令行里輸入這個(gè)命令,得把它放到一個(gè)Expect腳本里面去運(yùn)行。

執(zhí)行ssh命令遠(yuǎn)程獲取服務(wù)器負(fù)載值,并自動(dòng)輸入yes及用戶密碼。

[root@didiplus ~]# cat test.exp
#!/usr/bin/expect
spawn ssh root@192.168.33.130 uptime
expect{#<起始大括號前要有空格。
"yes/no"{exp_send "yes\r";exp_continue}#<exp_send和send類似。
"*password"{exp_send "123456\r"}
}
expect eof

執(zhí)行如下輸出:

[root@didiplus ~]# expect test.exp
spawn ssh root@192.168.33.130 uptime
The authenticity of host'192.168.33.130 (192.168.33.130)' can't be established.
RSA key fingerprint is fd:2c:0b:81:b0:95:c3:33:c1:45:6a:1c:16:2f:b3:9a.
Are you sure you want to continue connecting (yes/no) yes  #<expect自動(dòng)輸入yes。
Warning: Permanently added '192.168.33.130' (RSA) to the list of known hosts.
root@192.168.33.130's password:  #<expect自動(dòng)給密碼。
22:03:13 up 1 day,  9:51,  1 user,  load average: 0.00, 0.00, 0.00
#<==輕松打印出負(fù)載值。

(3) send命令

在上述例子中,我們介紹了exp_send和send命令的使用方法。這兩個(gè)Expect中的命令功能相似,都是用來在匹配到特定字符串后向系統(tǒng)發(fā)送指定內(nèi)容。它們支持如\r(回車)、\n(換行)和\t(制表符)等轉(zhuǎn)義字符,這些與TCL中的用法一致。

Send命令的使用示例如下:

#!/usr/bin/expect
spawn /bin/sh 18_3_1.sh
expect{
"username"{exp_send "oldboy\r";exp_continue}
"*pass*"{send "123456\r";exp_continue}
"*mail*"{exp_send "31333741@qq.com\r"}
}
expect eof

send命令有幾個(gè)可以使用的參數(shù):

  • -i:用來指定進(jìn)程ID(spawn_id),這樣你就可以向不同的進(jìn)程發(fā)送命令了。這個(gè)參數(shù)對于同時(shí)控制多個(gè)程序很有用。
  • -s:這里的s指的是“慢速”(slowly)。使用這個(gè)參數(shù)可以控制發(fā)送命令的速度。記得要和expect里的send_slow變量一起使用。

(4) send_user命令

send_user命令可以用來在Expect腳本中顯示信息,就像你在Shell里使用echo一樣。而send和exp_send命令則是把字符串發(fā)送給程序本身。下面是一個(gè)關(guān)于如何使用send_user命令的例子。

[root@didiplus ~]# cat 18_4_1.exp
#!/usr/bin/expect
send_user "hello world\n"#<\n表示換行。
send_user "I like linux,\t hello world"#<\t表示Tab鍵。

執(zhí)行結(jié)果如下:

[root@didiplus ~]# expect send_user.exp
hello word
I like linux,  hello world
責(zé)任編輯:趙寧寧 來源: 攻城獅成長日記
相關(guān)推薦

2023-10-23 09:44:00

并發(fā)管理線程

2025-02-20 08:20:00

AISOC網(wǎng)絡(luò)攻擊

2025-03-26 01:25:00

Spring開發(fā)JSON

2023-03-30 14:14:45

Kubernetes

2020-08-24 11:42:08

智慧建筑物聯(lián)網(wǎng)技術(shù)

2020-07-14 07:12:19

云安全AI無服務(wù)器

2020-04-26 08:11:39

邊緣計(jì)算云端網(wǎng)絡(luò)

2025-02-19 08:30:00

SOC網(wǎng)絡(luò)安全安全運(yùn)營中心

2018-08-13 05:03:36

2024-02-01 18:06:04

Python編程系統(tǒng)

2023-04-11 16:13:44

JavaScripSymbol前端

2020-02-29 08:57:12

智能工業(yè)物聯(lián)網(wǎng)IIoT

2020-02-05 10:51:15

云計(jì)算采購人工具

2009-10-13 09:14:48

遷移Windows 7

2009-10-29 10:34:31

ADO.NET使用技巧

2011-03-15 14:19:50

2010-07-20 10:48:56

Perl文件操作

2010-09-02 14:40:06

華為認(rèn)證

2009-09-24 16:56:12

2010-08-27 17:48:38

CSS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號