资讯详情

资讯详情

SecureCRT批量运维实战:会话配置、SSH密钥认证与脚本巡检

简介SecureCRT 与 SecureFX 绿色便携整合包面向需要频繁管理多台服务器、兼顾远程登录与安全文件传输的运维人员、开发者和网络学习者可在保持 SSH 会话的情况下相互调用减少终端与 SFTP 工具之间的切换成本。压缩包约 11.8MB资源页文件总数标记为 0、主要类型明细暂无结合描述可判断为便携版可执行程序及相关运行文件组合适合随身携带或临时排障使用。资源已有 6001 人学习下载在 SSH 客户端与 SFTP 传输场景中具备一定关注度。使用者可借此体验多标签 SSH 会话、SCP/SSL 等安全协议连接以及较完整的 SFTP 文件管理能力并了解终端管理与文件传输协同的工作方式。1. 为什么还有人守着 SecureCRT一个 200 台设备运维场景的选型复盘机房搬迁那周我手上压着 217 台网络设备和 Linux 主机的清单要在 48 小时内逐台确认版本、时钟、磁盘和配置备份状态。当时试了三个终端工具最后留在一台老工作站上的还是 SecureCRT——不是因为情怀是因为它的会话树、脚本引擎和日志落盘这三件事凑在一起能让我把重复动作压成一条命令跑完。SecureCRT 是一款商业 SSH/串口终端仿真软件支持 SSH2、Telnet、Serial、RDP 等协议核心价值在于会话组织、密钥认证管理和可编程的自动化脚本。它适合谁每天要连十几台以上设备、需要稳定日志和批量巡检的运维、网络工程师如果你一周只连两次服务器那真是杀鸡用牛刀。至于网上那些来路不明的安装包我拆过几个捆绑和改过的二进制不值得拿生产环境去赌后面会讲清楚为什么。2. 会话目录与批量下发把 200 条连接配置变成一份模板手工在 GUI 里点 200 次新建会话这件事我做过多半次就放弃了。真正省时间的路径是把 SecureCRT 的会话配置文件当成代码来管——它本来就是纯文本。2.1 先搞清楚配置到底存在哪SecureCRT 的配置分两层全局配置和单会话配置两者都在用户的配置目录下而不是安装目录。这一点很关键很多人重装软件后找不到自己的会话是因为只备份了Program Files。平台配置根目录示例Windows%APPDATA%\厂商目录\ConfigmacOS~/Library/Application Support/厂商目录/ConfigLinux~/.config/厂商目录/ConfigConfig下有三个东西要记住Sessions/—— 每个会话一个.ini文件子目录结构 会话管理器里的文件夹树Global.ini—— 全局默认值新建会话时继承这里Scripts/可选—— 脚本存放位置可以在全局选项里改我一般的做法是把这个Config目录整体丢进 Git 仓库。会话文件是文本diff 出来一目了然谁改了哪个设备的端口、谁把某个会话的编码从 UTF-8 改成 GBK都能追溯到。配置目录支持自定义路径团队里如果有多套环境生产/测试/客户现场我建议用不同的配置目录切换而不是靠命名前缀区分——前缀迟早会乱。提示会话.ini里如果保存了密码那个字段和当前机器绑定加密拷到另一台电脑上大概率解不开。所以配置目录版本化时要么用密钥认证不存密码要么在.gitignore里把敏感会话排除掉。2.2 会话 ini 的字段结构一次拆干净不要把.ini当成标准 INI 来解析。它用的是厂商自己的键值格式每行形如S:KeyValue、D:KeyValue、B:KeyValue前缀字母表示值类型字符串、双字/整数、布尔没有[section]头。用configparser去读会直接报错。字段名在不同大版本之间会有出入最稳的办法是先在 GUI 里手动建一个样板会话把该配的都配好然后打开这份文件照着抄。常见的几个字段字段含义备注S:Protocol Name协议类型SSH2、Telnet、SerialS:Hostname主机地址IP 或域名S:Username登录用户名空则连接时询问D:[SSH2] PortSSH 端口十六进制22 →00000016S:Authentication认证方式及顺序PublicKey,Password,Keyboard InteractiveB:...各类布尔开关如是否记录日志、是否压缩端口这个十六进制是最容易翻车的地方。我见过有人直接把22写进去结果会话连的是 34 端口排查了半天以为是防火墙策略。转换很简单format(port, 08X)22 得到000000162222 得到000008AE。认证顺序那一行也有讲究——SecureCRT 是按列表从左到右尝试的。如果你把Password放在PublicKey前面每次连接都会先拿密码去撞一次某些做了失败次数限制的设备会直接把你锁在外面。2.3 用 Python 批量生成会话文件有了字段结构剩下的就是把一份 CSV 设备清单喂给模板。下面这段脚本我用了很多次改改路径就能跑。import csv import os from pathlib import Path # 会话配置根目录Windows 示例其他平台换成 2.1 里对应的路径 SESSIONS_ROOT Path(os.environ[APPDATA]) / 厂商目录 / Config / Sessions # 会话文件模板键值前缀必须保留末尾留一个空行 TEMPLATE S:Protocol NameSSH2 S:Hostname{host} S:Username{user} D:[SSH2] Port{port_hex} S:AuthenticationPublicKey,Password,Keyboard Interactive B:Compression00000000 B:[SSH2] Send Protocol Keepalive00000001 D:[SSH2] Protocol Keepalive Interval0000003C def port_to_hex(port: int) - str: 端口转 SecureCRT 使用的 8 位十六进制表示22 - 00000016 if not 1 port 65535: raise ValueError(f端口越界: {port}) return format(port, 08X) def parse_auth(raw: str) - str: 把 key,password 这种简写展开成 SecureCRT 认识的认证顺序 mapping { key: PublicKey, password: Password, kbd: Keyboard Interactive, } items [mapping.get(x.strip().lower(), x.strip()) for x in raw.split(,) if x.strip()] if not items: raise ValueError(认证方式不能为空) return ,.join(items) def build_session(row: dict, group: str) - Path: 按一行记录生成一个会话文件返回写入路径 name row[name].strip() target_dir SESSIONS_ROOT / group target_dir.mkdir(parentsTrue, exist_okTrue) target target_dir / f{name}.ini content TEMPLATE.format( hostrow[host].strip(), userrow[user].strip(), port_hexport_to_hex(int(row.get(port, 22))), ) # 统一使用 \r\nWindows 下 GUI 读取更稳 target.write_text(content, encodingutf-8, newline\r\n) return target def main(csv_path: str) - None: created, skipped 0, 0 with open(csv_path, newline, encodingutf-8-sig) as f: for row in csv.DictReader(f): group row.get(group, default).strip() or default try: path build_session(row, group) created 1 print(f[OK] {path}) except Exception as e: # 单条失败不影响整批 skipped 1 print(f[SKIP] {row.get(name)}: {e}) print(fdone. created{created} skipped{skipped}) if __name__ __main__: main(devices.csv)配套的devices.csv长这样name,group,host,user,port,auth core-sw-01,网络设备/核心,10.10.1.1,netops,22,key edge-fw-01,安全设备,10.10.2.1,secops,2222,key,password app-node-07,服务器/生产,10.10.3.7,deploy,22,key逻辑说明build_session只负责一次渲染失败了抛异常main里逐条捕获这样 217 条里挂掉两条不会让整批白跑。encodingutf-8-sig是给 Excel 导出的 CSV 留的余地不然首列会带 BOM 变成乱码。newline\r\n强制 CRLF避免某些版本读配置时行尾识别异常。参数说明SESSIONS_ROOT一定要写绝对路径用环境变量拼port_to_hex里的越界检查别删我吃过一次手滑写成22222的亏认证顺序按你的安全策略排做密钥认证的环境永远把PublicKey放第一位这样密码登录失败次数不会被白白消耗。跑完脚本重启 SecureCRT会话树里就自动出现分组和条目了。如果没出现先确认进程已经完全退出——它启动时读一次配置运行期间改了不刷新。2.4 导入导出与团队复用SecureCRT 自带的导入导出走的是菜单里的配置迁移入口本质还是打包整个Config目录。团队里我更喜欢直接发 Git 仓库新同事克隆下来在全局选项里把配置目录指过去重启即生效比发一个压缩包再让他手动找路径可靠得多。有两个细节要交代清楚。第一跨平台迁移时路径分隔符不同会话文件里如果写了带绝对路径的日志目录换平台会失效所以日志路径尽量用相对路径或者干脆在全局配置里统一设。第二配置目录里还有一个记录已打开会话的清单文件迁移时最好把它删掉否则新机器打开会尝试恢复一堆不存在的标签页卡在那儿转圈。3. 密钥认证全流程从生成到禁用密码登录密码认证在两百台设备的规模上就是个灾难密码要轮换、要分发、要记在某个地方而且每一次自动化尝试都会在日志里留一条失败记录。密钥是唯一能让人和脚本用同一套凭据的方案。3.1 为什么必须走密钥密码登录的边界在哪先说清楚边界。密钥不是万能的老设备可能只支持 RSA 且只认 SHA-1 签名新版本客户端默认不发送这类算法某些设备的 SSH 实现有 bug公钥认证会莫名失败还有一类设备根本不支持从 authorized_keys 读公钥只能在 Web 界面里粘。所以禁用密码登录这个动作一定是所有设备都验证过密钥可用之后才做的顺序反了就把自己关在门外。至于密钥类型我的选择顺序是设备支持就用 Ed25519短、快、安全性好不支持退到 ECDSA P-256再不行才用 RSA 4096。很多网络设备固件较老只认 RSA这个没办法兼容优先。3.2 在客户端生成密钥并导出 OpenSSH 公钥SecureCRT 自带密钥生成工具路径在菜单的工具项下面按向导走选类型 → 选长度 → 设口令 → 设注释 → 生成。生成出来的密钥对默认放在配置目录的密钥子目录里。我一般会同时用命令行再生成一份方便在脚本里引用# 生成 Ed25519 密钥对-C 是注释方便在服务端识别来源 ssh-keygen -t ed25519 -a 100 -C opsworkstation -f ~/.ssh/id_ed25519_ops # 查看 OpenSSH 格式公钥SSH2 格式RFC4716在这里派不上用场 cat ~/.ssh/id_ed25519_ops.pub-a 100是 KDF 轮数设高一点能提高口令暴力破解成本代价是每次使用多等几百毫秒我一般设 64100。生成的私钥权限必须是 600ssh-keygen会自动做但如果你从别处拷贝过来记得手动chmod 600。SecureCRT 里还有个细节它支持全局密钥和会话密钥两套。全局密钥放在全局选项里所有没单独指定密钥的会话都用它会话级密钥覆盖全局。团队共用一台机器时我偏向用会话级避免一个人换密钥影响所有人。3.3 服务端 authorized_keys 的权限与坑公钥怎么落地取决于目标是什么系统。Linux 主机# 建目录、设权限两步都不能省 mkdir -p ~/.ssh chmod 700 ~/.ssh # 追加公钥用 here-doc 避免手抖漏字符 cat ~/.ssh/authorized_keys EOF ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... opsworkstation EOF chmod 600 ~/.ssh/authorized_keys # 检查 home 目录权限组或其他可写会导致公钥认证被拒 ls -ld ~最后一行的ls -ld ~是血泪经验。sshd对权限的检查是层层递进的~不能对 group/other 可写.ssh必须是 700authorized_keys必须是 600任何一层不满足日志里只有一句干巴巴的Authentication refused: bad ownership or modes不告诉你具体是哪一层。SELinux 开着的话还有一道把文件拷过去而不是在目标机上创建上下文可能不对restorecon -Rv ~/.ssh能修。网络设备这边就简单粗暴一些进配置把公钥粘到对应用户的认证配置下指定认证方式为公钥。不同厂商命令差异很大但套路一致——先建用户再挂公钥最后改认证方式。改之前一定要留一个密码登录的账号做后备。3.4 会话里绑定密钥并验证GUI 路径打开会话属性 → 连接 → SSH2 → 认证 → 在列表里添加PublicKey→ 选中后点属性 → 指定私钥文件 →用右侧的上下箭头把它拖到第一位。绑定完别急着欢呼先用命令行验一遍这是我最常用的对照手段# -vvv 打出完整握手过程重点看 Offering public key 和 Server accepts key ssh -vvv -i ~/.ssh/id_ed25519_ops \ -o PreferredAuthenticationspublickey \ -o IdentitiesOnlyyes \ ops10.10.3.7-o PreferredAuthenticationspublickey强制只走公钥排除了其实是密码登录成功的假象。-o IdentitiesOnlyyes保证只用指定的这把私钥而不是把 agent 里所有密钥挨个试一遍——后者在老设备上特别容易触发Too many authentication failures因为默认最多试 6 把。对着-vvv的输出可以判断问题出在哪一层输出片段含义下一步Offering public key后无Server accepts key服务端不认这把公钥检查authorized_keys内容与权限no mutual signature algorithm算法不匹配常见于 RSA SHA-1客户端放行旧算法或换密钥类型Too many authentication failures试了太多把密钥加IdentitiesOnlyyesPermission denied (publickey)但日志无拒绝记录用户名或路径不对核对用户名与 home 目录命令行通了GUI 里基本就通了。如果 GUI 不通而命令行通八成是会话里的私钥路径指错了或者认证列表顺序没调。4. 脚本自动化用 Python 和 VBScript 把巡检跑成一条命令会话管理解决的是连得上脚本解决的是连上之后自动干什么。SecureCRT 的脚本能力是它和普通终端拉开差距的地方也是很多人买了却从来没用过的功能。4.1 SecureCRT 的脚本对象模型脚本运行在终端进程内通过一个全局对象拿到控制权。开头两行是元数据声明不能删也不能改格式# $language Python # $interface 1.0这两行告诉终端用哪个引擎解释这个文件。Python 脚本依赖系统里装了对应版本的 Python装了多个版本时要注意 PATH 指向哪一个VBScript 走的是 Windows 内置引擎不需要额外安装所以在只能用 Windows 客户端的环境里 VBScript 反而更省事。核心对象就那么几个对象/方法作用注意crt.Screen.Synchronous同步模式开关必须设 True否则 Send 后立刻返回读到的全是空crt.Screen.Send(str)发送字符串行尾用\r不是\ncrt.Screen.WaitForString(s, t)等指定字符串出现返回布尔值超时返回 False 但不抛异常crt.Screen.ReadString(s, t)读到指定字符串为止返回中间的内容crt.Session.Log(True)开日志配合LogFileName指定路径crt.Session.ConnectInTab(cmd)在新标签页建连接批量场景的关键crt.Dialog.MessageBox(s)弹框调试期最好用的一招crt.Arguments.GetArg(n)取命令行参数同一个脚本跑不同设备靠它Synchronous这个开关是新手最容易漏的。不开同步Send是异步的下一行ReadString可能在设备还没回显时就开始读结果拿到空字符串脚本看起来跑了但什么都没抓到。4.2 一段能跑的巡检脚本下面这段是我现在还在用的精简版作用是连上设备后依次执行几条命令把回显落到本地日志并做最基本的异常判断。# $language Python # $interface 1.0 import os import time LOG_DIR rD:\ops\logs def safe_name(raw: str) - str: 把主机名/地址洗成安全的文件名避免出现非法字符 return .join(c if c.isalnum() or c in -_. else _ for c in raw) def run_cmd(cmd: str, prompt: str, timeout: int 20) - str: 发一条命令并等待提示符返回中间的回显超时返回空串 crt.Screen.Send(cmd \r) if not crt.Screen.WaitForString(prompt, timeout): return return crt.Screen.ReadString(prompt, timeout) def main() - None: # 同步模式 忽略 ESC避免设备回显控制字符打乱匹配 crt.Screen.Synchronous True crt.Screen.IgnoreEscape True host crt.Arguments.GetArg(1) or unknown os.makedirs(LOG_DIR, exist_okTrue) log_path os.path.join(LOG_DIR, safe_name(host) .log) crt.Session.LogFileName log_path crt.Session.Log(True) results [] for cmd, prompt in [ (show version, #), (show clock, #), (show interfaces status, #), ]: out run_cmd(cmd, prompt) if not out: results.append(f{cmd} - TIMEOUT) else: results.append(f{cmd} - {len(out.splitlines())} lines) crt.Session.Log(False) crt.Dialog.MessageBox(\n.join(results)) main()逻辑说明run_cmd把发命令—等提示符—读回显三步封成一个原子操作任何一步失败返回空串调用方据此判断超时。主流程先开日志再执行保证即使脚本中途崩了前面的回显也落盘了。最后用弹框把每条命令的行数汇总出来比翻日志快。参数说明timeout20是经验值跑show interfaces这种长输出命令时慢设备可能要 40 秒以上按实际调prompt必须和设备的特权提示符一致有的是#有的是有的是[hostname]写错就永远等不到。crt.Arguments.GetArg(1)的下标从 1 开始0 是脚本文件名本身。调用方式在会话窗口里执行脚本时传参或者用命令行启动终端时带上参数。批量场景下我一般写一个外层清单逐台ConnectInTab再逐个执行。4.3 批量并发与日志落盘SecureCRT 的脚本是单线程的一个脚本实例只能操作它所在的那个会话。真要做并发有两条路方案优点代价脚本内多标签循环不依赖外部环境日志统一串行200 台要跑很久外部 Python SSH 库并发真并发可控线程数需要另装依赖交互式排障不方便我常用的组合是交互式排障用 SecureCRT批量采集用外部脚本。两边共用同一套密钥和同一份设备清单环境一致结果可以互相印证。日志落盘这块有个参数值得单独说日志文件名支持时间占位符我一般设成%H_%Y%M%D.log这种带主机名和日期的形式。不带日期的后果是每次覆盖出了问题想翻三天前的记录没有。4.4 脚本调试与常见失败点脚本报错时最烦的是没有堆栈。我的做法是在可疑位置插crt.Dialog.MessageBox(str(变量))虽然土但立刻能看到值。另外注意脚本运行在终端进程里print的输出你看不见别指望控制台。几个高频失败点忘了Synchronous True读到的全是空行尾用了\n设备收到的是换行符而不是回车命令不执行WaitForString超时返回 False 但代码不检查后面继续跑日志里一片空白提示符匹配串写得太宽比如只写被回显里的其他字符提前命中读到的内容截断最后一个坑我踩过设备回显里有--More--分页提示脚本等的是#结果一直等到超时。解决办法是在run_cmd里加一层分页处理检测到--More--就发空格。5. 避坑与排查五条血泪记录这一章全是我在实际环境里翻过的车按现象 → 原因 → 解决记下来。5.1 中文回显变成问号或方块现象连上某台老设备show出来的中文全是问号英文正常。原因会话的字符编码设的是 UTF-8而设备输出的是 GBK。SecureCRT 默认按 UTF-8 解码遇到 GBK 字节就替换成占位符。解决会话属性 → 终端 → 外观 → 字符编码改成 GBK 或 GB2312。更好的做法是设备端统一改成 UTF-8但老设备改编码可能影响其他系统对接得权衡。改完记得重连会话编码是在连接时生效的。5.2 配置目录拷到新电脑会话全部认证失败现象换了台工作站把整个 Config 目录拷过去双击会话提示认证失败密码框里的星号还在但就是登不上。原因会话里保存的密码用当前机器的信息做了加密跨机器解不开。GUI 里显示星号是因为它只存了掩码实际解密失败后发出去的是空串。解决不要依赖会话里存密码。改成会话级密钥认证密码框留空。如果非要用密码迁移后逐台重新输入——两百台的话还是老老实实上密钥吧。这也是我坚持推密钥认证的现实理由之一跟安全理念关系不大纯粹是迁移成本。5.3 密钥配好了还是提示认证失败现象公钥已经追加到authorized_keysssh -i还是Permission denied。原因按概率排序①~/.ssh或authorized_keys权限过宽sshd直接拒绝② home 目录对 group 可写③ SELinux 上下文不对④ 客户端默认不发送ssh-rsa签名而设备只认这个。解决先看服务端日志/var/log/secure或journalctl -u sshd里面会写清楚是哪条规则拒绝的。权限问题按chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys修SELinux 用restorecon -Rv ~/.ssh算法问题在客户端显式放行旧算法或者在服务端把设备加进兼容列表。实在定位不了ssh -vvv的输出从下往上读第一处异常就是根因。5.4 挂机十分钟回来会话已经断开现象开会回来标签页显示已断开连接需要重新登录历史回显也没了。原因路径上的 NAT 设备或防火墙会话表老化空闲连接被静默回收。默认老化时间常见的是 530 分钟正好覆盖一次会议。解决两头都设。服务端在sshd_config里加ClientAliveInterval 60和ClientAliveCountMax 3让服务端主动发探测客户端在会话属性的连接页开启协议层 keepalive间隔设 60 秒。另外终端层面的 TCP keepalive 也打开双保险。别把间隔设得太短1 秒一次会被某些设备的防护策略当成异常流量。5.5 某天终端起不来C 盘红了现象早上打开终端卡在启动画面任务管理器里 CPU 占用正常磁盘占用 100%。原因全局默认会话里开了自动保存日志路径是用户目录下的默认位置跑了半年日志文件堆了几十 GB系统盘写满。解决全局选项 → 默认会话 → 日志文件把路径改到非系统盘文件名带上日期占位符同时开追加到文件而不是覆盖。再配一个计划任务每周清理 30 天前的日志。这件事我现在的做法是装完就配不等出事——后悔药没处买。6. 授权、迁移与验证把工具链固定下来的一套方法关于授权把话说在前面这是一款商业软件官方提供限期试用长期使用需要购买许可团队规模大时按并发用户数授权。至于网上流传的所谓绿色版、注册机我不建议碰——这类二进制被改过签名你没法确认里面多了什么而终端软件恰恰握着所有设备的凭据。真要控制成本先算清楚替代方案能不能覆盖你的场景。替代品的对照我按实际用过的排工具授权会话树脚本能力适合场景SecureCRT商业强Python/VBScript/Perl大规模设备、需要自动化WindTerm开源中有限日常连接轻量Tabby开源中插件式跨平台、界面现代Windows Terminal OpenSSH免费弱靠 shell 脚本纯 Linux 主机、命令行流PuTTY开源弱无临时连接、串口迁移验证不能靠点开看看能连上我列了一份清单逐项打勾import paramiko HOSTS [(10.10.3.7, deploy), (10.10.1.1, netops)] def verify(host, user, key_path~/.ssh/id_ed25519_ops): 只用公钥认证连一次执行一条无害命令验证凭据链路 client paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: client.connect( hostnamehost, usernameuser, key_filenamekey_path, look_for_keysFalse, # 不扫描本地其他密钥避免触发失败锁定 allow_agentFalse, timeout8, auth_timeout8, banner_timeout8, ) _, stdout, _ client.exec_command(echo ok, timeout5) return stdout.read().decode().strip() ok except Exception as e: print(fFAIL {host}: {type(e).__name__}: {e}) return False finally: client.close() for h, u in HOSTS: print(h, PASS if verify(h, u) else FAIL)验证清单我固定看六项密钥登录可用、密码登录已按策略关闭、会话日志能正常落盘、字符编码正确、keepalive 生效不断连、脚本能跑通一条无害命令。前两项决定能不能进门后四项决定进门之后顺不顺手。look_for_keysFalse和allow_agentFalse这两个参数别省它们保证只用你指定的那把密钥不会因为本地还有其他密钥而触发服务端的失败次数限制——这个坑我在一批老设备上连着栽过三次每次都是明明密钥是对的但就是被拒。从那以后我每次做终端工具迁移或者密钥轮换都会先拿这份清单在 3 台代表性设备上跑一遍全绿了才敢推到全部。工具链这种事出问题时往往不是在你能看见的地方。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

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

立即咨询 →