使用脚本在 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操作系统

来源: habr.com