整理一下現狀:1.交換機都處於專網中,筆者的服務器均可以直接訪問,無需代理設備;2.幾乎所有的交換機型號相同,也就是說完成ntp的配置指令相同;3.所有交換機密碼相同;4.所有設備都可以telnet管理,端口均是默認端口,唯一的區別就只有設備IP地址。
那筆者的思路就比較清楚了,首先有個指令配置的模板,其中包含了設備登陸、密碼輸入、配置指令及保存退出。其次定義一個IP地址的表單,對表單內的IP地址進行配置模板的重復執行。
對於linux系統而已,大多數簡短腳本都會采用bash來進行編寫,而筆者之前嘗試過expect腳本編寫,感覺這個腳本語言對於初學者相對比較友好,因此這節筆者就通過expect來進行功能實現。
登陸服務器,首先看一下服務器是否有bash和expect:
yum list installed | grep bash
yum list installed | grep expect
看到系統是自帶bash組件,但沒有expect,繼續按照以往的方式進行軟件安裝:
yum list | grep expect
yum install expect.x86_64
完成軟件安裝。
查看一下yum把expect安裝到了哪里:
whereis expect
熟悉一下文件安裝的路徑。
下面筆者開始一個初始化腳本的編寫,進入文件夾
cd /var
筆者來新建一個文件夾用於儲存和管理腳本
mkdir expect
進入筆者新建的文件夾
cd ./expect
開始創建第一個shell文件
vi telnet.sh
編程語言第一步就是聲明語言,結合之前筆者看到的安裝路徑:
#!/usr/bin/expect
設置超時時間為3秒:
set timeout 3
繼續隨便找一台交換機進行測試:比如10.150.103.61,測試之前呢,筆者也先不拿ntp的相關配置來做操作,畢竟時間看起來比較麻煩。筆者用最簡單、直觀可見的方式--修改交換機的名稱來測試:
插入一部分,編程的同時筆者先梳理一下交換機改名字的配置思路。
第一步telnet 10.150.103.61
執行之后呢,交換機就需要輸入密碼,為了方便測試腳本筆者改為了簡單好記的123456
輸入密碼之后呢,H3C交換機改個用戶名兩條簡單指令:
system-view
sysname hbaitest1
保存退出:
quit
save
y
y
最后quit退出,就結束了~
如上交換機的配置指令已經梳理清楚了,那就開始腳本配置:
腳本配置的輕松愉快啊,spawn即是執行了telnet的指令,之后expect會匹配密碼的輸入,完整匹配字符應該是“Password:”前后兩個*表示字符“assword”前后匹配任意字符,這樣就匹配到了輸入密碼的界面。
后面的異常輕松,送密碼啊送指令啊,送完了之后interact腳本結束。
wq!
保存退出,下面筆者迫不及待的嘗試一下腳本的效果,運行之前筆者先登錄這台交換機設備,把它修改為原來的名字:hbai1
切換回服務器,執行腳本。
./telnet.sh
提示權限不夠。直接給文件夾/var/expect賦予讀寫執行權限
chmod –R 777 /var/expect
繼續運行腳本
./telnet.sh
再看一下交換機,名字已然變成了筆者修改過后的新名字。簡簡單單的腳本執行完成了。
執行完成后繼續把名字修改回來:
筆者最初的目的達成了,可以通過腳本自動修改交換機名稱,但是由於腳本是固定的IP地址(spawn telnet 10.150.103.61)無法做到修改多個設備。下一步,筆者就在上述腳本的基礎上進行優化設置。
一、增加輸入,使得IP地址不再固定;
常見腳本的輸入方式大約分為兩種,一種是交互式的,可以手動輸入,不過一旦輸入內容很多,輸入變量也會變成一件非常繁瑣的事情;另一種方便的方式就是新建一個文件,把所有需要管理的IP地址都加入其中。然后自動讀取文件執行就可以了。
很明顯在筆者現有的應用場景下,第二種方式比較簡便,筆者只需要把所有的交換機IP地址貼出來就可以了,思路上呢,就是首先讀取文件第一行IP地址,telnet進行連接,執行交換機修改的命令;讀取文件第二行IP地址…………直到讀取文件結束。很清晰,一個循環操作。
首先筆者新建一個文件來存儲IP地址:
vi ip.txt
輸入幾個測試的IP地址
筆者新建一個腳本來測試下循環:
vi read.sh
設置讀取文件位置和操作:setf [open ip.txt]
執行一個循環while:while {1}
讀取字符串並寫入line變量中set line [gets $f]
輸出變量:puts “ipaddress is : $line”
判斷變量是否為空,文件讀取結束: if {[eof $f]} { close $f break }
成功完成后輸出提示:successful
這樣一個簡單的循環腳本就完成了,筆者執行一下腳本來看看運行結果:
./read.sh
不錯~輸入結束,結果很理想。下面筆者要做的就是整合之前完成的兩個腳本,一邊讀取IP地址,一遍執行筆者想要的配置操作。
二、增加循環,使得腳本可以對多個設備執行命令。
回顧一下循環的思路:
1.讀取文件;2.執行循環;3.讀取字符串寫入變量;4.輸出變量;5.變量為空循環結束。
回顧一下交換機配置更改的思路:
1>telnet一個IP地址;2>在輸入密碼界面輸入密碼;3>執行命令;4>保存退出。
思路上就是將循環中的“4.輸出變量”替換為“1>--4>交換機配置更改”,這樣就輕松愉快的結束了。
開始操作,將循環腳本read.sh復制為modify.sh
cp read.sh modify.sh
編輯腳本:vi modify.sh
將第四條輸出ip地址替換為telnet.sh腳本中的命令修改配置:
完整腳本如上。
找個測試環境,筆者把ip.txt的地址替換為可以訪問的交換機地址:vi ip.txt
登陸這兩台設備:
執行腳本:./modify.sh
等待腳本執行完成后,回到這兩台交換機的管理界面,發現交換機名字已經批量修改了~
到這里為止,筆者的執行腳本已經完成啦,以后的批量作業只需要將指令保存到腳本之中,並且維護交換機ip地址列表ip.txt就可以一鍵修改了~
可以看到,一個功能性腳本最重要的就是理清思路,知道分幾步完成,每步該做什么;同樣對於一個復雜的步驟可以將其拆解出來,單獨使用一個腳本進行實現,最后再進行腳本的整合。每個復雜腳本基本上基於輸入、輸出、變量、運算符、注釋、流控制來進行的,邏輯思路非常重要。
最后的最后,筆者優化一下了腳本。參考之前的ip地址列表,筆者將地址單獨出了一個文件以便修改。同樣,筆者將需要執行的命令也單獨出來一個文件,命名為command.txt。考慮到筆者最初的目的,將配置指令修改為上一節NTP相關配置。三個文件如下所示:
ip.txt
command.txt
modify.sh
利用如上腳本和兩個文件就可以實現網絡設備的批量telnet和ssh管理啦~
作者:嵩山奶熊
鏈接:https://www.jianshu.com/p/e17ec311ac6d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
