杰瑞科技汇

securecrt 编写python

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

securecrt 编写python-图1
(图片来源网络,侵删)

核心概念:SecureCRT 的脚本对象模型

在开始编写脚本之前,理解 SecureCRT 的对象模型至关重要,你的 Python 脚本并不是直接与远程服务器交互,而是通过 SecureCRT 提供的一系列对象来间接操作。

主要的对象层级关系如下:

crt (全局对象,代表整个 SecureCRT 应用程序)
  └── Screen (代表当前活动会话的屏幕)
  └── Tab (代表一个标签页/会话)
  └── Sessions (所有会话的集合)
        └── Session (单个会话对象)
              └── Screen (该会话的屏幕对象)

最常用的对象是 crtcrt.Screen

  • crt: 这是脚本的入口点,是全局对象,你可以用它来获取当前会话、发送命令、配置脚本选项等。
  • crt.Screen: 代表当前活动标签页的终端屏幕,你可以用它来读取屏幕上的文本、发送按键、等待特定文本出现等。

详细步骤:编写并运行你的第一个脚本

步骤 1:启用 SecureCRT 的脚本功能

  1. 打开 SecureCRT。
  2. 进入菜单 Options -> Global Options...
  3. 在弹出的窗口中,选择 General -> Scripting
  4. 确保 Enable Scripting (启用脚本) 复选框被勾选。
  5. 点击 OK 保存。

步骤 2:创建脚本文件

SecureCRT 脚本通常存放在特定的目录下,最推荐的方式是放在用户的个人脚本目录。

securecrt 编写python-图2
(图片来源网络,侵删)
  1. 找到脚本目录

    • 进入菜单 Options -> Scripting...
    • 在弹出的窗口中,你会看到 Script Path,这就是你的个人脚本目录,通常路径类似 C:\Users\你的用户名\Documents\VanDyke Software\SecureCRT\Scripts
    • 点击 Open 按钮打开这个文件夹。
  2. 创建 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 中运行脚本

  1. 确保会话已连接:打开一个到你的网络设备的 SSH/Telnet 会话,并成功登录。
  2. 运行脚本
    • 方法一(推荐):在 SecureCRT 菜单栏选择 Scripts -> Run...,然后选择你刚刚创建的 MyFirstScript.py 文件。
    • 方法二:直接按快捷键 Alt+Shift+R,然后选择脚本文件。
    • 方法三:将脚本文件拖到 SecureCRT 的标签栏上,它会自动运行。

步骤 5:查看结果

脚本运行后,你会在终端上看到命令的执行过程,SecureCRT 底部会出现一个 "Script" 输出窗口,这里会打印出 crt.Screen.Send() 的内容,以及我们脚本中最后打印的 show version 的输出,这是你调试脚本的主要依据。

securecrt 编写python-图3
(图片来源网络,侵删)

核心 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 获取该标签页的名称。

完整示例:自动登录并备份配置

这个示例会:

  1. 提示用户输入设备密码。
  2. 连接到设备。
  3. 输入用户名和密码。
  4. 进入特权模式。
  5. 发送备份命令,并将输出保存到一个本地文件。
# -*- 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()

进阶技巧与最佳实践

  1. 使用正则表达式WaitForStringsregexp=True 参数非常强大。screen.WaitForStrings([r"([a-fA-F0-9]{4}\.){3}[a-fA-F0-9]{4}"], 10) 可以等待一个 MAC 地址的出现。

  2. 调试

    • 善用 crt.Dialog.MessageBox:在脚本的关键节点用它来打印变量状态或确认流程。
    • 善用 crt.Screen.Send():将中间结果或变量值通过 Send 打印到终端上,方便观察。
    • crt.Sleep():在不确定网络延迟或设备响应速度时,适当加入 Sleep 可以让脚本更稳定,但应作为最后的手段,优先使用 WaitFor... 系列。
  3. 代码结构:将复杂的逻辑封装成函数,如 login(), enter_privileged_mode(), backup_config(),使代码更清晰、可复用。

  4. 错误处理:使用 try...except 块来捕获和处理可能发生的异常(如网络中断、命令执行失败等),避免脚本意外崩溃。

  5. SecureCRT 对象浏览器:在 Options -> Scripting... 中,有一个 Object Explorer 按钮,点击它可以看到所有可用的对象、方法和属性的详细列表,是学习和查阅 API 的最佳工具。

你应该已经掌握了在 SecureCRT 中编写 Python 脚本的核心方法,从简单的命令发送到复杂的自动化流程,都可以通过这个强大的工具来实现,祝你玩得开心!

分享:
扫描分享到社交APP
上一篇
下一篇