SecureCRT调用python脚本ImportError

本文详细介绍了 SecureCRT 8.7 版本的更新内容,特别是对高亮功能的改进,以及如何在 SecureCRT 中正确配置 Python 2.7 环境,解决模块导入错误问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2020.2.22日更新

以前的版本只能自定义高亮没有空格的字符串,8.7可以高亮有空格的字符串,更新一下软件,这个功能期待已久

官方8.7自带python版本是2.7.17(为什么不用python3?)

但是官方更改了SecureCRT以前自带python27.dll文件名称为vpython27.dll,所以直接使用下面的方法来更换环境是不行的

 

 

但是没关系,将SecureCRT.exe文件的导入表中vpython27.dll改为python27.dll,再使用下面的方法就可以了

修改导入表方法:

  1. 使用十六进制编辑器打开SecureCRT.exe
  2. 搜索76 70 79 74 68 6F 6E 32 37 2E 64 6C 6C,即vpython27.dll字符串的十六进制表示
  3. 更改为70 79 74 68 6F 6E 32 37 2E 64 6C 6C 00,即python27.dll字符串的十六进制表示
  4. 保存覆盖原SecureCRT.exe文件

-------------------------------------------一条分割线-------------------------------------------

 

环境:Win10 + SecureCRT 8.0 (x64 build 1063) ,该版本SecureCRT的内置python版本为64bit python 2.7.9。不同版本的SecureCRT所使用的python版本也不一样。

注:文章最后有解决方法。

    之前一直写的都是VBS的CRT脚本,但是这个语言应用平台太窄了,最主要很多语法总是让我摸不着脑壳,也没啥文档给我参考,所以换了python写CRT脚本。

 

    毕竟做网络工作,很多时候需要在交换机上查东西,做个自动查询接入交换机各个接口对应用户的MAC,IP及HostName还是极好的。当然查好了自动保存在excel文件中就更好了。

    我能想到的包就需要socket(用来查询hostname),re(正则表达式提取IP和MAC),openpyxl(excel操作),sys,os。

    经过一番奋斗,大体代码写好,看着逻辑也没啥问题,可惜了代码跑不起来...

    为啥os,sys,re模块import都没问题?socket和openpyxl就有问题?

 

    官网查了一波资料,没看出啥问题。只能调试一下了。

    比较幸运,没有反调试,也没什么花(难怪注册机到处都是,我听别人说的),调试器打开CRT,忽略所有异常,一路F9,在CRT中开启脚本,到达上述脚本异常位置。然后别点确定

    就用最简单的方法开搞吧,暴力搜索内存中所有模块中的字符串。搜索上述异常中的ImportError字符串。

   通过前面的内存地址跳转至反汇编窗口。

    看起来应该就是这里。再去内存里定位一下这是谁的代码。

    python2.7。下内存访问断点。重新跑脚本。

 

   再写个代码测试一下:

# $language = "python"
# $interface = "1.0"

#--------------------------------------------------------------------------------------

from platform import python_version
crt.Dialog.MessageBox(python_version(),"run")

# 显示2.7.9

 

    由于之前我一直以为在CRT中跑python脚本需要先安装python环境,所以我之前有装3.6的环境,每次跑脚本也都以为调用的是这个环境,而且所有的代码,每个模块都是在3.6中测试的。

    上图中的python27.dll模块在crt安装目录中就有,所以python的运行环境crt是自带的。

拆了3.6的环境,重建个2.7的环境(我用的是2.7.15),删除crt安装目录下的python27.dll和python27.zip,修改代码使其可以在2.7环境中通过测试。问题解决,且可以使用新环境中的pip安装需要的包。

 

注意:如果2.7的python环境没有建好(检查环境变量),就删掉了crt安装目录下的python27的两个文件,crt将无法启动。至于为啥要删掉安装目录下的python文件,而不是直接使用?难道你不用其他包?我尝试了给python27.zip目录添加制作好的.pyc文件,很可惜,是不行的(我猜测,可能是环境的版本问题,但如果有新的环境,还留着crt自带的干嘛?)

 

注意:不要装3.x的python环境,我测试过crt无法使用这个版本。如果有多个python环境共处,保持2.7.x的版本为默认环境。重新安装2.7版本时,crt如果是64bit,python也要装64bit。

 

 

 

如果是import自己写的模块,请参考:https://blog.youkuaiyun.com/MrRight17/article/details/82874479

 

 

 

<think>我们被要求使用SecureCRTPython脚本通过telnet登录设备。根据引用,我们可以总结出几种方法: 方法1:使用命令行参数(如引用[1]) 在脚本中可以直接调用SecureCRT并传递telnet连接参数,格式为: `SecureCRT.exe /SCRIPT 脚本路径 /T /telnet 主机名 端口` 方法2:使用自动登录脚本(如引用[2]) 编写Python脚本,利用SecureCRT的API,自动输入用户名和密码。通常需要三个文件:主脚本、环境封装和存储凭据的文件。 方法3:使用bat文件调用(如引用[3]) 通过Python生成一个bat文件,然后运行这个bat文件来启动SecureCRT并执行脚本。 根据用户需求,我们选择方法2作为主要方法,因为它更符合“脚本登录”的意图,且可维护性高。 步骤: 1. 创建三个文件(放在同一目录): - `autoConnect.py`:主脚本,包含登录逻辑。 - `connectEnv.py`:封装SecureCRT的API,方便调用。 - `UserNameAndPassword.txt`:存储用户名和密码(第一行用户名,第二行密码)。 2. 编写`connectEnv.py`:封装一些常用的SecureCRT操作。 3. 编写`autoConnect.py`:读取用户名密码,建立telnet连接,并发送登录信息。 注意:SecureCRTPython脚本是在SecureCRT自己的Python环境中运行的,所以不能直接使用标准Python的subprocess等模块,而是使用SecureCRT提供的对象(如`crt`对象)。 因此,我们调整思路,直接使用SecureCRT脚本API。 具体代码: **connectEnv.py**(可选,但为了结构清晰,我们创建一个环境封装类): ```python # connectEnv.py class ConnectEnv: @staticmethod def send_command(command, wait_string="?"): crt.Screen.Send(command + "\r") crt.Screen.WaitForString(wait_string) ``` **autoConnect.py**: ```python # autoConnect.py import os import sys # 将当前目录添加到模块搜索路径,以便导入connectEnv sys.path.append(os.path.dirname(__file__)) from connectEnv import ConnectEnv def main(): # 读取用户名和密码文件 with open("UserNameAndPassword.txt", "r") as f: lines = f.readlines() username = lines[0].strip() password = lines[1].strip() # 获取当前会话对象 tab = crt.GetScriptTab() # 建立telnet连接(假设主机和端口已经在会话中配置好,或者通过命令行传入) # 如果会话未连接,则连接 if not tab.Session.Connected: tab.Session.Connect() # 等待登录提示,根据实际情况调整等待字符串 # 例如,提示为"Username:" 和 "Password:" crt.Screen.WaitForString("Username:") crt.Screen.Send(username + "\r") crt.Screen.WaitForString("Password:") crt.Screen.Send(password + "\r") # 登录后,可以发送一些命令,例如等待出现命令提示符(如#或>) # 这里等待出现'#',超时时间5秒 crt.Screen.WaitForString("#", 5) # 使用ConnectEnv类发送命令示例 # env = ConnectEnv() # env.send_command("ls", "#") # 假设等待#出现 if __name__ == "__main__": main() ``` **UserNameAndPassword.txt**: ``` admin password123 ``` 使用方法: 1. 在SecureCRT中,打开一个已经配置好telnet会话的窗口(或者通过命令行传入主机和端口,但上述代码中我们假设会话已经配置好,所以需要先创建一个会话配置,其中协议为telnet,主机和端口设置正确)。 2. 在SecureCRT的菜单栏选择“脚本”->“运行”,然后选择`autoConnect.py`。 注意:如果主机和端口没有预先配置,我们可以通过命令行参数传递。但根据引用[1],我们可以通过命令行启动SecureCRT并指定telnet主机和端口。因此,我们可以修改脚本以接受命令行参数。 修改`autoConnect.py`以支持命令行参数: ```python # autoConnect.py (支持命令行参数) import os import sys import argparse sys.path.append(os.path.dirname(__file__)) from connectEnv import ConnectEnv def main(): # 解析命令行参数 parser = argparse.ArgumentParser() parser.add_argument('host', nargs='?', default=None) parser.add_argument('port', nargs='?', default=23, type=int) args = parser.parse_args(crt.Arguments) # 读取用户名和密码文件 with open("UserNameAndPassword.txt", "r") as f: lines = f.readlines() username = lines[0].strip() password = lines[1].strip() tab = crt.GetScriptTab() # 如果命令行提供了主机参数,则使用该主机和端口 if args.host: # 修改当前会话的Hostname和Port,然后连接 tab.Session.Config.SetOption("Hostname", args.host) tab.Session.Config.SetOption("Port", args.port) # 设置协议为telnet tab.Session.Config.SetOption("Protocol", "Telnet") if not tab.Session.Connected: tab.Session.Connect() # 等待登录提示 crt.Screen.WaitForString("login:") crt.Screen.Send(username + "\r") crt.Screen.WaitForString("Password:") crt.Screen.Send(password + "\r") crt.Screen.WaitForString("#", 5) if __name__ == "__main__": main() ``` 这样,我们就可以通过命令行调用: ``` SecureCRT.exe /SCRIPT path\to\autoConnect.py /T /telnet 192.168.1.1 23 ``` 或者,在已经打开的SecureCRT中运行脚本(此时如果命令行参数未提供,则使用当前会话的配置)。 注意:在SecureCRT脚本环境中,`crt.Arguments`可以获取到运行脚本时传递的参数(不包括脚本名)。 总结:我们提供了两种方式,一种是预先配置会话,另一种是命令行传递主机和端口。用户可以根据需要选择。 §§相关问题§§ 1. 如何配置SecureCRT的会话以便在脚本中使用? 2. 除了telnet,SecureCRT脚本是否支持SSH协议登录? 3. 如何确保在脚本中安全地存储用户名和密码?</think>### SecureCRT Python脚本实现Telnet登录 我将提供一个完整的SecureCRT Python脚本解决方案,通过Telnet协议自动登录网络设备。以下是实现步骤和代码: #### 核心脚本文件:`telnet_login.py` ```python # -*- coding: utf-8 -*- import os import sys def main(): # 获取当前脚本目录 script_path = os.path.dirname(crt.ScriptFullName) # 读取设备信息(IP、端口) device_ip = crt.Dialog.Prompt("请输入设备IP:", "Telnet登录", "", False) port = crt.Dialog.Prompt("请输入端口号(默认23):", "Telnet登录", "23", False) # 读取认证信息 with open(os.path.join(script_path, "auth.txt"), "r") as f: credentials = f.readlines() username = credentials[0].strip() password = credentials[1].strip() try: # 建立Telnet连接 crt.Session.Connect("/TELNET " + device_ip + " " + port) # 等待登录提示并输入凭据 crt.Screen.WaitForString("Username:") crt.Screen.Send(username + "\r") crt.Screen.WaitForString("Password:") crt.Screen.Send(password + "\r") # 等待登录成功提示 crt.Screen.WaitForString("#", 5) crt.Dialog.MessageBox("登录成功!当前设备IP: " + device_ip) except Exception as e: crt.Dialog.MessageBox("登录失败: " + str(e)) if __name__ == "__main__": main() ``` #### 认证文件:`auth.txt` ``` admin # 第一行为用户名 Cisco123! # 第二行为密码 ``` ### 使用说明 1. **文件准备**: - 创建上述两个文件并放在同一目录 - 在`auth.txt`中配置设备登录凭据 2. **执行方式**: - 在SecureCRT中:`脚本 > 运行脚本 > 选择telnet_login.py` - 命令行启动(参考引用[1]): ``` SecureCRT.exe /SCRIPT "C:\path\to\telnet_login.py" ``` 3. **操作流程**: - 脚本运行后会弹出对话框要求输入设备IP和端口 - 自动读取`auth.txt`中的用户名和密码 - 建立Telnet连接并自动完成认证 - 登录成功后显示提示信息 ### 关键功能说明 1. **交互式输入**: ```python device_ip = crt.Dialog.Prompt("请输入设备IP:", "Telnet登录", "", False) ``` 使用SecureCRT的API弹出输入对话框[^2] 2. **凭据安全存储**: ```python with open("auth.txt", "r") as f: credentials = f.readlines() ``` 将敏感信息与脚本分离存储[^2] 3. **连接控制**: ```python crt.Session.Connect("/TELNET " + device_ip + " " + port) ``` 使用SecureCRT内置方法建立Telnet连接[^1] 4. **自动化登录流程**: ```python crt.Screen.WaitForString("Username:") crt.Screen.Send(username + "\r") ``` 实现等待提示符并自动输入凭据[^3] ### 安全建议 1. 将`auth.txt`文件设置为隐藏属性 2. 使用文件加密(如pycryptodome库) 3. 设置脚本目录访问权限 4. 定期更新密码 > 提示:对于企业级应用,建议集成LDAP或Radius认证替代本地密码文件[^1]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值