理論+實操:shell編程之expect免交互

前言:
expect 用途
設置賬號密碼

ssh輸入登陸密碼

scp 輸入驗證密碼

免交互的目的是代替人工手動輸入

  • expect概述
  • expect安裝
  • expect基本命令
  • expect執行方式
  • expect案例

一 : expect 概述

1.1 expect

  • expect是建立在tcl基礎上的一個工具,expect是用來進行自動化控制和測試的工具。主要解決shell腳本中不可交互的問題。對於大規模的linux運維很有幫助
  • 在linux運維和開發中,我們經常需要遠程登陸服務器進行操作,登陸的過程是一個交互的過程,可能會需要輸入yes/no、password等信息。爲了模擬這種輸入,可以使用expect腳本

二 : expect 安裝

2.1 掛載光盤

2.2 製作本地yum倉庫

2.3 執行安裝命令

  • yum install expect -y
  • 系統在默認情況下是沒有安裝expect軟件,需要手動安裝

三 : expect基本命令

3.1 spawn : 啓動進程,並跟蹤後續交互信息

3.2 expect

  • expect的一個內部命令,判斷上次輸出結果裏是否包含指定的字符串,如果有則立即返回,否則就等待超過時間後返回。
  • 只能捕捉由spawn啓動的進程的輸出

3.3 send :向進程發送字符串,用於模擬用戶的輸入

  • 該命令不能自動回車換行,一般要加\r(回車)

3.4 interact : 執行完成後保持交互狀態,把控制權交給控制檯

3.5 Timeout :指定超時時間,過期則繼續執行後續指令

  • 單位是:秒
  • timeout -1 爲永不超時
  • 默認情況下,timeout是10s

3.6 exp_continue

  • 允許expect繼續向下執行指令

3.7 send_user

  • 回顯命令,相當於echo

備註:

  • 永不超時常用於網絡不穩定時使用
  • shell腳本中的continue 指結束這次循環,開始下一次循環
  • expect腳本中exp_continue指不會結束,繼續匹配下一行

3.8 $argv 參數數組

  • expect 腳本可以接受從bash傳遞的參數,可以使用[lindex $argv n]格式,去進行獲得,n從0開始,分別表示第一個,第二個,第三個……參數
  • v 代表value 值,前面是固定格式
  • agv 與n 中間要有空格

3.9 expect腳本必須以interact或expect eof結束,執行自動化任務通常expect eof就足夠了

  • expect eof 是在等待結束標誌。由spawn啓動的命令在結束時會產生一個eof標記,expect eof即在等待這個標記
  • 看到eof 即代表結束腳本

四 : expect 語法

在這裏插入圖片描述

  • expect “要捕捉的內容” {send “要輸入的參數\r”;}

  • \r 回車符

  • 沒有帶有exp_continue ,則匹配一次就推出,有的話就再往下執行匹配一次

  • -re 參數表示匹配正則表達式

五 : experct 執行方式

5.1 直接執行

[root@localhost ~]# vim a.sh
#!usr/bin/ecpect	//expect二進制文件的路徑,
#設置環境
#超時時間
set timeout 9		//設置超時時間
log_file test.log	//日誌文件路徑
log_user 1			//用戶數量爲1
#定義變量
set hostname [lindex $argv 0 ]
set password [lindex $argv 1 ]
#開啓追蹤spawn
spawn ssh root@$hostname	//spawn 啓動命令
#匹配條件,捕捉
expect {		//按條件捕捉去send執行
     "(yes/no)"
     {send "yes\r";exp_continue}
     "*passwor"
     {send "$password\r"}
}
#權限轉交控制檯
interact
[root@localhost ~]# chmod +x a.sh 
[root@localhost ~]# ./a.sh  $argv0 $argv1
  • interact不要寫在大括號裏面

  • [gsy@localhost root]$ which expect
    /usr/bin/expect
    
  • 兩個log可加可不加

  • set兩個變量代表着傳參

  • 然後以spawn 去開啓服務

  • exprct 去捕捉條件,中間send輸出指令,\r回車,exp_continue繼續匹配

  • interact結束

5.2 嵌入執行

[root@localhost ~]# vim b.sh 
#!/bin/bash
   hostname=$1
   password=$2
   /usr/bin/expect<<-EOF	//expect開始EOF標誌
   spawn ssh root@$hostname
   expect {
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password"
        {send "$password\r"}
   }
   expect "*]#"		//檢索是否以root登陸
   send "exit\r"
   expect eof
EOF		//exprct結束標誌,這個EOF不能有空格
[root@localhost ~]# source b.sh 
  • java的全局變量指的是類文件爲區域

  • shell的是所有bash環境都能識別

  • /usr/bin/expect<<-EOF 也可以視爲聲明expect 位置

  • EOF前後不能有空格

spawn :以spawn模式執行操作,expect 纔可以捕捉到

六 : expect 案例

6.1 創建用戶tom,密碼123123

  • 正常情況下的交互過程

在這裏插入圖片描述

  • 編寫shell腳本(嵌入方式)
[root@localhost ~]# vim b.sh 
#!/bin/bash
user=$1
mima=$2
/usr/bin/expect<<-EOF
spawn useradd $user
spawn passwd $user
expect {
  "New password"
  {send "$mima\r";exp_continue}
  "new password"
  {send "$mima\r"}
}
expect eof
EOF
[root@localhost ~]# chmod +x b.sh 
[root@localhost ~]# ./b.sh qqq 965483
spawn useradd qqq
spawn passwd qqq
Changing password for user qqq.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@localhost ~]# vim b.sh
[root@localhost ~]# id qqq
uid=1001(qqq) gid=1001(qqq) groups=1001(qqq)

在這裏插入圖片描述

6.2 ssh登錄

  • 首次登錄

在這裏插入圖片描述

  • 正常登錄

  • 連接被拒絕,可能是ssh沒開,或者端口不對,或者防火牆限制

在這裏插入圖片描述

  • 沒有連接地址

在這裏插入圖片描述

  • 利用expect完成ssh登錄過程
    在這裏插入圖片描述

6.3 利用expect完成ftp登錄過程

在這裏插入圖片描述

在這裏插入圖片描述

想要註釋多行語句 可以在首部輸入 :<<! 在尾部輸入!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章