系統(tǒng)之家 - 系統(tǒng)光盤下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > 系統(tǒng)教程 > Linux系統(tǒng)expect命令操作實(shí)例

Linux系統(tǒng)expect命令操作實(shí)例

時(shí)間:2015-04-10 16:31:40 作者:qipeng 來源:系統(tǒng)之家 1. 掃描二維碼隨時(shí)看資訊 2. 請使用手機(jī)瀏覽器訪問: https://m.xitongzhijia.net/xtjc/20150410/44867.html 手機(jī)查看 評論

  Linux眾多命令中,expect命令比較不常見,我們可以使用expect命令來實(shí)現(xiàn)腳本的自動(dòng)登錄、等待進(jìn)程的反饋等。那么expect命令還有哪些用途呢?隨小編一起來瞧瞧吧。

 Linux系統(tǒng)expect命令操作實(shí)例

  先來看一段代碼:

  #!/usr/bin/expect

  set timeout 30

  spawn ssh -l root 192.168.1.188

  expect “password:”

  send “abc123456\r”

  interact

  對這6行進(jìn)行下解釋:

  第1行[#!/usr/bin/expect]

  這一行告訴操作系統(tǒng)腳本里的代碼使用那一個(gè)shell來執(zhí)行。這里的expect其實(shí)和linux下的bash、windows下的cmd是一類東西。 這一行需要在腳本的第一行。

  第2行[set timeout 30]

  基本上認(rèn)識英文的都知道這是設(shè)置超時(shí)時(shí)間的,現(xiàn)在你只要記住他的計(jì)時(shí)單位是:秒

  第3行 [spawn ssh -l username 192.168.1.188]

  spawn是進(jìn)入expect環(huán)境后才可以執(zhí)行的expect內(nèi)部命令,如果沒有裝expect或者直接在默認(rèn)的SHELL下執(zhí)行是找不到spawn命 令的。所以不要用 “which spawn“之類的命令去找spawn命令。好比windows里的dir就是一個(gè)內(nèi)部命令,這個(gè)命令由shell自帶,你無法找到一個(gè)dir.com 或 dir.exe 的可執(zhí)行文件。 它主要的功能是給ssh運(yùn)行進(jìn)程加個(gè)殼,用來傳遞交互指令。

  第4行[expect “password:”]

  這里的expect也是expect的一個(gè)內(nèi)部命令,有點(diǎn)暈吧,expect的shell命令和內(nèi)部命令是一樣的,但不是一個(gè)功能,習(xí)慣就好了。這個(gè)命 令的意思是判斷上次輸出結(jié)果里是否包含“password:”的字符串,如果有則立即返回,否則就等待一段時(shí)間后返回,這里等待時(shí)長就是前面設(shè)置的30 秒

  第5行[send “abc123456\r”]

  這里就是執(zhí)行交互動(dòng)作,與手工輸入密碼的動(dòng)作等效。

  溫馨提示: 命令字符串結(jié)尾別忘記加上“\r”,如果出現(xiàn)異常等待的狀態(tài)可以核查一下。

  第6行[interact]

  執(zhí)行完成后保持交互狀態(tài),把控制權(quán)交給控制臺,這個(gè)時(shí)候就可以手工操作了。如果沒有這一句登錄完成后會(huì)退出,而不是留在遠(yuǎn)程終端上。

  在Linux下,執(zhí)行ssh登陸或者是scp復(fù)制文件的時(shí)候可以使用到該命令,實(shí)現(xiàn)自動(dòng)輸入密碼。

  案例1:遠(yuǎn)程執(zhí)行命令

  #!/usr/bin/expect -f

  set timeout 30

  spawn ssh -l root 192.168.1.188

  expect {

  “yes/no” { send “yes\r”;exp_continue }

  “password:” { send “abc123456\r” }

  }

  expect -re “\](\$|#) ”

  send “bash /root/test.sh \r”

  expect -re “\](\$|#) ”

  send “exit\r”

  該代碼的功能是執(zhí)行遠(yuǎn)程服務(wù)器上的/root/test.sh腳本,參數(shù)“-re”是匹配正則表達(dá)式。可以寫多行send,執(zhí)行多個(gè)命令。該腳本的另一種寫法

  #!/bin/bash

  expect -c “

  spawn ssh root@192.168.1.188 \”ifconfig;whoami;pwd;echo hello;\“

  expect {

  \”*assword\“ {set timeout 30; send \”abc123456\r\“;}

  \”yes/no\“ {send \”yes\r\“; exp_continue;}

  }

  expect eof

  ”

  參數(shù)“-c”是指在命令行執(zhí)行expect。把要執(zhí)行的命令用分號隔開了。并且執(zhí)行過程中沒有shell提示符的,有興趣的你可以測試下。

  案例2:批量處理

  在需要管理大量的Linux服務(wù)器時(shí),可以這樣做:

  1.host.list

  192.168.1.1 22 root abc1

  192.168.1.2 22 root abc2

  192.168.1.3 22 root abc3

  192.168.1.4 22 root abc4

  192.168.1.5 22 root abc5

  192.168.1.6 22 root abc6

  192.168.1.7 22 root abc7

  192.168.1.8 22 root abc8

  我們把服務(wù)器的IP地址、端口號、用戶名、密碼一起放在host.list文件里,按行排列。

  下面來看看腳本文件main.exp

  #!/usr/bin/expect -f

  set ipaddress [lindex $argv 0]

  set port [lindex $argv 1]

  set username [lindex $argv 2]

  set passwd [lindex $argv 3]

  set timeout 30

  spawn ssh $ipaddress -p$port -l$username

  expect {

  “yes/no” { send “yes\r”;exp_continue }

  “password:” { send “$passwd\r” }

  }

  expect -re “\](\$|#) ”

  send “bash /root/test.sh \r”

  expect -re “\](\$|#) ”

  send “exit\r”

  來做一個(gè)while循環(huán):whi.sh

  #!/bin/bash

  host=“host.list”

  while read line

  do

  expect main.exp $line

  done 《 $host

  把以上腳本都賦予執(zhí)行權(quán)限,就可以了。

  案例3:scp文件傳輸

  expect -c “

  spawn scp root@192.168.1.188:/root/file1.tgz /root

  expect {

  \”*assword\“ {set timeout 300; send \”abc123456\r\“;}

  \”yes/no\“ {send \”yes\r\“; exp_continue;}

  }

  expect eof

  ”

  同樣的原理,也可以做循環(huán)進(jìn)行批量管理,還可以更簡化腳本,也不多說明了,有興趣的同學(xué)可以多嘗試下。使用expect進(jìn)行自動(dòng)輸入密碼登陸,基本多用于批量管理。也還算方便。關(guān)于批量管理有多種方法,可以在主機(jī)之間建立ssh信任機(jī)制,也可以免密碼登陸管理等。還可以使用sshpass(外部命令)這個(gè)命令進(jìn)行帶密碼在腳本里執(zhí)行自動(dòng)輸入密碼。

  上面就是Linux使用expect命令的方法介紹了,本文一共介紹了expect命令的三個(gè)操作實(shí)例,通過這些實(shí)例的練習(xí),你一定能輕松掌握expect命令的用法。

標(biāo)簽 命令

發(fā)表評論

0

沒有更多評論了

評論就這些咯,讓大家也知道你的獨(dú)特見解

立即評論

以上留言僅代表用戶個(gè)人觀點(diǎn),不代表系統(tǒng)之家立場

其他版本軟件

熱門教程

人氣教程排行

Linux系統(tǒng)推薦

官方交流群 軟件收錄