Shell腳本------Expect(實現ssh服務免交互)

Expect基本概述

Expect是通用的,所以它能夠做爲用戶級別的命令運行,而無需考慮任何程序和任務。Expect實際上能夠同時與多個程序對話。Expect對於須要程序與用戶交互的程序來講很是有用。若是有須要Expect還能夠交還控制權給用戶,而不須要中止被控制的程序。一樣,用戶也能夠在任什麼時候候將控制權返還給腳本。shell

經常使用選項

-c:在腳本中任何要執行的命令以前的命令前綴。應該用引號將命令包圍起來,防止被shell破壞。此選項能夠屢次使用。多個命令能夠用一個-c按順序執行,用分號進行分隔(若是使用Expectk,則使用-command選項)。bash

-d:啓用一些診斷輸出,主要報告如expect和interact等命令的內部活動。此選項與「exp_internal 1」具備相同的效果。並會打印Expect的版本。例如,strace命令用於跟蹤語句,trace命令用於跟蹤變量賦值(若是使用Expectk,則使用-diag選項)。ssh

-D:啓用交互式調試器。後面跟一個整數值,若是值爲非零值、按下了Ctrl+C、命中斷點或者腳本中出現其餘適當的調試器命令,調試器將在下一個Tcl過程以前保持控制權(若是使用Expectk,則使用-Debug選項)。ide

-f:標記在要從中讀取命令的文件前面。-f自己是可選的,在命令行中,若是不提供-f,則在執行完文件中的命令後就會結束命令,會忽略後面的expect選項,若是提供-f,則不會忽略後面的expect選項。當在腳本中隱式調用expect時,若是不提供-f,則會將expect選項看成普通的位置參數。若是提供,則會嘗試識別expect選項(若是使用Expectk,則使用-file選項)。spa

-b:強制一行一行地讀取文件並執行。默認狀況下,命令文件被讀入內存並所有執行(若是使用Expectk,則使用-buffer選項)。 若是提供給-f與-b的文件名是「-」,則會從標準輸入讀取。命令行

-i:expect以交互方式提示輸入命令,而不是從文件中讀取命令。提示經過exit命令或EOF終止。若是不使用命令文件或調試

-c,則默認使用-i(若是使用Expectk,則使用-interactive選項)。code

--:用來分隔選項的末尾。對於傳遞不想被expect解釋的相似選項的參數的狀況很是有用。--後面的參數不會被嘗試解析爲expect選項。--一樣能夠與#!一塊兒使用。在遇到第一個非expect選項開始後面的全部選項都會做爲普通參數解析。blog

-N:禁止expect自動獲取$exp_library/expect.rc文件,若是文件存在(若是使用Expectk,則使用-NORC選項)。圖片

-n:在$exp_library/expect.rc以後,禁止expect自動獲取~/.expect.rc文件,若是文件存在(若是使用Expectk,則使用-norc選項)。若是定義了環境變量DOTDIR,則會從其指定位置獲取.expect.rc文件。

-v:打印expect版本號(若是使用Expectk,則使用-version選項)。

args:可選的args構形成一個列表,並保存在變量argv中。變量argc初始化爲argv的長度。argv0被定義爲腳本的名稱。

示例

Expect直接和 嵌入
一、使用expect經過直接編寫的方法實現ssh服務免交互

#!/usr/bin/expect  
set timeout 20   //超時時間
//參數傳入
set hostname [lindex $argv 0]
set password [lindex $argv 1]
//追捕命令
spawn ssh root@$hostname
//追捕到信息並執行免交互
expect {
        "(yes/no)" 
        {send "yes\r";exp_continue} 
        "*password"
        {send "$password\r"}
}
//將執行權限交給控制檯輸出
interact
[root@localhost ~]# chmod +x expect.sh  //給腳本添加執行權限
[root@localhost ~]# ./expect.sh 192.168.100.137 qweqwe //執行腳本並輸入ssh登陸用戶的ip和登陸密碼
//執行腳本的結果
spawn ssh root@192.168.100.137
The authenticity of host '192.168.100.137 (192.168.100.137)' can't be established.
ECDSA key fingerprint is SHA256:nbnd6568zTp0Fgdo2gavS4YXLySyTvs7+JT/b7L/syU.
ECDSA key fingerprint is MD5:0d:02:8f:c9:28:e3:41:30:f7:fd:94:94:2d:ff:ff:dd.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.137' (ECDSA) to the list of known hosts.
root@192.168.100.137's password: 
Last login: Fri Oct 11 17:02:57 2019 from 192.168.100.1

輸入"ipconfig"查看當前登陸用戶ip地址是否爲192.168.100.137
在這裏插入圖片描述
若是想要等出的話,輸入"exit"命令便可等出當前用戶

[root@localhost ~]# exit
登出

二、使用expect嵌入編寫的方式實現ssh服務免交互

#!/bin/bash
hostname=$1
password=$2

/usr/bin/expect <<-EOF 

spawn ssh root@$hostname

expect {
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password"
        {send "$password\r"}
}
expect "*]#"
send "exit\r"
expect eof
EOF

執行腳本結果

[root@localhost ~]# chmod +x expect1.sh 
[root@localhost ~]# ./expect1.sh 192.168.100.137 qweqwe

在這裏插入圖片描述

相關文章
相關標籤/搜索