下面我将从基础概念、详细步骤、核心 API、完整示例和进阶技巧几个方面,为你详细讲解如何在 SecureCRT 中编写 Python 脚本。

核心概念:SecureCRT 的脚本对象模型
在开始编写脚本之前,理解 SecureCRT 的对象模型至关重要,你的 Python 脚本并不是直接与远程服务器交互,而是通过 SecureCRT 提供的一系列对象来间接操作。
主要的对象层级关系如下:
crt (全局对象,代表整个 SecureCRT 应用程序)
└── Screen (代表当前活动会话的屏幕)
└── Tab (代表一个标签页/会话)
└── Sessions (所有会话的集合)
└── Session (单个会话对象)
└── Screen (该会话的屏幕对象)
最常用的对象是 crt 和 crt.Screen。
crt: 这是脚本的入口点,是全局对象,你可以用它来获取当前会话、发送命令、配置脚本选项等。crt.Screen: 代表当前活动标签页的终端屏幕,你可以用它来读取屏幕上的文本、发送按键、等待特定文本出现等。
详细步骤:编写并运行你的第一个脚本
步骤 1:启用 SecureCRT 的脚本功能
- 打开 SecureCRT。
- 进入菜单
Options->Global Options...。 - 在弹出的窗口中,选择
General->Scripting。 - 确保
Enable Scripting(启用脚本) 复选框被勾选。 - 点击
OK保存。
步骤 2:创建脚本文件
SecureCRT 脚本通常存放在特定的目录下,最推荐的方式是放在用户的个人脚本目录。

-
找到脚本目录:
- 进入菜单
Options->Scripting...。 - 在弹出的窗口中,你会看到
Script Path,这就是你的个人脚本目录,通常路径类似C:\Users\你的用户名\Documents\VanDyke Software\SecureCRT\Scripts。 - 点击
Open按钮打开这个文件夹。
- 进入菜单
-
创建 Python 脚本:
- 在这个文件夹中,新建一个文本文件,命名为
MyFirstScript.py。 - 用一个你喜欢的文本编辑器(如 VS Code, Notepad++, Sublime Text)打开这个文件。
- 在这个文件夹中,新建一个文本文件,命名为
步骤 3:编写脚本代码
将以下代码复制到 MyFirstScript.py 文件中,这个脚本会连接到设备,输入几个命令,并打印输出。
# -*- coding: utf-8 -*-
# 导入 SecureCRT 的 Python 模块
import crt
# 获取当前活动的标签页
tab = crt.GetScriptTab()
# 获取该标签页的屏幕对象
screen = tab.Screen
# --- 脚本逻辑开始 ---
# 1. 发送一个回车,确保我们处于命令行提示符下
screen.Send("\r")
# 2. 等待提示符出现 (这里以 '#' 为例,请根据你的设备实际提示符修改)
# MatchIndex=0 表示匹配第一个出现的文本
# Timeout=10 表示最多等待10秒
# regexp=True 表示使用正则表达式
screen.WaitForStrings(["#", ">", "$"], 10, 0, True)
# 3. 发送 "show version" 命令 (请根据你的设备修改命令)
screen.Send("show version\r")
# 4. 等待命令执行完成,再次看到提示符
screen.WaitForStrings(["#", ">", "$"], 10, 0, True)
# 5. 将屏幕上的所有文本打印到 SecureCRT 的脚本输出窗口
# 这是调试脚本非常有用的方法
crt.Dialog.MessageBox("脚本执行完毕,请查看输出窗口。")
# 获取屏幕的所有行
output = screen.Get(-1, 0, screen.CursorY, 0)
# 将输出写入到 SecureCRT 的日志窗口
crt.Screen.Send(output)
# --- 脚本逻辑结束 ---
步骤 4:在 SecureCRT 中运行脚本
- 确保会话已连接:打开一个到你的网络设备的 SSH/Telnet 会话,并成功登录。
- 运行脚本:
- 方法一(推荐):在 SecureCRT 菜单栏选择
Scripts->Run...,然后选择你刚刚创建的MyFirstScript.py文件。 - 方法二:直接按快捷键
Alt+Shift+R,然后选择脚本文件。 - 方法三:将脚本文件拖到 SecureCRT 的标签栏上,它会自动运行。
- 方法一(推荐):在 SecureCRT 菜单栏选择
步骤 5:查看结果
脚本运行后,你会在终端上看到命令的执行过程,SecureCRT 底部会出现一个 "Script" 输出窗口,这里会打印出 crt.Screen.Send() 的内容,以及我们脚本中最后打印的 show version 的输出,这是你调试脚本的主要依据。

核心 API 和常用方法
掌握以下 API,你就能完成绝大多数自动化任务。
crt 对象 (全局)
| 方法/属性 | 描述 |
|---|---|
crt.GetScriptTab() |
获取当前正在运行脚本的标签页对象。 |
crt.Dialog.MessageBox(message) |
弹出一个消息框,显示 message。 |
crt.Dialog.Prompt(message, title, default_value) |
弹出一个输入框,返回用户输入的字符串。 |
crt.Sleep(seconds) |
让脚本暂停指定的秒数。 |
crt.IniFile |
用于读写 INI 配置文件。 |
Screen 对象 (屏幕)
| 方法/属性 | 描述 |
|---|---|
screen.Send(string) |
发送字符串到远程设备。\r 代表回车。 |
screen.WaitForStrings(strings, timeout, match_index, regexp) |
核心方法,等待屏幕上出现字符串列表中的任意一个。 |
strings: 要等待的字符串列表。 |
|
timeout: 超时时间(秒)。 |
|
match_index: 匹配到列表中的第几个字符串(从0开始)。 |
|
regexp: 是否将 strings 作为正则表达式处理。 |
|
screen.WaitForString(string, timeout, regexp) |
WaitForStrings 的简化版,只等待一个字符串。 |
screen.WaitForCursor() |
等待光标停止移动(用于检测命令执行完毕)。 |
screen.Get(start_row, start_col, end_row, end_col) |
获取屏幕指定矩形区域的文本。-1 代表当前行/列。 |
screen.CurrentRow, screen.CurrentCol |
获取光标的当前位置。 |
screen.CursorY, screen.CursorX |
同上。 |
screen.IgnoreCase = True/False |
设置后续的字符串匹配是否忽略大小写。 |
Tab 对象 (标签页)
| 方法/属性 | 描述 |
|---|---|
tab.Session |
获取该标签页对应的 Session 对象。 |
tab.Screen |
获取该标签页的 Screen 对象。 |
tab.Name |
获取该标签页的名称。 |
完整示例:自动登录并备份配置
这个示例会:
- 提示用户输入设备密码。
- 连接到设备。
- 输入用户名和密码。
- 进入特权模式。
- 发送备份命令,并将输出保存到一个本地文件。
# -*- coding: utf-8 -*-
import crt
import os
# --- 配置 ---
# 请根据你的设备修改这些值
USERNAME = "admin"
# PROMPT 指的是登录成功后的普通用户提示符,如 "Router>"
PROMPT = ">"
# PRIV_PROMPT 指的是进入特权模式后的提示符,如 "Router#"
PRIV_PROMPT = "#"
# BACKUP_COMMAND 是备份配置的命令,不同厂商不同
BACKUP_COMMAND = "show running-config"
# LOCAL_SAVE_PATH 是备份文件保存的本地路径
LOCAL_SAVE_PATH = "C:\\temp\\"
CONFIG_FILENAME = "config_backup.txt"
def main():
"""
主函数,执行自动化任务
"""
# 1. 获取当前活动标签页和屏幕
tab = crt.GetScriptTab()
screen = tab.Screen
# 2. 提示用户输入密码
password = crt.Dialog.Prompt("请输入设备密码:", "密码输入", "", True)
if not password:
crt.Dialog.MessageBox("未输入密码,脚本终止。", "错误", 16) # 16 是错误图标
return
# 3. 等待登录提示符 (假设是 "Username:")
if not screen.WaitForString("Username:", 10):
crt.Dialog.MessageBox("未在10秒内找到 'Username:' 提示,脚本终止。", "错误", 16)
return
# 4. 发送用户名和密码
screen.Send(USERNAME + "\r")
screen.WaitForString("Password:", 5)
screen.Send(password + "\r")
# 5. 等待登录成功,看到普通用户提示符
if not screen.WaitForStrings([PROMPT, "Login incorrect", "Access denied"], 10, 0, True):
crt.Dialog.MessageBox("登录过程异常,脚本终止。", "错误", 16)
return
# 检查是否登录失败
if screen.MatchIndex == 1 or screen.MatchIndex == 2:
crt.Dialog.MessageBox("登录失败: " + screen.ReadString("\n"), "错误", 16)
return
crt.Dialog.MessageBox("登录成功!")
# 6. 进入特权模式
screen.Send("enable\r")
if not screen.WaitForString("Password:", 5):
# 如果没有 enable 密码提示,直接检查是否进入了特权模式
screen.WaitForString(PRIV_PROMPT, 5)
if screen.MatchIndex != 0:
crt.Dialog.MessageBox("无法进入特权模式,可能缺少 enable 密码。", "错误", 16)
return
else:
# 如果有 enable 密码提示,这里需要处理,为简化,我们假设没有。
# 实际脚本中,这里可以再次调用 crt.Dialog.Prompt 获取 enable 密码
screen.Send("\r") # 发送空密码(如果设备允许)
screen.WaitForString(PRIV_PROMPT, 5)
if screen.MatchIndex != 0:
crt.Dialog.MessageBox("进入特权模式失败。", "错误", 16)
return
crt.Dialog.MessageBox("已进入特权模式。")
# 7. 发送备份命令
screen.Send(BACKUP_COMMAND + "\r")
# 等待命令执行完成,再次看到提示符
screen.WaitForString(PRIV_PROMPT, 30)
# 8. 获取配置输出
# 移动光标到命令行的开头
screen.Send("\x1b[0;0H") # ANSI escape code to move cursor to home (0,0)
# 获取从屏幕顶部到当前光标行的所有文本
config_output = screen.Get(0, 0, screen.CursorY, 0)
# 9. 保存到本地文件
try:
# 确保目录存在
if not os.path.exists(LOCAL_SAVE_PATH):
os.makedirs(LOCAL_SAVE_PATH)
full_path = os.path.join(LOCAL_SAVE_PATH, CONFIG_FILENAME)
with open(full_path, "w", encoding="utf-8") as f:
f.write(config_output)
crt.Dialog.MessageBox(f"配置备份成功!\n文件已保存至: {full_path}", "成功", 64) # 64 是信息图标
except Exception as e:
crt.Dialog.MessageBox(f"保存文件时出错: {e}", "错误", 16)
# --- 脚本入口 ---
if __name__ == "__main__":
main()
进阶技巧与最佳实践
-
使用正则表达式:
WaitForStrings的regexp=True参数非常强大。screen.WaitForStrings([r"([a-fA-F0-9]{4}\.){3}[a-fA-F0-9]{4}"], 10)可以等待一个 MAC 地址的出现。 -
调试:
- 善用
crt.Dialog.MessageBox:在脚本的关键节点用它来打印变量状态或确认流程。 - 善用
crt.Screen.Send():将中间结果或变量值通过Send打印到终端上,方便观察。 crt.Sleep():在不确定网络延迟或设备响应速度时,适当加入Sleep可以让脚本更稳定,但应作为最后的手段,优先使用WaitFor...系列。
- 善用
-
代码结构:将复杂的逻辑封装成函数,如
login(),enter_privileged_mode(),backup_config(),使代码更清晰、可复用。 -
错误处理:使用
try...except块来捕获和处理可能发生的异常(如网络中断、命令执行失败等),避免脚本意外崩溃。 -
SecureCRT 对象浏览器:在
Options->Scripting...中,有一个Object Explorer按钮,点击它可以看到所有可用的对象、方法和属性的详细列表,是学习和查阅 API 的最佳工具。
你应该已经掌握了在 SecureCRT 中编写 Python 脚本的核心方法,从简单的命令发送到复杂的自动化流程,都可以通过这个强大的工具来实现,祝你玩得开心!
