杰瑞科技汇

SecureCRT里如何直接运行Python脚本?

核心概念:SecureCRT 脚本引擎

SecureCRT 自身包含一个 Python 解释器,你不需要在你的电脑上单独安装 Python,也不需要配置环境变量,你只需要将 Python 脚本文件(.py)放在 SecureCRT 的脚本目录中,然后通过 SecureCRT 的菜单或命令来运行它。

SecureCRT里如何直接运行Python脚本?-图1
(图片来源网络,侵删)

优点:

  • 环境独立: 脚本可以在任何安装了 SecureCRT 的机器上运行,无需担心 Python 版本问题。
  • 无缝集成: 脚本可以直接与当前活动的 SecureCRT 会话交互,获取连接信息、发送命令、接收输出。
  • 功能强大: 可以利用 crt 对象访问所有 SecureCRT 的功能和会话信息。

使用内置的 Script 菜单(最简单)

这是最直接的方法,适合测试和一次性任务。

步骤:

  1. 编写 Python 脚本 创建一个简单的 Python 脚本,get_version.py

    SecureCRT里如何直接运行Python脚本?-图2
    (图片来源网络,侵删)
    # get_version.py
    # 这个脚本会连接到设备,并显示其版本信息
    # 1. 获取当前活动的 SecureCRT 会话
    session = crt.Session
    # 2. 获取连接的选项卡名称(通常是设备的主机名或IP)
    tab_name = session.Tab.Caption
    print(f"正在连接到: {tab_name}")
    # 3. 发送命令并等待输出
    # 使用 crt.Screen 对象来与设备交互
    # Send() 发送命令
    # WaitForString() 等待特定的字符串出现,确保命令执行完成
    crt.Screen.Send("show version" + "\n")  # 发送 "show version" 命令,并加上回车
    crt.Screen.WaitForString("#")          # 等待命令提示符(通常是 # 或 >)出现
    # 4. 获取命令的输出
    output = crt.Screen.Get(crt.Screen.CurrentRow - 10, 1, crt.Screen.CurrentRow, 80) # 获取屏幕上的文本
    # 5. 将输出写入文件
    log_file = f"{tab_name}_version_log.txt"
    with open(log_file, "w") as f:
        f.write(output)
    print(f"版本信息已保存到: {log_file}")
    print("脚本执行完毕。")
    
  2. 保存脚本 将上述代码保存为 get_version.py 文件。强烈建议将其保存在 SecureCRT 的默认脚本目录中,这样方便管理和调用。

    • 默认脚本目录路径: 你可以在 SecureCRT 中通过 Options -> Scripting -> Script Paths 查看,通常是:
      • Windows: C:\Program Files (x86)\VanDyke Software\SecureCRT\Scripts
      • macOS: /Applications/SecureCRT.app/Contents/Scripts
      • Linux: /opt/vandyke/securecrt/Scripts
  3. 在 SecureCRT 中运行脚本

    • 打开一个到网络设备的会话(一台 Cisco 路由器)。
    • 确保你已经登录到设备的 CLI 界面。
    • 点击顶部菜单栏的 Script -> Run
    • 在弹出的文件选择对话框中,找到并选择你刚刚保存的 get_version.py 脚本。
    • 点击“运行”。
  4. 查看结果 你会看到 SecureCRT 的屏幕输出脚本的 print 语句,并且在 SecureCRT 的安装目录下会生成一个包含设备版本信息的日志文件。


使用命令行运行(适合自动化和批处理)

当你需要将脚本集成到更大的自动化流程中时,使用命令行运行会更加灵活。

SecureCRT里如何直接运行Python脚本?-图3
(图片来源网络,侵删)

步骤:

  1. 编写脚本 脚本编写方法与上面相同。

  2. 打开命令提示符或终端 在你的电脑上打开 cmd (Windows) 或 Terminal (macOS/Linux)。

  3. 执行命令 使用 SecureCRT.exe/script 参数来指定并运行脚本。

    基本语法:

    "C:\Path\To\SecureCRT.exe" /script "C:\Path\To\Your\Script.py"

    示例:

    "C:\Program Files (x86)\VanDyke Software\SecureCRT\SecureCRT.exe" /script "C:\Scripts\get_version.py"

重要提示:

  • 指定会话: 默认情况下,命令行方式运行的脚本不会自动连接到某个会话,你需要让脚本自己处理连接。
  • 使用 .vbs.py 作为启动器: 一个更常见的模式是,写一个简单的启动脚本(.vbs 或另一个 .py),这个启动脚本会打开一个或多个 SecureCRT 会话,然后调用你的主脚本,在 SecureCRT 的官方文档和示例库中有大量这样的例子。

将 Python 脚本绑定到按钮(最常用)

这是将常用功能固化为“一键操作”的最佳方式,极大提升工作效率。

步骤:

  1. 编写脚本 脚本编写方法与上面相同。

  2. 创建自定义按钮

    • 在 SecureCRT 中,点击 Options -> Customizable Layouts
    • 在弹出的窗口中,选择 Toolbars 标签页。
    • 点击 New... 按钮来创建一个新的工具栏,或者选择一个已有的工具栏进行编辑。
    • 点击 Add... 按钮。
  3. 配置按钮

    • Caption: 给按钮起一个名字,"Get Version"。
    • Icon: 可以为按钮选择一个图标。
    • Action: 这是最关键的一步,选择 Run a script,然后点击 Browse...,找到并选择你的 Python 脚本(get_version.py)。
  4. 保存并使用

    • 点击 OKClose 保存设置。
    • 你会在工具栏上看到这个新按钮。
    • 以后,只要你想执行这个操作,只需确保目标设备的会话是活动状态,然后点击这个按钮即可。

SecureCRT Python 脚本核心对象

要写出强大的脚本,你需要了解几个核心对象:

  • crt 对象:脚本的根对象,提供对全局设置和功能的访问。
    • crt.Screen: 与当前活动会话的屏幕进行交互(发送命令、读取输出)。
    • crt.Session: 获取当前活动会话的信息(主机名、用户名、密码等)。
    • crt.Dialog: 显示对话框,用于与用户交互(输入信息、选择文件等)。
  • tab 对象:代表一个 SecureCRT 标签页。
    • tab.Session: 获取该标签页对应的会话对象。
    • tab.Caption: 获取标签页的名称。
  • screen 对象:代表一个会话的屏幕。
    • screen.Send("command"): 发送命令。
    • screen.WaitForString("prompt"): 等待字符串出现。
    • screen.WaitForStrings(["prompt1", "prompt2"]): 等待多个字符串中的任意一个出现。
    • screen.Get(row_start, col_start, row_end, col_end): 获取屏幕指定区域的文本。
    • screen.WaitForString("Press any key to continue", 5): 可以设置超时时间(单位:秒)。

进阶示例:自动备份设备配置

这个示例会自动登录到设备,进入特权模式,备份配置,并将配置保存到本地文件。

# backup_config.py
import os
import datetime
# --- 配置 ---
# 将你的设备登录信息放在这里,或者使用 crt.Dialog 让用户输入
# USERNAME = "admin"
# PASSWORD = "your_password"
# ENABLE_PASSWORD = "your_enable_password" # 如果需要
# --- 脚本主逻辑 ---
# 1. 获取当前会话
session = crt.Session
tab = session.Tab
screen = crt.Screen
# 2. 获取设备信息用于文件命名
hostname = tab.Caption
if not hostname or hostname.startswith("Telnet") or hostname.startswith("SSH"):
    # 如果标签页名称不是主机名,可以尝试从提示符中提取
    screen.Send("\n") # 发送一个回车,看看提示符是什么
    screen.WaitForString("#", 2) or screen.WaitForString(">", 2)
    prompt_line = screen.CurrentRow
    hostname = screen.Get(prompt_line, 1, prompt_line, 20).strip().split("#")[0].split(">")[0]
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
backup_filename = f"{hostname}_config_{timestamp}.txt"
# 3. 发送备份命令
print(f"开始备份 {hostname} 的配置...")
# 示例针对 Cisco IOS 设备
# 你需要根据你的设备类型调整命令
try:
    # 进入特权模式(如果不在的话)
    if screen.WaitForString("#", 1):
        print("已在特权模式。")
    else:
        screen.Send("enable\n")
        # 如果有 enable 密码,在这里处理
        # screen.WaitForString("Password:")
        # screen.Send(ENABLE_PASSWORD + "\n")
        screen.WaitForString("#", 5)
        print("已进入特权模式。")
    # 进入全局配置模式(可选,如果需要保存配置)
    # screen.Send("configure terminal\n")
    # screen.WaitForString("(config)#")
    # 执行备份命令
    screen.Send(f"show running-config\n")
    screen.WaitForString("#") # 等待命令结束
    # 4. 获取配置并保存
    # 假设配置显示满了屏幕,需要分页
    # 我们可以循环按空格直到最后一页
    while True:
        if screen.WaitForString("--More--", 1):
            screen.Send(" ")
        else:
            break
    # 获取所有配置文本
    config_output = screen.Get(screen.CurrentRow - 1000, 1, screen.CurrentRow, 80) # 调整范围以获取完整输出
    with open(backup_filename, "w", encoding="utf-8") as f:
        f.write(config_output)
    print(f"配置备份成功!文件已保存为: {os.path.abspath(backup_filename)}")
except Exception as e:
    print(f"发生错误: {e}")
print("脚本执行完毕。")

总结与建议

方法 优点 缺点 适用场景
Script 菜单 简单直观,无需命令行 手动操作,无法自动化 测试脚本、一次性任务
命令行运行 可集成到批处理、CI/CD 流程 需要处理会话连接,较复杂 自动化运维、定时任务
绑定到按钮 一键执行,效率最高 需要手动配置一次 日常高频重复操作

最佳实践建议:

  1. 从官方示例开始: VanDyke 官方网站提供了大量高质量的 Python 和 VBScript 示例,是学习的最佳资源。
  2. 使用日志: 在脚本中多使用 print 语句,或者将日志写入文件,这有助于调试。
  3. 处理超时和错误: 网络设备响应可能不稳定,使用 WaitForString 的超时功能,并用 try...except 捕获异常,让你的脚本更健壮。
  4. 先在测试设备上运行: 在对生产设备执行任何自动化操作前,务必先在测试环境充分验证脚本。

希望这份详细的指南能帮助你在 SecureCRT 中顺利地使用 Python 进行自动化工作!

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