资讯详情

资讯详情

SecureCRT 会话管理、批量脚本与跳板机排障指南

简介面向需要同时管理多台服务器与安全文件传输的运维、开发和网络学习者这份整合包将 SecureCRT 与 SecureFX 组合为绿色便携版本可在保持 SSH 会话的情况下相互调用分别处理多标签终端连接与 SFTP、SCP 等文件传输适合日常远程维护、实验环境搭建和跨协议文件交换等场景。压缩包约 11.8MB上游文件总数标记为 0、类型明细暂未提供因此包内构成需以下载后实际内容为准从资源定位看主要涉及 SecureCRT、SecureFX 及便携化、授权配置相关组件。页面显示已有 6001 人浏览学习说明该工具组合在 SSH 客户端与 SFTP 传输需求中具有一定关注度。读者可借此获得一套集终端会话管理、安全文件传输和双工具联动于一体的便携方案减少分别安装配置的时间并便于在服务器维护、课程实验与多协议传输任务中快速切换使用。1. 机房割接那一晚我为什么把 PuTTY 换成了 SecureCRT凌晨两点十几台接入交换机要批量改 VLANPuTTY 开了二十多个窗口任务栏挤成一排改到第五台时我已经分不清哪个窗口对应哪台设备。SecureCRT 解决的就是这种场面会话树按项目分组、多标签并行、命令能脚本化下发、全过程可落盘成日志。它不是给偶尔连一次服务器的人准备的而是给需要长期管理几十上百台网络设备、又要留下操作痕迹的运维和网络工程师用的。这篇笔记按「装完怎么配、配完怎么批、批完怎么查」的顺序拆顺带说清网上那些来路不明的免授权安装包为什么不能碰。2. 会话模型与本地配置把一台设备的连接参数固化下来SecureCRT 的所有连接都围绕一个叫「会话」的东西展开。会话不是内存里的临时对象而是一组落在磁盘上的配置文件里面记录了主机、端口、用户名、认证方式、字符集、日志路径。理解这层模型后面复制会话、迁移配置、批量排错才有抓手。很多人用了几年只会点「快速连接」每次手敲 IP问题就出在没把会话当成资产来管。2.1 会话文件里到底存了什么在「选项 → 全局选项 → 常规」里能看到当前配置文件夹进去后Config\Sessions下按会话名分目录每个目录一个Session.ini。这个文件是纯文本可以直接看、直接改、直接版本化。几个关键字段如下不同版本键名略有差异以实际导出为准字段含义典型取值Hostname目标设备地址10.0.0.1[SSH2] PortSSH 端口十六进制存储00000016即 22Username登录用户名netopsAuthentication认证方式PublicKey / PasswordIdentity Filename私钥文件路径C:\ops\keys\id_rsaCharset字符编码UTF-8Log Session是否开启会话日志1端口写成00000016这种形式第一次看到会愣一下它其实是十六进制的 22。改端口时别直接写22要换算成十六进制否则会话会连到错误的端口上现象是「一直转圈然后超时」很容易误判成网络不通。2.2 建一个可复用的会话模板手工建会话的顺序建议固定下来形成肌肉记忆新建会话 → 协议选 SSH2 → 填主机和端口 → 填用户名 → 认证选公钥 → 外观里把字符集设成 UTF-8 → 日志页开启「日志会话」并指定文件名模板 → 保存。这套顺序里字符集和日志是最容易被跳过的两项也是后面排错时最影响效率的两项。模板做好之后复制整个会话目录只改Hostname和会话名就能派生出一批同型号设备的会话。下面是一段模板片段保存前按实际环境替换# Session.ini 模板片段仅保留排障时最常看的字段 S:Hostname10.0.0.1 D:[SSH2] Port00000016 S:Usernamenetops S:AuthenticationPublicKey S:Identity FilenameC:\ops\keys\id_rsa S:CharsetUTF-8 B:Log Session00000001 S:Log FilenameC:\ops\logs\%H_%Y%M%D.log%H会被替换成主机名%Y%M%D是日期这样几十台设备的日志不会互相覆盖。日志目录建议单独放一块盘巡检脚本跑一次可能产生几百 MB 文本塞在系统盘里迟早出事。参数改完记得在客户端里重新打开会话验证直接改文件不重载是不生效的。2.3 密钥登录与指纹校验密码登录在几十台设备上轮换一次就是灾难能上公钥就上公钥。本地先生成密钥对再把公钥推到设备上# 生成 4096 位 RSA 密钥对私钥权限收紧到 600 ssh-keygen -t rsa -b 4096 -C netopslab -f ~/.ssh/id_rsa_netops -N chmod 600 ~/.ssh/id_rsa_netops # 把公钥推送到目标设备以 OpenSSH 服务端为例 ssh-copy-id -i ~/.ssh/id_rsa_netops.pub netops10.0.0.1 # 首次连接前抓取服务端指纹人工比对后再写入 known_hosts ssh-keyscan -t rsa 10.0.0.1 ~/.ssh/known_hosts ssh-keygen -lf ~/.ssh/known_hosts-b 4096是密钥长度-N 表示私钥不加口令生产环境建议加口令并配合密钥管理工具。ssh-copy-id会把公钥追加到目标用户的authorized_keys前提是密码登录还开着。最后一条ssh-keygen -lf打印指纹和设备侧显示的指纹对一遍对不上就别连这是防中间人最便宜的一道闸。SecureCRT 导入私钥走「工具 → 创建公钥 / 导入」选 OpenSSH 格式的私钥文件即可如果手里是 PuTTY 的.ppk需要先转换。首次连接弹出的主机密钥确认框别习惯性点「接受并保存」先核对指纹这是血泪经验里最容易被忽略的一步。3. 批量下发用脚本把重复登录和重复敲命令干掉设备上了二十台以后手工登录逐台执行同一条巡检命令就不现实了。SecureCRT 自带脚本引擎能操作当前会话的屏幕、发送字符串、等待回显、读写本地文件够用来做批量命令下发和结果落盘。关键是先接受它的能力边界别指望它变成并发调度平台。3.1 脚本引擎能做什么、不能做什么能做的是读设备清单、逐个开会话标签、发送命令、等提示符、把屏幕内容写进本地日志、跑完断开。不能做的是真正的多线程并发脚本是串行执行的、绕过设备本身的权限控制、替代成熟的配置管理平台做大规模编排。把它定位成「几十台规模的手工替代品」比较合适上百台就该考虑专门的自动化平台了。脚本的运行入口在菜单「脚本 → 运行」选中.py文件即可。脚本里通过全局对象crt访问会话和屏幕常用的几个方法crt.Session.ConnectInTab()开新标签、crt.Screen.Send()发数据、crt.Screen.WaitForString()等回显、crt.Screen.Get()取屏幕区域。3.2 一个可抄的批量巡检脚本下面这段按设备清单逐台连接执行命令清单里的每条命令并把屏幕输出落到以主机名命名的日志里# SecureCRT Python 脚本按清单批量执行巡检命令并落盘 # 运行方式菜单「脚本 - 运行」选中本文件 import os import crt DEVICE_FILE rC:\ops\devices.txt # 每行 host,user CMD_FILE rC:\ops\commands.txt # 每行一条命令 LOG_DIR rC:\ops\logs PROMPT # # 特权提示符按设备实际改 def load_lines(path): with open(path, r, encodingutf-8) as f: return [ln.strip() for ln in f if ln.strip() and not ln.startswith(#)] def main(): os.makedirs(LOG_DIR, exist_okTrue) devices load_lines(DEVICE_FILE) cmds load_lines(CMD_FILE) for item in devices: host, user [x.strip() for x in item.split(,)] # 第三个参数 True 表示静默打开不弹额外窗口 tab crt.Session.ConnectInTab(f/SSH2 /L {user} /PUBKEY {host}, False, True) tab.Screen.Synchronous True if not tab.Screen.WaitForString(PROMPT, 20): crt.Dialog.MessageBox(f{host} 登录超时跳过) tab.Session.Disconnect() continue log_path os.path.join(LOG_DIR, f{host}.log) with open(log_path, w, encodingutf-8) as log: log.write(f {host} \n) for cmd in cmds: tab.Screen.Send(cmd \r) # 每条命令单独等提示符超时 30 秒 if not tab.Screen.WaitForString(PROMPT, 30): log.write(f[超时] {cmd}\n) continue # 取当前屏可见区域长输出需先关闭分页 text tab.Screen.Get(1, 1, tab.Screen.CurrentRow - 1, tab.Screen.CurrentColumn - 1) log.write(text \n) tab.Session.Disconnect() main()逻辑上分三段先读两份清单再逐台开标签并等登录提示符最后逐条发命令、等回显、写日志。ConnectInTab的第一个参数是连接串/SSH2指定协议、/L指定用户、/PUBKEY指定用公钥认证第二个参数False表示不在当前标签内打开第三个True表示静默。Synchronous True让发送变成同步避免命令粘在一起。参数上最容易翻车的是PROMPT。华为设备普通视图是、特权是#思科补全模式下提示符还会带主机名。提示符写错WaitForString会一直等到超时日志里只有半截输出。稳妥做法是先手工连一台确认提示符脚本里再加一条terminal length 0关掉分页否则--More--会把屏幕截断Get取到的内容不完整。3.3 日志落盘之后怎么核对脚本跑完不等于活干完了得回头核对。最省事的办法是用 grep 把异常设备筛出来# 列出日志里出现错误关键字的文件 grep -ril -E error|failed|denied|invalid /c/ops/logs/*.log # 按行数排序行数明显偏少的说明命令没跑完 wc -l /c/ops/logs/*.log | sort -n-r递归、-i忽略大小写、-l只输出文件名、-E用扩展正则。Windows 下用 Git Bash 或 WSL 跑这段都行。行数对比很实用正常设备执行五条命令大概几十行某台只有三行八成是登录后就断了或者提示符没匹配上直接跳过。核对完再决定要不要重跑别一上来就全量重试会把设备日志刷爆。4. 跳板机串联与端口转发内网设备怎么连得上生产环境的设备大多不在同一层网络办公区能直连的只有跳板机。SecureCRT 处理这类拓扑有两套思路会话级的跳板机配置和端口转发。前者适合「人到设备」后者适合「本机工具访问内网服务」两者别混用。4.1 多级跳转的三种做法做法适用场景注意点会话内配置跳板机目标设备只能从跳板机访问跳板会话要先建好并被引用本地端口转发串联需要多级、且中间有非 SSH 协议每级会话都要保持在线先在跳板机上再起客户端临时排障、设备少跳板机要装客户端合规上要评估最常用的是第一种先建好跳板机会话并验证能登录再建目标会话在「会话选项 → 连接 → SSH2 → 跳板机」里选中跳板会话。连接目标时客户端会先连跳板、再从跳板发起第二跳。这里有个细节跳板机上的用户名和目标设备用户名可以不同配置时分清「跳板认证」和「目标认证」两组凭据别把密码填错位置。第二种做法适合需要访问内网 Web 管理页或数据库的场景本质是把远端端口映射到本地回环地址隧道随会话存活会话一断连接就断这点要提前和使用方说清楚。4.2 本地端口转发做临时调试典型场景内网一台数据库只允许跳板机访问本机的客户端工具又必须直连。在跳板会话里加一条本地转发把本地的 13306 映射到数据库的 3306# 隧道由 SecureCRT 会话维持本机客户端连本地端口即可 mysql -h 127.0.0.1 -P 13306 -u readonly -p配置位置在「会话选项 → 连接 → 端口转发 → 添加」类型选本地本地端口填 13306目标主机填127.0.0.1相对于跳板机而言目标端口填 3306。这里的127.0.0.1容易被误解成本机其实是跳板机视角的回环地址。转发建好后先telnet 127.0.0.1 13306探一下端口通不通再让业务客户端连能省掉一半扯皮。4.3 会话层的安全习惯三条习惯值得固定下来会话里不保存明文密码能公钥就公钥必须用密码的每次手输会话配置文件所在目录收紧权限别随手丢在共享盘日志默认脱敏涉及口令、密钥、告警联系人的行在脚本里过滤掉再落盘。这些不算技术难点但出问题时都是「黑匣子」级别的麻烦事后追日志发现关键字段被明文记了一整年那种后悔药没处买。5. 五类翻车现场从连不上到脚本跑飞下面这几条是实际排障里反复出现的按「现象 → 原因 → 解决」记遇到时对照着看比漫无目的试参数快。5.1 连接阶段的两个硬故障现象一客户端提示算法协商失败连接直接中断。原因多半是老设备只支持diffie-hellman-group1-sha1这类旧密钥交换算法新版客户端默认把它禁用了。解决是在「会话选项 → 连接 → SSH2 → 密钥交换」里把对应旧算法勾上同时评估这台设备是否该淘汰别为了连上去长期开着弱算法。现象二能 ping 通但 SSH 连不上一直超时。常见原因是中间防火墙只放行了特定源地址或者设备侧 ACL 没放行办公网段。先用telnet 10.0.0.1 22探端口端口通但握手失败就往认证和算法方向查端口不通就回去查网络策略别在客户端参数上绕圈。5.2 脚本阶段的两个翻车现象三脚本卡在WaitForString一直超时日志只有登录横幅。原因通常是提示符判断错了设备实际提示符是而不是#或者输出被分页截断提示符压根没出现。解决办法是先手工连一台确认提示符脚本开头补一条terminal length 0再跑。现象四命令粘包两条命令拼成一条发出去设备报语法错误。原因是Send发得太快回显还没回来就发了下一条。把Synchronous打开命令之间加 200 毫秒左右的间隔或者严格用WaitForString等回显再发。别迷信固定延时设备负载高时 200 毫秒也会不够。5.3 安装包来源的坑现象五装完客户端后浏览器主页被改hosts 文件多出几条陌生记录杀软报可疑进程。原因是安装包在传播过程中被二次打包捆绑了推广组件甚至后门。解决只有一条只从官方渠道获取安装包并核对数字签名预算有限就换开源替代比如 WindTerm、MobaXterm 免费版或者直接 Windows Terminal 加系统自带 ssh 客户端。为省一笔授权费把来路不明的包装进运维跳板机等于把整个内网的入口交出去这笔账怎么算都不划算。6. 会话配置的迁移与自检换机器不丢配置换电脑时最省事的迁移方式是把配置根目录下的Config\Sessions整个拷走但直接拷过去经常出现「会话都在、就是连不上」原因是Identity Filename还指向旧机器的路径。手工一个个改不现实写个脚本扫一遍更快# 迁移后自检扫描会话目录找出密钥路径失效或主机异常的会话 import os import re ROOT rD:\backup\Config\Sessions for dirpath, _, files in os.walk(ROOT): for name in files: if name.lower() ! session.ini: continue path os.path.join(dirpath, name) with open(path, r, encodingutf-8, errorsignore) as f: text f.read() host re.search(rHostname([^\r\n]), text) key re.search(rIdentity Filename([^\r\n]), text) if key and not os.path.exists(key.group(1)): print(f[密钥缺失] {path} - {key.group(1)}) if host and host.group(1).startswith(0.0.0.0): print(f[主机异常] {path})os.walk遍历所有子目录正则抓Hostname和Identity Filename两个字段os.path.exists判断私钥是否还在。输出里出现「密钥缺失」的会话批量替换成新路径即可出现「主机异常」的多半是模板派生时忘了改地址这类会话连上去会打到本机回环排查起来相当迷惑。迁移项的手工与脚本对比可以记一下会话目录结构手工可靠、脚本快但依赖路径假设密钥路径手工易漏、脚本能全覆盖日志目录手工容易忘、脚本顺手就能校验。我一般先整体拷贝跑一遍自检再随机抽三台手工连一次确认认证、字符集、日志都正常才算迁移完成。从那以后我每次迁移会话配置都强制先跑一遍路径自检再抽样连接宁可多花十分钟也不在割接当晚才发现私钥路径是旧的。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →