为什么要用SecureCRT编写Python脚本

日常网络运维中,登录几十台甚至上百台设备执行相同命令是常态。手动逐台操作不仅耗时,还容易遗漏或出错。SecureCRT自7.0版本起内置了Python脚本引擎(支持Python 2和Python 3,具体取决于安装版本),允许用户通过脚本直接控制终端会话,把重复劳动交给程序完成。

SecureCRT相关配图

SecureCRT Python脚本编写的核心价值在于:脚本可以调用内置的`crt`对象,向远程设备发送命令、等待特定输出、读取屏幕内容、操作多个标签页会话。这意味着你不需要额外安装Paramiko或Netmiko等第三方库,仅靠SecureCRT自身就能完成大部分自动化任务。对于刚接触自动化的新手来说,这是门槛最低的起步方式之一。

脚本运行环境配置

在编写第一个脚本之前,需要确认环境已正确配置。

SecureCRT相关配图

打开SecureCRT,进入菜单 Options → Global Options → General → Default Session → Edit Default Settings → Terminal → Mapped Keys,确认没有快捷键冲突。接着检查脚本引擎:进入 Script → Script Engine,确认当前使用的是Python引擎。如果你安装的是SecureCRT 9.x版本,默认已捆绑Python 3解释器,无需单独安装Python环境。

建议在本地创建一个固定的脚本目录,例如`D:\SecureCRT_Scripts\`,然后在 Options → Global Options → General → Script Directory 中指定该路径。这样通过 Script → Run 执行脚本时,SecureCRT会直接定位到这个目录,省去每次手动浏览的麻烦。

写一个最简单的测试脚本验证环境是否正常:

```python # test_hello.py crt.Dialog.MessageBox("环境配置成功,可以开始编写脚本了!") ```

通过 Script → Run 选择该文件,如果弹出对话框,说明环境就绪。

crt对象核心API速查

SecureCRT Python脚本编写的所有能力都围绕全局`crt`对象展开。掌握以下几个常用属性和方法,就能覆盖大多数运维场景:

SecureCRT相关配图

`crt.Session.Connect("/SSH2 /L username /PASSWORD password /C 3DES-CBC hostname")`——通过脚本发起SSH连接,参数中可指定协议、用户名、加密算法等。

`crt.Screen.Send("show version\n")`——向当前会话发送命令,`\n`表示回车。

`crt.Screen.WaitForString("#", 10)`——等待屏幕出现`#`提示符,超时时间10秒。超时未匹配会返回False,可用于判断设备是否响应异常。

`crt.Screen.ReadString("#")`——读取屏幕内容直到遇到指定字符串,返回值就是这段输出文本,适合用来采集命令结果。

`crt.GetTab(index)` 和 `crt.GetTabCount()`——操作多标签页会话,实现跨设备批量执行。

记住一个原则:Send负责"说话",WaitForString负责"听",ReadString负责"记录"。三者配合就是一个完整的交互循环。

实战场景一:批量设备巡检

假设你需要登录多台交换机执行`show version`和`show interface status`,并将结果保存到本地文件。以下脚本可直接使用:

```python # batch_check.py import os

devices = ["192.168.1.1", "192.168.1.2", "192.168.1.3"] commands = ["show version", "show interface status"] output_dir = r"D:\SecureCRT_Scripts\output"

if not os.path.exists(output_dir): os.makedirs(output_dir)

for ip in devices: try: cmd_str = "/SSH2 /L admin /PASSWORD admin123 /ACCEPTHOSTKEYS " + ip crt.Session.Connect(cmd_str) crt.Screen.WaitForString("#", 15)

result = "" for cmd in commands: crt.Screen.Send(cmd + "\n") crt.Screen.WaitForString("#", 15) result += crt.Screen.ReadString("#") + "\n"

filepath = os.path.join(output_dir, ip.replace(".", "_") + ".txt") with open(filepath, "w") as f: f.write(result)

crt.Session.Disconnect() except Exception as e: crt.Dialog.MessageBox("连接 " + ip + " 失败: " + str(e)) ```

运行前将`devices`列表替换为实际IP,修改用户名密码。脚本会依次连接每台设备,执行命令,将输出保存为独立文件。

实战场景二:自动日志采集与常见报错排查

另一个高频需求是定时采集设备日志。可以结合SecureCRT的`crt.Screen.Synchronous`属性确保命令按顺序执行:

```python # log_collect.py crt.Screen.Synchronous = True

crt.Screen.Send("terminal length 0\n") crt.Screen.WaitForString("#", 10)

crt.Screen.Send("show logging\n") log_output = crt.Screen.ReadString("#", 30)

filepath = r"D:\SecureCRT_Scripts\output\device_log.txt" with open(filepath, "w") as f: f.write(log_output)

crt.Screen.Synchronous = False crt.Dialog.MessageBox("日志采集完成,已保存至 " + filepath) ```

`terminal length 0`用于关闭分页,避免输出中途暂停等待按键。`Synchronous = True`确保Send和WaitForString严格同步,防止命令乱序。

常见报错排查:

如果脚本运行后弹出"Object reference not set"错误,通常是因为当前没有活动的终端会话。请确保脚本运行时已有一个已连接的标签页处于前台。

如果`WaitForString`始终超时返回False,检查两点:一是提示符是否匹配(有些设备用`>`而非`#`);二是设备响应是否确实慢于超时阈值,可适当增大秒数。

如果中文输出乱码,在脚本开头加入`# -*- coding: utf-8 -*-`,并确认Session Options → Terminal → Appearance中字符编码设置为UTF-8。

总结

SecureCRT Python脚本编写的学习曲线并不陡峭——配置好脚本目录,理解`crt.Screen`的Send/WaitForString/ReadString三板斧,就能应对批量巡检、日志采集等日常任务。建议从上面两个实战脚本开始修改练习,逐步扩展到更复杂的场景。如果你还没有安装SecureCRT,可以前往官方下载页面获取最新版本,开始你的自动化运维之路。

相关阅读:SecureCRT Python脚本编写使用技巧SecureCRT 下载安装与配置指南:从入门到