使用腳本在 SecureCRT 中自動輸入

網絡工程師經常面臨將某些片段從記事本複制/粘貼到控制台的任務。 您通常必須複製幾個參數:用戶名/密碼和其他一些。 使用腳本可以加快這個過程。 但是編寫腳本和執行腳本的任務總的來說應該比手動配置花費的時間更少,否則腳本是無用的。

這篇文章是乾什麼用的? 本文來自 Fast Start 系列,旨在節省網絡工程師在多個設備上設置設備(單任務)的時間。 使用 SecureCRT 軟件和內置的腳本執行功能。

Содержание

介紹

SecureCRT 程序內置了開箱即用的腳本執行機制。 終端腳本有什麼用?

  • 自動化 I/O 和最少的 I/O 驗證。
  • 加快日常任務的執行速度——減少設備設置之間的停頓。 (實際上減少了​​在同一硬件上執行複制/過去操作的時間導致的暫停,將 3 個或更多命令片段應用於硬件。)

本文檔涵蓋以下任務:

  • 創建簡單的腳本。
  • 在 SecureCRT 上運行腳本。
  • 使用簡單和高級腳本的示例。 (從現實生活中實踐。)

創建簡單的腳本。

最簡單的腳本只使用兩個命令,Send 和 WaitForString。 此功能足以完成 90%(或更多)的任務。

腳本可以在 Python、JS、VBS (Visual Basic)、Perl 等中運行。

蟒蛇

# $language = "Python"
# $interface = "1.0"
def main():
  crt.Screen.Synchronous = True
  crt.Screen.Send("r")
  crt.Screen.WaitForString("name")
  crt.Screen.Send("adminr")
  crt.Screen.WaitForString("Password:")
  crt.Screen.Send("Password")
  crt.Screen.Synchronous = False
main()

通常是擴展名為“*.py”的文件

VBS

# $language = "VBScript"
# $interface = "1.0"
Sub Main
  crt.Screen.Synchronous = True
  crt.Screen.Send vbcr
  crt.Screen.WaitForString "name"
  crt.Screen.Send "cisco" & vbcr
  crt.Screen.WaitForString "assword"
  crt.Screen.Send "cisco" & vbcr
  crt.Screen.Synchronous = False
End Sub

通常是擴展名為“*.vbs”的文件

使用腳本條目創建腳本。

允許您自動化編寫腳本的過程。 您開始編寫腳本。 SecureCRT 記錄命令和隨後的硬件響應,並為您顯示完成的腳本。

A。 開始寫腳本:
SecureCRT 菜單 => 腳本 => 開始錄製腳本
b. 使用控制台執行操作(在 CLI 中執行配置步驟)。
五、 寫完腳本:
SecureCRT 菜單 => 腳本 => 停止錄製腳本…
保存腳本文件。

執行的命令和保存的腳本示例:

使用腳本在 SecureCRT 中自動輸入

在 SecureCRT 上運行腳本。

創建/編輯腳本後,一個邏輯問題出現了:如何應用腳本?
有幾種方法:

  • 從腳本菜單手動運行
  • 連接後自動啟動(登錄腳本)
  • 不使用腳本自動登錄
  • 使用 SecureCRT 中的按鈕手動觸發(尚未創建按鈕並將其添加到 SecureCRT)

從腳本菜單手動運行

SecureCRT 菜單 => 腳本 => 運行…
- 最後 10 個腳本被記住並可用於快速啟動:
SecureCRT 菜單 => 腳本 => 1 “腳本文件名”
SecureCRT 菜單 => 腳本 => 2 “腳本文件名”
SecureCRT 菜單 => 腳本 => 3 “腳本文件名”
SecureCRT 菜單 => 腳本 => 4 “腳本文件名”
SecureCRT 菜單 => 腳本 => 5 “腳本文件名”

連接後自動啟動(登錄腳本)

為保存的會話配置自動日誌記錄腳本設置:Connection => Logon Actions => Logon script

使用腳本在 SecureCRT 中自動輸入

不使用腳本自動登錄

無需編寫腳本,僅使用 SecureCRT 的內置功能,就可以自動輸入密碼的用戶名。 在連接設置“Connection”=> Logon Actions => Automate logon - 你需要填寫幾個包 - 這意味著對:“Expected text” + “Sent characters to this text” 可以有很多這樣的對。 (示例:第一對等待用戶名,第二對等待密碼,第三對等待特權模式提示,第四對等待特權模式密碼。)

Cisco ASA 上的自動登錄示例:

使用腳本在 SecureCRT 中自動輸入

使用 SecureCRT 中的按鈕手動觸發(尚未創建按鈕並將其添加到 SecureCRT)

在 SecureCRT 中,您可以將腳本分配給按鈕。 該按鈕被添加到專門為此目的創建的面板中。

A。 在界面中添加面板:SecureCRT Menu => View => Button Bar
b. 向面板添加一個按鈕並添加一個腳本。 – 右鍵單擊按鈕欄並從上下文菜單中選擇“新建按鈕...”。
五、 在“地圖按鈕”對話框的“操作”字段中,選擇“運行腳本”操作(函數)。
為按鈕指定標題。 按鈕圖標的顏色。 單擊確定完成設置。

使用腳本在 SecureCRT 中自動輸入

注:

帶按鈕的面板是非常有用的功能。

1. 可以在登錄特定會話時,指定默認打開哪個面板到此選項卡。

2. 可以為設備的標準動作設置預定義動作:show show version、show running-config、save configuration。

使用腳本在 SecureCRT 中自動輸入
這些按鈕沒有附加腳本。 僅限行動線:

使用腳本在 SecureCRT 中自動輸入
設置 - 以便在切換到會話時,在會話設置中打開帶有按鈕的必要面板:

使用腳本在 SecureCRT 中自動輸入
對於客戶來說,為登錄設置單獨的腳本並使用供應商的頻繁命令轉到面板是有意義的。

使用腳本在 SecureCRT 中自動輸入
當您按下 Go Cisco 按鈕時,面板會切換到 Cisco 按鈕欄。

使用腳本在 SecureCRT 中自動輸入

使用簡單和高級腳本的示例。 (從現實生活中實踐。)

幾乎所有場合,簡單的腳本就足夠了。 但是有一次我需要使腳本稍微複雜一點——以加快工作速度。 此復雜功能只是在對話框中向用戶請求附加數據。

使用對話框向用戶請求數據

我在數據請求腳本中有 2。這是主機名和 IP 地址的第 4 個八位字節。 要執行此操作 - 我用谷歌搜索瞭如何執行此操作,並在 SecureCRT (vandyke) 的官方網站上找到了它。 - 該功能稱為提示。

	crt.Screen.WaitForString("-Vlanif200]")
	hostnamestr = crt.Dialog.Prompt("Enter hostname:", "hostname", "", False)
	ipaddressstr = crt.Dialog.Prompt("Enter ip address:", "ip", "", False)
	crt.Screen.Send("ip address 10.10.10.")
	crt.Screen.Send(ipaddressstr)
	crt.Screen.Send(" 23r")
	crt.Screen.Send("quitr")
	crt.Screen.Send("sysname ")
	crt.Screen.Send(hostnamestr)
	crt.Screen.Send("r") 

腳本的這一部分要求提供最後一個八位字節的主機名和數字。 因為有15件裝備。 數據顯示在表格中,然後我從表格中復制值 \uXNUMXb\uXNUMXb 並將其粘貼到對話框中。 此外,腳本獨立工作。

FTP複製到網絡設備。

這個腳本啟動了我的命令窗口(shell)並通過 FTP 複製了數據。 最後,關閉會話。 這個用記事本是不行的,因為複制需要很長時間,而且FTP緩衝區中的數據不會保存那麼久:

# $language = "Python"
# $interface = "1.0"

# Connect to a telnet server and automate the initial login sequence.
# Note that synchronous mode is enabled to prevent server output from
# potentially being missed.

def main():
	crt.Screen.Synchronous = True
	crt.Screen.Send("ftp 192.168.1.1r")
	crt.Screen.WaitForString("Name")
	crt.Screen.Send("adminr")
	crt.Screen.WaitForString("Password:")
	crt.Screen.Send("Passwordr")
	crt.Screen.WaitForString("ftp")
	crt.Screen.Send("binaryr")
	crt.Screen.WaitForString("ftp")
	crt.Screen.Send("put S5720LI-V200R011SPH016.patr")
	crt.Screen.WaitForString("ftp")
	crt.Screen.Send("quitr")
	crt.Screen.Synchronous = False
main()

使用腳本輸入用戶名/密碼

一位客戶直接訪問網絡設備被關閉。 可以通過首先連接到默認網關來進入設備,然後從它連接到與其連接的設備。 IOS/硬件軟件內置的ssh客戶端用於連​​接。 因此,在控制台中請求了用戶名和密碼。 使用以下腳本,自動輸入用戶名和密碼:

# $language = "Python"
# $interface = "1.0"

# Connect to a telnet server and automate the initial login sequence.
# Note that synchronous mode is enabled to prevent server output from
# potentially being missed.

def main():
	crt.Screen.Synchronous = True
	crt.Screen.Send("snmpadminr")
	crt.Screen.WaitForString("assword:")
	crt.Screen.Send("Passwordr")
	crt.Screen.Synchronous = False
main()

注意:一共有2個腳本,一個是administrator賬號,一個是eSIGHT賬號。

能夠在腳本執行期間直接附加數據的腳本。

任務是在所有網絡設備上添加靜態路由。 但是每個設備上的 Internet 網關是不同的(並且它不同於默認網關)。 下面的腳本顯示路由表,進入配置模式,沒有把命令寫到最後(網關到互聯網的IP地址)——這部分是我加的。 在我按下 Enter 後,腳本繼續執行命令。

# $language = "Python"
# $interface = "1.0"

# Connect to a telnet server and automate the initial login sequence.
# Note that synchronous mode is enabled to prevent server output from
# potentially being missed.

def main():
	crt.Screen.Synchronous = True
	crt.Screen.Send("Zdes-mogla-bit-vasha-reklamar")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("show run | inc ip router")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("conf tr")
	crt.Screen.WaitForString("(config)#")
	crt.Screen.Send("ip route 10.10.10.8 255.255.255.252 ")
	crt.Screen.WaitForString("(config)#")
	crt.Screen.Send("endr")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("copy run star")
	crt.Screen.WaitForString("[startup-config]?")
	crt.Screen.Send("r")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("exitr")
	crt.Screen.Synchronous = False
main()

在此腳本中,在以下行中:crt.Screen.Send("ip route 10.10.10.8 255.255.255.252 ") 沒有添加網關的 IP 地址,也沒有回車符。 The script is waiting for the next line with the characters "(config) #" 這些字符出現在我輸入ip地址後回車。

結論:

在編寫腳本和執行腳本時,必須遵循以下規則:編寫腳本和執行腳本的時間永遠不應超過理論上手動執行相同工作所花費的時間(從記事本複制/粘貼,編寫和調試) ansible、編寫和調試 python 腳本的劇本)。 也就是說,腳本的使用應該節省時間,而不是將時間浪費在流程的一次性自動化上(即,當腳本是唯一的並且不會再有重複時)。 但是,如果腳本是獨一無二的,並且腳本自動化和編寫/調試腳本比以任何其他方式(ansible,命令窗口)完成它花費的時間更少,那麼腳本是最好的解決方案。
調試腳本。 腳本逐漸增長,調試在第一台、第二台、第三台設備上進行,到第四台時,腳本很可能會完全運行。

使用鼠標運行腳本(通過輸入用戶名+密碼)通常比從記事本複制用戶名和密碼更快。 但從安全的角度來看並不安全。
使用腳本時的另一個(真實)示例:您無法直接訪問網絡設備。 但是需要配置所有的網絡設備(帶進監控系統,多配置一個Username/password/snmpv3username/password)。 當您轉到核心交換機時可以訪問,您可以從它打開 SSH 到其他設備。 為什麼你不能使用 Ansible。 - 因為我們遇到了網絡設備上允許的同時會話數量限制(線路 vty 0 4,用戶界面 vty 0 4)(另一個問題是如何在 Ansible 中使用相同的 SSH 第一跳啟動不同的設備)。

該腳本減少了長時間操作的時間——例如,通過 FTP 複製文件。 複製完成後,腳本立即開始運行。 一個人需要看到復制結束,然後意識到復制結束,然後輸入適當的命令。 該腳本客觀上做得更快。

腳本適用於無法使用海量數據傳輸工具的地方:控制台。 或者當設備的某些數據是唯一的時:主機名、管理 ip 地址。 或者在編寫程序和調試時,它比在腳本運行時添加從設備接收的數據更困難。 - 當每個設備都有自己的 Internet 提供商的 IP 地址時,用於指定路由的腳本示例。 (我的同事寫了這樣的腳本 - 當 DMVPN 發言超過 3 時。有必要更改 DMVPN 設置)。

案例研究:使用控制台端口在新交換機上配置初始設置:

A. 將控制台電纜插入設備。
B、運行腳本
B. 等待腳本執行
D. 將控制台電纜插入下一個設備。
E. 如果交換機不是最後一個,轉到步驟 B。

作為腳本工作的結果:

  • 初始密碼設置在設備上。
  • 輸入用戶名
  • 輸入設備的唯一 IP 地址。

PS必須重複該操作。 因為沒有配置/禁用默認 ssh。 (是的,這是我的錯誤。)

使用的來源。

1. 關於創建腳本
2. 腳本示例

附錄 1:示例腳本。


一個長腳本示例,包含兩個查詢:主機名和 IP 地址。 它是為通過控制台(9600 波特)預設設備而創建的。 並準備將設備連接到網絡。

# $language = "Python"
# $interface = "1.0"

# Connect to a telnet server and automate the initial login sequence.
# Note that synchronous mode is enabled to prevent server output from
# potentially being missed.

def main():
	crt.Screen.Synchronous = True
	crt.Screen.Send("r")
	crt.Screen.WaitForString("name")
	crt.Screen.Send("adminr")
	crt.Screen.WaitForString("Password:")
	crt.Screen.Send("Passwordr")
	crt.Screen.Send("sysr")
	crt.Screen.WaitForString("]")
	crt.Screen.Send("interface Vlanif 1r")
	crt.Screen.WaitForString("Vlanif1]")
	crt.Screen.Send("undo ip addressr")
	crt.Screen.Send("shutdownr")
	crt.Screen.Send("vlan 100r")
	crt.Screen.Send(" description description1r")
	crt.Screen.Send(" name description1r")
	crt.Screen.Send("vlan 110r")
	crt.Screen.Send(" description description2r")
	crt.Screen.Send(" name description2r")
	crt.Screen.Send("vlan 120r")
	crt.Screen.Send(" description description3r")
	crt.Screen.Send(" name description3r")
	crt.Screen.Send("vlan 130r")
	crt.Screen.Send(" description description4r")
	crt.Screen.Send(" name description4r")
	crt.Screen.Send("vlan 140r")
	crt.Screen.Send(" description description5r")
	crt.Screen.Send(" name description5r")
	crt.Screen.Send("vlan 150r")
	crt.Screen.Send(" description description6r")
	crt.Screen.Send(" name description6r")
	crt.Screen.Send("vlan 160r")
	crt.Screen.Send(" description description7r")
	crt.Screen.Send(" name description7r")
	crt.Screen.Send("vlan 170r")
	crt.Screen.Send(" description description8r")
	crt.Screen.Send(" name description8r")               
	crt.Screen.Send("vlan 180r")
	crt.Screen.Send(" description description9r")
	crt.Screen.Send(" name description9r")
	crt.Screen.Send("vlan 200r")
	crt.Screen.Send(" description description10r")
	crt.Screen.Send(" name description10r")
	crt.Screen.Send("vlan 300r")
	crt.Screen.Send(" description description11r")
	crt.Screen.Send(" name description11r")
	crt.Screen.Send("quitr")
	crt.Screen.WaitForString("]")
	crt.Screen.Send("stp region-configurationr")
	crt.Screen.Send("region-name descr")
	crt.Screen.Send("active region-configurationr")
	crt.Screen.WaitForString("mst-region]")
	crt.Screen.Send("quitr")
	crt.Screen.Send("stp instance 0 priority 57344r")
	crt.Screen.WaitForString("]")
	crt.Screen.Send("interface range GigabitEthernet 0/0/1 to GigabitEthernet 0/0/42r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("description Usersr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port link-type hybridr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("voice-vlan 100 enabler")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("voice-vlan legacy enabler")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port hybrid pvid vlan 120r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port hybrid tagged vlan 100r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port hybrid untagged vlan 120r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("stp edged-port enabler")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("trust 8021pr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control action blockr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control enable trapr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("quitr")
	crt.Screen.Send("interface range GigabitEthernet 0/0/43 to GigabitEthernet 0/0/48r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("description Printersr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port link-type accessr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port default vlan 130r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("stp edged-port enabler")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("trust 8021pr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control action blockr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control enable trapr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("quitr")
	crt.Screen.Send("interface range XGigabitEthernet 0/0/1 to XGigabitEthernet 0/0/2r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("description uplinkr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port link-type trunkr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port trunk allow-pass vlan 100 110 120 130 140 150 160 170 180 200r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port trunk allow-pass vlan 300r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control action blockr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control enable trapr")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("quitr")
	crt.Screen.Send("ntp-service unicast-server 10.10.10.4r")
	crt.Screen.Send("ntp-service unicast-server 10.10.10.2r")
	crt.Screen.Send("ntp-service unicast-server 10.10.10.134r")
	crt.Screen.Send("ip route-static 0.0.0.0 0.0.0.0 10.10.10.254r")
	crt.Screen.Send("interface Vlanif 200r")
	crt.Screen.WaitForString("-Vlanif200]")
	crt.Screen.Send("r")
	crt.Screen.WaitForString("-Vlanif200]")
	crt.Screen.Send("r")
	crt.Screen.WaitForString("-Vlanif200]")
	crt.Screen.Send("r")
	crt.Screen.WaitForString("-Vlanif200]")
	crt.Screen.Send("r")
	crt.Screen.WaitForString("-Vlanif200]")
	crt.Screen.Send("r")
	crt.Screen.WaitForString("-Vlanif200]")
	crt.Screen.Send("r")
	crt.Screen.WaitForString("-Vlanif200]")
	crt.Screen.Send("r")
	crt.Screen.WaitForString("-Vlanif200]")
        hostnamestr = crt.Dialog.Prompt("Enter hostname:", "hostname", "", False)
        ipaddressstr = crt.Dialog.Prompt("Enter ip address:", "ip", "", False)
	crt.Screen.Send("ip address 10.10.10.")
	crt.Screen.Send(ipaddressstr)
	crt.Screen.Send(" 24r")
	crt.Screen.Send("quitr")
	crt.Screen.Send("sysname ")
	crt.Screen.Send(hostnamestr)
	crt.Screen.Send("r")
	crt.Screen.WaitForString("]")
	crt.Screen.Synchronous = False
main()

此類腳本通常不需要,但設備數量為 15 件。 允許更快的設置。 使用 SecureCRT 命令窗口設置設備速度更快。

為 ssh 設置一個帳戶。

另一個例子。 配置也是通過控制台進行的。

# $language = "Python"
# $interface = "1.0"

# Connect to a telnet server and automate the initial login sequence.
# Note that synchronous mode is enabled to prevent server output from
# potentially being missed.

def main():
	crt.Screen.Synchronous = True
	crt.Screen.Send("r")
	crt.Screen.WaitForString("name")
	crt.Screen.Send("adminr")
	crt.Screen.WaitForString("Password:")
	crt.Screen.Send("Passwordr")
	crt.Screen.WaitForString(">")
	crt.Screen.Send("sysr")
	crt.Screen.Send("stelnet server enabler")
	crt.Screen.Send("aaar")
	crt.Screen.Send("local-user admin service-type terminal ftp http sshr")
	crt.Screen.Send("quitr")
	crt.Screen.Send("user-interface vty 0 4r")
	crt.Screen.Send("authentication-mode aaar")
	crt.Screen.Send("quitr")
	crt.Screen.Send("quitr")
	crt.Screen.Synchronous = False
main()


關於 SecureCRT:付費軟件:99美元起(最低價僅SecureCRT一年)
官方網站
購買一次軟件許可證,並提供支持(用於更新),然後該軟件可無限期使用此許可證。

適用於 Mac OS X 和 Windows 操作系統。

有腳本支持(本文)
命令窗口
串口/Telnet/SSH1/SSH2/Shell操作系統

來源: www.habr.com