使用脚本自动输入到SecureCRT

网络工程师通常负责将某些片段从记事本复制/粘贴到控制台。通常,您必须复制一些参数:用户名/密码以及其他内容。使用脚本可以加快此过程。但是编写脚本和执行脚本的任务总共要比手动配置花费更少的时间,否则这些脚本是无用的。

本文的目的是什么?本文来自“快速启动”周期,旨在为网络工程师节省在多台设备上设置设备(一项任务)时的时间。它使用SecureCRT软件和内置脚本执行功能。



介绍


框内的SecureCRT程序内置了脚本执行引擎。为什么我们在终端中需要脚本:

  • 自动化的输入和输出,以及对输入/输出正确性的最小检查。
  • 为了加快日常任务的执行速度-减少设备设置之间的停顿。(实际上减少了由于在同一设备上执行复制/过去操作的时间而造成的暂停,并且可以在该设备上使用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("admin\r")
  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会记录命令和设备的后续响应,并显示现成的脚本。

和。运行脚本录制:
菜单SecureCRT =>脚本=>开始录制脚本
b。使用控制台执行操作(执行CLI中的配置步骤)。
在。要完成脚本的录制,请执行以下操作:
菜单SecureCRT =>脚本=>停止录制脚本...
用脚本保存文件。

已执行命令和已保存脚本的示例:



在SecureCRT上运行脚本。


创建/编辑脚本后,出现一个逻辑问题:如何应用脚本?
有几种方法:

  • 从脚本菜单手动启动
  • 连接后自动启动(登录脚本)
  • 不使用脚本即可自动登录
  • 使用SecureCRT中的按钮手动启动(尚未创建按钮并将其添加到SecureCRT)


从脚本菜单手动启动


SecureCRT菜单=>脚本=>运行...-
最后10个脚本会被记住并可以快速启动:
SecureCRT菜单=>脚本=> 1“脚本文件名”
SecureCRT菜单=>脚本=> 2“脚本文件名”
SecureCRT菜单=>脚本=> 3“带有脚本的文件名”
菜单SecureCRT =>脚本=> 4“带有脚本的文件名”
菜单SecureCRT =>脚本=> 5“带有脚本的文件名”

连接后自动启动(登录脚本)


针对已保存的会话配置自动日志记录脚本的设置:连接=>登录操作=>登录脚本



不使用脚本即可自动登录


仅使用内置的SecureCRT功能,无需编写脚本即可自动输入密码用户名。在连接设置中,“连接” =>登录操作=>“自动登录”-您需要填写多个捆绑包-其中涉及成对的内容:“期望的文本” +“向该文本发送字符”,可以有许多这样的对。(示例:第一对等待用户名,第二对等待密码,第三对等待特权模式的邀请,第四对特权模式的密码。)

在Cisco ASA上自动登录的示例:



使用SecureCRT中的按钮手动启动(尚未创建按钮并将其添加到SecureCRT)


在SecureCRT中,您可以指定一个脚本按钮。该按钮将添加到为此专门创建的面板中。

和。在界面中添加一个面板:SecureCRT菜单=>视图=>按钮栏
b。在面板上添加一个按钮并添加一个脚本。 -右键单击按钮栏,然后在上下文菜单中选择“新建按钮...”。
在。在对话框“映射按钮”中的“动作”字段中,选择动作(功能)“运行脚本”。
指定按钮的签名。按钮图标的颜色。单击确定完成设置。



注意:

按钮栏是非常有用的功能。

1.登录可以向特定会话指示默认情况下打开此选项卡的面板。

2.设备可以使用标准操作来设置预定义的操作:显示显示版本,显示运行配置,保存配置。


这些按钮没有附加脚本。仅符合动作:


设置-在切换到会话时,会在会话设置中打开带有按钮的必要面板:


对于客户而言,为登录配置单个脚本并转到带有频繁命令的供应商面板可以很有意义。


当您单击Cisco Go按钮时,面板将切换到Cisco Button Bar。



使用简单和高级脚本的示例。(来自现实生活的实践。)


简单的脚本几乎可以满足所有情况。但是一旦我需要使脚本复杂一点,就可以加快工作速度。这种复杂性仅要求用户在对话框中提供其他数据。

使用对话框从用户请求数据


我在数据请求脚本中输入了2,这是主机名和IP地址的第四个八位字节。要执行此操作-我在Google上搜索了操作方法,并在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(" 23\r")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("sysname ")
	crt.Screen.Send(hostnamestr)
	crt.Screen.Send("\r") 

脚本的这一部分要求最后一个八位位组的主机名和数字。由于设备是15个。然后将数据呈现在表中,然后我从表中复制值并将其粘贴到对话框中。此外,脚本是独立工作的。

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.1\r")
	crt.Screen.WaitForString("Name")
	crt.Screen.Send("admin\r")
	crt.Screen.WaitForString("Password:")
	crt.Screen.Send("Password\r")
	crt.Screen.WaitForString("ftp")
	crt.Screen.Send("binary\r")
	crt.Screen.WaitForString("ftp")
	crt.Screen.Send("put S5720LI-V200R011SPH016.pat\r")
	crt.Screen.WaitForString("ftp")
	crt.Screen.Send("quit\r")
	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("snmpadmin\r")
	crt.Screen.WaitForString("assword:")
	crt.Screen.Send("Password\r")
	crt.Screen.Synchronous = False
main()

注意:该脚本为2。一个用于管理员帐户,第二个用于eSIGHT帐户。

具有在脚本执行期间直接附加数据的功能的脚本。


任务是在所有网络设备上添加一条静态路由。但是每个设备上的Internet网关都有自己的网关(它不同于默认网关)。以下脚本显示了路由表,进入了配置模式并且没有完全完成命令(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-reklama\r")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("show run | inc ip route\r")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("conf t\r")
	crt.Screen.WaitForString("(config)#")
	crt.Screen.Send("ip route 10.10.10.8 255.255.255.252 ")
	crt.Screen.WaitForString("(config)#")
	crt.Screen.Send("end\r")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("copy run sta\r")
	crt.Screen.WaitForString("[startup-config]?")
	crt.Screen.Send("\r")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("exit\r")
	crt.Screen.Synchronous = False
main()

在此脚本中,在以下行中:crt.Screen.Send(“ ip route 10.10.10.8 255.255.255.252”),未添加网关的IP地址,并且没有回车符。脚本正在等待下一行出现“(config)#”字符,这些字符是在我输入ip地址并输入后出现的。

结论:


在编写脚本和执行脚本时,一定要遵循以下规则:编写脚本和执行脚本的时间不得长于理论上手动完成相同工作的时间(从记事本复制/粘贴,为ansible编写和调试剧本,进行编写和调试) python脚本)。也就是说,使用脚本应该节省时间,而不会浪费时间进行流程的一次性自动化(即,当脚本是唯一的并且不再重复时)。但是,如果脚本是唯一的,并且通过脚本进行自动化以及编写/调试脚本所需的时间少于通过其他任何方式(可操作的,命令窗口)的执行时间,则脚本是最佳的解决方案。
调试脚本。该脚本逐渐增长,调试在第一,第二,第三设备上进行,而到第四,该脚本很可能将完全运行。

使用鼠标运行脚本(使用用户名+密码)通常比从记事本复制用户名和密码要快。但是从安全角度来看并不安全。
使用脚本时的另一个(实际)示例:您没有直接访问网络设备的权限。但是需要配置所有网络设备(添加到监视系统中,配置其他用户名/密码/ snmpv3用户名/密码)。当您转到核心交换机时,可以访问它,从它打开SSH到其他设备。为什么您不能使用Ansible。 -因为我们遇到了对网络设备上允许的同时会话数的限制(第vty 0 4行,用户界面vty 0 4)(另一个问题是如何使用相同的SSH第一跳在Ansible中启动不同的设备)。

该脚本减少了长时间操作时的时间-例如,通过FTP复制文件。复制完成后,脚本立即开始工作。一个人将需要查看复制的结束,然后意识到复制的结束,然后输入适当的命令。该脚本客观上更快地完成了此任务。

该脚本适用于无法使用海量数据传递方式的情况:控制台。或者,当设备的某些数据唯一时:主机名,管理IP地址。或者,编写程序并对其进行调试比添加脚本运行时从设备接收的数据要困难得多。 -每个设备都有其自己的Internet提供商IP地址时,带有用于指定路由的脚本的示例。 (我的同事写了这样的脚本-当DMVPN代表300个时。必须更改DMVPN设置)。

案例研究:通过控制台端口在新交换机上的初始设置:

A.我将控制台电缆插入设备。
B.启动脚本
B.等待脚本完成
G.将控制台电缆拖到下一个设备。
D.如果开关不是最后一个,请转到步骤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("admin\r")
	crt.Screen.WaitForString("Password:")
	crt.Screen.Send("Password\r")
	crt.Screen.Send("sys\r")
	crt.Screen.WaitForString("]")
	crt.Screen.Send("interface Vlanif 1\r")
	crt.Screen.WaitForString("Vlanif1]")
	crt.Screen.Send("undo ip address\r")
	crt.Screen.Send("shutdown\r")
	crt.Screen.Send("vlan 100\r")
	crt.Screen.Send(" description description1\r")
	crt.Screen.Send(" name description1\r")
	crt.Screen.Send("vlan 110\r")
	crt.Screen.Send(" description description2\r")
	crt.Screen.Send(" name description2\r")
	crt.Screen.Send("vlan 120\r")
	crt.Screen.Send(" description description3\r")
	crt.Screen.Send(" name description3\r")
	crt.Screen.Send("vlan 130\r")
	crt.Screen.Send(" description description4\r")
	crt.Screen.Send(" name description4\r")
	crt.Screen.Send("vlan 140\r")
	crt.Screen.Send(" description description5\r")
	crt.Screen.Send(" name description5\r")
	crt.Screen.Send("vlan 150\r")
	crt.Screen.Send(" description description6\r")
	crt.Screen.Send(" name description6\r")
	crt.Screen.Send("vlan 160\r")
	crt.Screen.Send(" description description7\r")
	crt.Screen.Send(" name description7\r")
	crt.Screen.Send("vlan 170\r")
	crt.Screen.Send(" description description8\r")
	crt.Screen.Send(" name description8\r")               
	crt.Screen.Send("vlan 180\r")
	crt.Screen.Send(" description description9\r")
	crt.Screen.Send(" name description9\r")
	crt.Screen.Send("vlan 200\r")
	crt.Screen.Send(" description description10\r")
	crt.Screen.Send(" name description10\r")
	crt.Screen.Send("vlan 300\r")
	crt.Screen.Send(" description description11\r")
	crt.Screen.Send(" name description11\r")
	crt.Screen.Send("quit\r")
	crt.Screen.WaitForString("]")
	crt.Screen.Send("stp region-configuration\r")
	crt.Screen.Send("region-name desc\r")
	crt.Screen.Send("active region-configuration\r")
	crt.Screen.WaitForString("mst-region]")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("stp instance 0 priority 57344\r")
	crt.Screen.WaitForString("]")
	crt.Screen.Send("interface range GigabitEthernet 0/0/1 to GigabitEthernet 0/0/42\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("description Users\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port link-type hybrid\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("voice-vlan 100 enable\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("voice-vlan legacy enable\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port hybrid pvid vlan 120\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port hybrid tagged vlan 100\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port hybrid untagged vlan 120\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("stp edged-port enable\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("trust 8021p\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control action block\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control enable trap\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("interface range GigabitEthernet 0/0/43 to GigabitEthernet 0/0/48\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("description Printers\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port link-type access\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port default vlan 130\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("stp edged-port enable\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("trust 8021p\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control action block\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control enable trap\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("interface range XGigabitEthernet 0/0/1 to XGigabitEthernet 0/0/2\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("description uplink\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port link-type trunk\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port trunk allow-pass vlan 100 110 120 130 140 150 160 170 180 200\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port trunk allow-pass vlan 300\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control action block\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control enable trap\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("ntp-service unicast-server 10.10.10.4\r")
	crt.Screen.Send("ntp-service unicast-server 10.10.10.2\r")
	crt.Screen.Send("ntp-service unicast-server 10.10.10.134\r")
	crt.Screen.Send("ip route-static 0.0.0.0 0.0.0.0 10.10.10.254\r")
	crt.Screen.Send("interface Vlanif 200\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]")
	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(" 24\r")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("sysname ")
	crt.Screen.Send(hostnamestr)
	crt.Screen.Send("\r")
	crt.Screen.WaitForString("]")
	crt.Screen.Synchronous = False
main()

通常不需要这种脚本,但是设备数量为15。允许加快设置。使用SecureCRT Command窗口进一步配置硬件更快。

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("admin\r")
	crt.Screen.WaitForString("Password:")
	crt.Screen.Send("Password\r")
	crt.Screen.WaitForString(">")
	crt.Screen.Send("sys\r")
	crt.Screen.Send("stelnet server enable\r")
	crt.Screen.Send("aaa\r")
	crt.Screen.Send("local-user admin service-type terminal ftp http ssh\r")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("user-interface vty 0 4\r")
	crt.Screen.Send("authentication-mode aaa\r")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("quit\r")
	crt.Screen.Synchronous = False
main()


关于SecureCRT:
: 99$ ( SecureCRT )

1 , ( ), .

Mac OS X Windows.

( )
Command Window
Serial/Telnet/SSH1/SSH2/Shell

All Articles