使用expect實(shí)現(xiàn)shell自動(dòng)交互

shell腳本需要交互的地方可以使用here文檔是實(shí)現(xiàn),但是有些命令卻需要用戶手動(dòng)去就交互如passwd灭抑、scp
對(duì)自動(dòng)部署免去用戶交互很痛苦,expect能很好的解決這類問(wèn)題斟薇。

expect的核心是spawn expect send set
spawn 調(diào)用要執(zhí)行的命令
expect 等待命令提示信息的出現(xiàn)嫉柴,也就是捕捉用戶輸入的提示:
send 發(fā)送需要交互的值,替代了用戶手動(dòng)輸入內(nèi)容
set 設(shè)置變量值

interact 執(zhí)行完成后保持交互狀態(tài)武通,把控制權(quán)交給控制臺(tái)霹崎,這個(gè)時(shí)候就可以手工操作了。如果沒(méi)有這一句登錄完成后會(huì)退出冶忱,而不是留在遠(yuǎn)程終端上尾菇。
expect eof 這個(gè)一定要加,與spawn對(duì)應(yīng)表示捕獲終端輸出信息終止囚枪,類似于if....endif
expect腳本必須以interact或expect eof結(jié)束派诬,執(zhí)行自動(dòng)化任務(wù)通常expect eof就夠了。
設(shè)置expect永不超時(shí)
set timeout -1

設(shè)置expect 300秒超時(shí)链沼,如果超過(guò)300沒(méi)有expect內(nèi)容出現(xiàn)默赂,則推出
set timeout 300

expect編寫語(yǔ)法,expect使用的是tcl語(yǔ)法括勺。
一條Tcl命令由空格分割的單詞組成. 其中, 第一個(gè)單詞是命令名稱, 其余的是命令參數(shù)
cmd arg arg arg

符號(hào)代表變量的值. 在本例中, 變量名稱是foo.foo
方括號(hào)執(zhí)行了一個(gè)嵌套命令. 例如, 如果你想傳遞一個(gè)命令的結(jié)果作為另外一個(gè)命令的參數(shù), 那么你使用這個(gè)符號(hào)
[cmd arg]
雙引號(hào)把詞組標(biāo)記為命令的一個(gè)參數(shù). ""符號(hào)和方括號(hào)在雙引號(hào)內(nèi)仍被解釋 "some stuff" 大括號(hào)也把詞組標(biāo)記為命令的一個(gè)參數(shù). 但是, 其他符號(hào)在大括號(hào)內(nèi)不被解釋 {some stuff} 反斜線符號(hào)是用來(lái)引用特殊符號(hào). 例如:n 代表?yè)Q行. 反斜線符號(hào)也被用來(lái)關(guān)閉""符號(hào), 引號(hào),方括號(hào)和大括號(hào)的特殊含義

expect使用實(shí)例

1缆八。首先確認(rèn)expect的包要安置。

rpm -qa | grep expect

如果沒(méi)有則需要下載安裝疾捍,

yum install expect

2.安裝完成后奈辰,查看expect的路徑,可以用

which expect

/usr/bin/expect

3.編輯腳本

vi test.sh

添加如下內(nèi)容

#!/usr/bin/expect  -f   //這個(gè)expect的路徑就是用which expect 查看的結(jié)果
 
spawn su - nginx       //切換用戶
expect "password:"   //提示讓輸入密碼
send "testr"              //輸入nginx的密碼
interact                    //操作完成

4.確定腳本有可執(zhí)行權(quán)限

chmod +x autosu.sh

5.執(zhí)行腳本 expect autosu.sh 或 ./autosu.sh

expect常用腳本

登陸到遠(yuǎn)程服務(wù)器:

#!/usr/bin/expect  
set timeout 5
set server [lindex $argv 0]
set user [lindex $argv 1]
set passwd [lindex $argv 2]
spawn ssh -l $user $server
expect {
"(yes/no)" { send "yesr"; exp_continue }
"password:" { send "$passwdr" }
}
expect "*Last login*" interact

scp拷貝文件

#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]        //第1個(gè)參數(shù)乱豆,其它2,3,4參數(shù)類似
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $src_file $username@$host:$dest_file
expect {
"(yes/no)?"
   {
    send "yesn"
    expect "*assword:" { send "$passwordn"}
}
"*assword:"
{
send "$passwordn"
}
}
expect "100%"
expect eof
#!/bin/bash

set timeout 30
expect<<-END
spawn ssh-keygen -t rsa
expect "Enter file in which to save the key (/root/.ssh/id_rsa): "
send "\n"
expect "Overwrite (y/n)? "
send "\n"
expect eof
exit
END


for i in `cat ./serverlist.ini |grep "="|awk -F= '{print $2}'`
do
       echo $i
expect<<-END
   spawn ssh root@$i "mkdir /root/.ssh/"
   expect "password: "
   send "du77\n"
expect eof
exit
END
expect<<-END
   spawn scp /root/.ssh/id_rsa.pub root@$i:/root/.ssh/id_rsa.pub
   expect "password: "
   send "du77\n"
expect eof
exit
END
expect<<-END
   spawn ssh root@$i "touch /root/.ssh/authorized_keys"
   expect "password: "
   send "du77\n"
expect eof
exit
END
expect<<-END
   spawn ssh root@$i "cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys"
   expect "password: "
   send "du77\n"
expect eof
exit
END
done
#!/bin/bash


set timeout 30
for i in `cat ./serverlist.ini |grep "="|awk -F= '{print $2}'`
do
        echo $i
expect<<-END
   spawn scp /root/.ssh/id_rsa.pub root@$i:/root/.ssh/id_rsa.pub
   expect "password: "
   send "123@123\n"
expect eof
exit
END
expect<<-END
   spawn ssh root@$i "touch /root/.ssh/authorized_keys"
   expect "password: "
   send "123@123\n"
expect eof
exit
END
expect<<-END
   spawn ssh root@$i "cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys"
   expect "password: "
   send "123@123\n"
expect eof
exit
END
done
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奖恰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宛裕,更是在濱河造成了極大的恐慌瑟啃,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揩尸,死亡現(xiàn)場(chǎng)離奇詭異蛹屿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疲酌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門蜡峰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)了袁,“玉大人,你說(shuō)我怎么就攤上這事湿颅≡芈蹋” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵油航,是天一觀的道長(zhǎng)崭庸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谊囚,這世上最難降的妖魔是什么怕享? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮镰踏,結(jié)果婚禮上函筋,老公的妹妹穿的比我還像新娘。我一直安慰自己奠伪,他們只是感情好跌帐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著绊率,像睡著了一般谨敛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滤否,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天脸狸,我揣著相機(jī)與錄音,去河邊找鬼藐俺。 笑死炊甲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的紊搪。 我是一名探鬼主播蜜葱,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耀石!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起爸黄,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滞伟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后炕贵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梆奈,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年称开,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亩钟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乓梨。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖清酥,靈堂內(nèi)的尸體忽然破棺而出扶镀,到底是詐尸還是另有隱情,我是刑警寧澤焰轻,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布臭觉,位于F島的核電站,受9級(jí)特大地震影響辱志,放射性物質(zhì)發(fā)生泄漏蝠筑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一揩懒、第九天 我趴在偏房一處隱蔽的房頂上張望什乙。 院中可真熱鬧,春花似錦已球、人聲如沸稳强。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)退疫。三九已至,卻和暖如春鸽素,著一層夾襖步出監(jiān)牢的瞬間褒繁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工馍忽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棒坏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓遭笋,卻偏偏與公主長(zhǎng)得像坝冕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓦呼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,370評(píng)論 0 5
  • 1 概述 expect 是由Don Libes基于Tcl(Tool Command Language )語(yǔ)言開(kāi)發(fā)的...
    ghbsunny閱讀 11,524評(píng)論 0 0
  • 請(qǐng)不要轉(zhuǎn)載 背景介紹 Expect 程序主要用于人機(jī)對(duì)話的模擬喂窟,就是那種系統(tǒng)提問(wèn),人來(lái)回答 yes/no 央串,或者賬...
    羽風(fēng)之歌閱讀 53,460評(píng)論 12 46
  • 老友回歸 ,昨晚我卻在接風(fēng)宴中途跑掉了 饲宿,連話都沒(méi)來(lái)得及好好說(shuō) 厦酬。 忙完收到小伙伴的信息讓我補(bǔ)上昨晚欠的 胆描,自覺(jué)理...
    劉小瘦兒_閱讀 624評(píng)論 0 1
  • 北方的這個(gè)節(jié)令,酷熱無(wú)比仗阅,夏至就這樣來(lái)臨昌讲。 早晨10點(diǎn)半左右接到父親的電話:“過(guò)來(lái)吃面條吧”∨眨“這......老爸...
    小妖魚閱讀 139評(píng)論 0 0