
简介SecureCRT 7.0.0 是面向 IT 运维、网络管理员及开发测试人员的 64 位终端仿真与文件传输工具包主要用于 shell 远程登录、服务器维护及多协议连接管理。压缩包共93个文件约15.86MB含26个dll运行库、14个vbs与6个py脚本、5个exe主程序以及key、mnu、fon、chm等配置、菜单、字体和帮助文档另有SecureFX组件可配合完成SSH、Telnet、RLogin、Serial、FTP/SFTP等连接与传输。该版本提供标签式界面、会话管理、脚本自动化、宏录制回放和多语言支持能保存常用会话配置并借助VBScript、JScript、Python扩展批量操作。对于频繁登录路由器、交换机、Linux/Unix主机的场景可通过会话切换和脚本减少重复操作mnu、fon等文件也便于菜单与字体适配降低重复配置成本并提升远程排障效率也可用于搭建安全终端环境。目前已有284人学习下载适合需要集中管理远程会话、调试网络设备的运维人员参考。1. 从一堆乱窗口说起secureCRT-7.0.0 到底治什么病凌晨两点排查一台业务机的 shell 环境变量屏幕上开着七个终端窗口最后一个窗口的报错往上翻三百行时才发现滚屏缓冲早被冲掉了只能重跑一遍命令把现场再造出来。secureCRT-7.0.0 就是冲着这类场面来的它是一款终端仿真客户端把 SSH2 会话、认证方式、日志留痕、脚本触发这四件事收进同一个界面本质仍然只是给你一个干净的 shell但把这个 shell 周围最容易丢的东西都钉死了。适合每天在内网多台机器之间跳、需要回看历史输出、需要把重复命令固化成脚本的运维和开发只是想临时连一次服务器的人用它反而显重——装完还要配会话、配编码、配日志路径前期投入不小。判断标准很简单一周之内你会连同一批机器超过三次那这套配置就值回票价。2. 会话与认证落地把密码登录换成 SSH2 公钥2.1 建会话之前先改全局默认项很多人装完直接新建会话填 IP 就开干跑两天发现中文全是方块、翻页翻不上去、粘贴个多行命令全乱套然后又回头一个个会话去改。正确顺序是先改全局默认再建会话新会话自动继承。常见做法是打开「全局选项 → 常规」把配置文件夹指到一个非系统盘的固定路径比如D:\crt-config。系统盘重装或者换了机器这个目录整个拷走就能还原工作环境这是后面第 6 章做团队分发的前提。接着在「全局选项 → 默认会话」里改这几项选项位置建议值为什么终端 → 仿真Xterm多数 Linux 发行版的 terminfo 认这个方向键和功能键不会错位终端 → 外观 → 字符编码UTF-8和服务端 locale 对不上时才会乱码先统一到 UTF-8 再谈排查终端 → 仿真 → 回滚缓冲20000 行默认几百行编译日志一刷就没了终端 → 反空闲每 60 秒发送一个字符网络设备和服务端都可能有空闲超时这一步能挡掉一半的「莫名断开」改完默认会话新建的每个会话都带这些值。这里有个容易忽略的点字符编码是会话级参数不是全局参数。你在默认会话里改了只影响之后新建的会话已经存在的会话要单独进去改一遍。我一般会在改完之后随便连一台机器跑一句locale验证# 确认服务端 locale 和终端编码是否一致 locale echo $LANG # 输出里出现 zh_CN.GBK / zh_CN.GB18030说明服务端不是 UTF-8 # 两条路要么把会话编码改成对应值要么把服务端改成 UTF-8别两边各改一半locale输出的LC_CTYPE决定字符集LANG是兜底值。如果LC_ALL有值它会覆盖前面两个排查时先看它。改服务端是根治办法改客户端是快办法但一个团队里客户端设置五花八门的时候统一服务端反而省事。2.2 公钥登录一次配对后面不再输密码密码登录在跳板机上被审计、被强制改期、被复杂度策略卡住是常态。换成 SSH2 公钥认证之后登录动作就只剩一次密钥交换。生成密钥对这件事在哪做都行我习惯在跳板机上做然后把私钥拉回本地# -t 密钥类型-b 位数-C 注释用来区分环境-f 指定文件名避免覆盖默认 id_rsa ssh-keygen -t rsa -b 4096 -C ops-bastion -f ~/.ssh/id_rsa_ops # 一路回车会生成两个文件 # id_rsa_ops 私钥留在客户端权限必须是 600 # id_rsa_ops.pub 公钥可以随便传 # 把公钥推到目标机的授权列表 ssh-copy-id -i ~/.ssh/id_rsa_ops.pub ops10.0.0.21-b 4096不是越大越好。老一点的网络设备、老版本的 SSH 服务端对 4096 位的 RSA 支持没问题但对某些新式密钥类型比如 ed25519反而认不出来。内网里混着一批老设备的时候老老实实用 RSA 2048 兼容性最好4096 只在你确认全链路都吃得下的时候再用。手工追加公钥的时候权限位是最高频的翻车点# 在目标机上执行三个权限位错一个公钥认证就会静默退回密码认证 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 700 ~ # 家目录本身也不能是 777 # 开了 SELinux 的机器还要修上下文否则 sshd 读不到文件 restorecon -R -v ~/.sshchmod 700 ~这条最容易被忽略。有人为了图方便把家目录设成 755sshd 在严格模式下会直接拒绝公钥认证日志里只留一句含糊的失败原因看起来像密钥不对其实是目录权限太宽。接下来是客户端侧。在会话选项 → 连接 → SSH2 → 认证里把认证方式调成 PublicKey 并指到私钥文件。这里有一个 7.0 特有的坑新版 OpenSSH 生成的私钥默认是BEGIN OPENSSH PRIVATE KEY格式7.0 这个年纪的客户端只认老式的 PEM 头BEGIN RSA PRIVATE KEY。直接选文件会提示格式不支持转一下就行# 只转换格式不动密钥内容会就地覆盖先备份 cp ~/.ssh/id_rsa_ops ~/.ssh/id_rsa_ops.bak ssh-keygen -p -m PEM -f ~/.ssh/id_rsa_ops # -m PEM 指定输出格式-p 表示改密码短语直接回车两次即为空转换完再在客户端里选一次文件就能用了。私钥带了密码短语的话7.0 支持在会话里缓存但缓存是内存级的客户端一关就没了别指望它跨会话生效。2.3 会话文件的目录结构与批量生成secureCRT-7.0.0 的会话不是数据库就是一个目录树加一堆文本文件Sessions 目录下面的文件夹结构和你界面上看到的文件夹一模一样每个会话对应一个.ini。这意味着会话是可以批量造的——把一份调好的会话复制成几十份只改主机名。#!/usr/bin/env bash # 用一份模板批量生成会话文件只替换主机名 set -euo pipefail TPL$HOME/crt-config/Sessions/生产/模板.ini OUT$HOME/crt-config/Sessions/生产 # hosts.txt 每行两列会话名 主机地址 while read -r name host; do sed -e s|^S:\Hostname\.*|S:\Hostname\$host| \ $TPL $OUT/$name.ini done hosts.txt这段脚本的核心是sed的替换表达式。^S:\Hostname\是锚定到行首的键名匹配只替换这一行其它配置编码、日志路径、端口转发规则原样继承模板。键名不要照抄我这里的写法先手工建一个会话改一下主机名保存用文本对比工具看这两个文件的差异差异行就是你要替换的那一行把它抄进脚本里。不同版本的 ini 键名会有出入以你本地实际导出为准。while read -r里的-r是防止反斜杠被解释hosts.txt用空格或制表符分隔都行。生成完重启客户端会话树里就多出一批点开即用。这套办法适合一个项目几十台机器、命名规则统一的场景比一个个手点快得多也不容易漏配某一项。3. 端口转发与多跳三台机器之间只留一条可控链路3.1 本地转发把只监听回环的服务拉到本机内网里最常见的场景某台数据库只监听127.0.0.1:3306你在办公网中间隔着一台跳板机。直接在跳板机上开客户端连数据库不行因为跳板机上没有图形化工具把数据库端口对外放开更不行。本地转发解决的正是这个。先在命令行里把逻辑跑通再搬到客户端里配这样出问题好定位# 在能连到数据库的那台跳板机上执行 # 本机 13306 - 跳板机视角的 10.0.2.15:3306 ssh -N -L 127.0.0.1:13306:10.0.2.15:3306 ops10.0.0.21 # -N 表示只做转发不在远端执行 shell # -L 是本地转发 # 显式写 127.0.0.1 而不是留空避免监听在所有网卡上 # 排错阶段别加 -f 后台运行日志看不到就抓瞎参数里最容易搞混的是第三个字段。10.0.2.15这个地址是从跳板机出发能解析、能路由到的地址不是你自己这台机器视角的地址。你本地机器根本不认识10.0.2.15它只认识127.0.0.1:13306。这个视角差异是新手第一个卡点配错了表现为「连接被拒绝」或者「连接超时」两种报错对应的是完全不同的原因。搬到客户端里位置在会话选项 → 连接 → Port Forwarding → 添加类型选 Local字段填什么含义Local Port13306你本机上要占用的端口冲突就换一个Remote Host10.0.2.15跳板机视角的目标地址域名也行Remote Port3306目标服务端口配好之后连着这个会话本地工具连127.0.0.1:13306就等于连到了数据库。注意转发规则是跟着会话走的会话断开转发就没了所以这个会话最好设成自动重连。本地转发还有一层用法是做端口对照。同一个目标服务你可以开多条规则映射到不同本地端口比如 13306 和 13307 分别指向主库和备库工具里切端口比切会话快。3.2 远程转发让内网机器主动回连反过来的一种情况你在办公网需要访问一台藏在很深处、只能出不能进的内网机器上的 Web 服务。这台机器能连到跳板机但跳板机连不回去。这时候方向要反过来由内网机器发起连接把远端端口映射回来。# 在内网机器上执行把本机 8080 映射到跳板机的 18080 ssh -N -R 127.0.0.1:18080:127.0.0.1:8080 ops10.0.0.21 # -R 是远程转发前一个 127.0.0.1 是跳板机上的绑定地址关键在跳板机上的绑定地址。默认情况下 sshd 的GatewayPorts是no远端转发只会绑定在跳板机的回环地址上也就是说只有登录到跳板机本机的人才能访问这个 18080。这个默认值是故意的改成yes会让转发端口绑定到所有网卡等于把一个内网服务摊开给整个网段。我见过不止一次有人为了图省事把GatewayPorts yes写进 sshd 配置然后忘了删。判断要不要开的标准如果只有你自己登录到跳板机本机去访问保持默认如果确实需要同网段的同事访问先确认这台服务的鉴权做得够不够再考虑开并且配合防火墙限源。远程转发还有个隐性限制连接断了规则就没了而内网机器往往不会主动重连。想让它长期挂着得在客户端里给这个会话配自动重连或者干脆用系统服务托管一条ssh -N -R命令。3.3 多跳串联与心跳保活三层网络的时候别在跳板机上再装一个客户端。用一条命令串起来# -J 接受一个逗号分隔的跳板列表从外到内依次连接 ssh -J ops10.0.0.21 ops10.0.3.8 # 等价于先连 10.0.0.21再从这台机器上发起第二跳 # 老版本 OpenSSH 没有 -J需要在 ~/.ssh/config 里用 ProxyCommand 写-J的好处是第一跳的认证在本地完成两跳之间不用手工输两次密码密钥也是本地这把。缺点是中间任何一跳断了整条链就断没有断点续连。心跳保活分两头配# 客户端侧写进 ~/.ssh/config 的 Host * 段 ServerAliveInterval 30 ServerAliveCountMax 3 # 含义每 30 秒发一个探测包连续 3 次没响应才判定断开 # 也就是最多容忍 90 秒的网络抖动 # 服务端侧对应的是 /etc/ssh/sshd_config 里的 # ClientAliveInterval 和 ClientAliveCountMax语义一样客户端侧的这两项在 secureCRT-7.0.0 里对应「会话选项 → 终端 → 反空闲」可以选发送协议规定的空字符也可以发一个固定字符串。发字符串的做法在 shell 里会留下回显看着烦我一般直接发空字符。反空闲解决的是 NAT 表和防火墙会话老化的问题解决不了服务端主动踢人。如果服务端配了ClientAliveCountMax 0或者登录 shell 里有TMOUT客户端发什么都没用得从服务端侧查。这个区别在排查时很关键断开的时间点是不是固定的固定间隔断开通常是服务端或中间设备的老化策略随机断开才是网络问题。4. 日志与脚本让重复命令自己跑完并留下痕迹4.1 自动日志按会话分目录、按天切分排障最痛的从来不是当时看不懂输出而是事后想再看一眼却没有。日志功能要开在会话级别不要指望全局开关能覆盖所有场景。配置项建议值说明日志文件名D:\crt-logs\%S\%Y-%M-%D.log%S是会话名日期宏按软件提示填记录模式追加覆盖模式下同一天重连会丢前面那段时间戳每行前加事后对齐多台机器的日志时全靠它连接时自动开始勾选不勾就得每次手动点一定会忘宏的具体写法以「会话选项 → 终端 → 日志文件」旁边的提示为准不同版本支持的宏不完全一样。%S展开成会话名这件事很关键——它让日志天然按机器分目录几十台机器的日志不会糊在一个文件里。落地时有三个现实问题。第一是磁盘一台机器一天的交互式日志几百 KB 到几 MB几十台机器跑一年就是几十 G路径千万别指到系统盘。第二是网络盘日志写到映射盘上网络一抖客户端就卡住甚至崩掉本地盘最稳。第三是脱敏日志会把你敲过的所有东西原样记下来包括mysql -p后面跟着的明文密码、export出来的密钥变量名。打开日志之前先想清楚这个目录谁能看。日志的另一个用法是做变更留痕。改配置之前把当前输出打一份改完再打一份两份日志文件按时间排序就是完整的变更记录比事后回忆靠谱得多。4.2 脚本引擎VBScript 和 Python 怎么选7.0 这个版本提供两套脚本入口VBScript 是内建的开箱即用Python 需要在「全局选项 → 脚本」里指到一个本机解释器指不对就报找不到模块。选哪套不用纠结——你手边有什么环境用什么。VBScript 的优势是零依赖任何一台装了这个客户端的 Windows 机器都能直接跑Python 的优势是你可能已经有一堆现成的库。我一般这么分只在这一个客户端里跑、逻辑不超过五十行的小动作用 VBScript需要读 CSV、算哈希、发 HTTP 请求的用 Python那些活儿在内建脚本里做太憋屈。脚本的触发方式有两种。一是手工执行脚本菜单里选文件二是绑定到会话的登录动作上——「会话选项 → 连接 → 登录动作」里可以指定一个脚本会话一连上就自动跑。第二种是批量采集的关键配上第 2 章那种模板会话一次打开二十个标签页每个都自动跑一遍采集人只需要等。4.3 一个能跑的例子批量采集版本信息下面这段是 Python 脚本作用是往当前标签页发一条命令等提示符回来把中间的输出存文件。这类脚本看着简单坑几乎全在时序上。# -*- coding: utf-8 -*- # 对当前活动标签页发命令抓输出落到本地文件 def main(): tab crt.GetScriptTab() screen tab.Screen # 关掉异步刷新否则 WaitForString 会在半行输出上误匹配 screen.Synchronous True # 关分页不然输出会停在 --More-- 等按键 screen.Send(terminal length 0\r) screen.WaitForString(#, 5) # 第二个参数是超时秒数 screen.Send(show version\r) out screen.ReadString(#, 10) # 读到下一个提示符为止 with open(rD:\crt-logs\version.txt, a, encodingutf-8) as f: f.write(out) main()逐项说清楚。crt.GetScriptTab()拿到当前激活的标签脚本是挂在标签上跑的不是全局的所以要在目标会话里执行。Synchronous True这一行是整段脚本的命门不设的话屏幕缓冲区在后台异步填充WaitForString可能在只收到半行的时候就匹配成功取回来的输出是残缺的——这种 bug 表现为「大部分时候正常偶尔少几行」最难查。Send里的\r是回车不是\n终端类命令一律用\r。WaitForString和ReadString的第二个参数是超时秒数省略就是无限等脚本会卡死在那儿必须显式给。提示符#要按实际改。网络设备常见#和普通用户是$有些发行版还会在提示符里塞颜色控制字符导致字符串匹配不上。稳妥做法是先用一个不匹配任何东西的字符串跑一次把ReadString的结果打印出来看看真实的提示符长什么样再拿去当匹配串。5. 排查清单五类高频翻车现场与定位顺序5.1 中文变方块或者显示成问号现象ls出来的中文文件名全是问号cat一个 UTF-8 文件满屏乱码但同一台机器换个客户端就正常。原因客户端编码和服务端 locale 不是一套。7.0 的会话编码是会话级参数改建会话时如果是从一个老会话复制来的编码会跟着老会话一起继承。解决先在服务端跑locale看LC_CTYPE再用「会话选项 → 终端 → 外观 → 字符编码」对齐。服务端是zh_CN.GBK就选 GBK是en_US.UTF-8或zh_CN.UTF-8就选 UTF-8。两边都改一半是最糟的状态改完记得把终端窗口重开一个编码切换不会作用于已有回滚缓冲里的内容。5.2 配了公钥还是让输密码现象私钥选了用户名对了登录还是弹密码框输对了也能进就是公钥没生效。服务端日志里只有一句「Authentication refused」。原因按出现频率排一是权限位家目录或.ssh或authorized_keys权限太宽二是 SELinux 上下文不对三是客户端加载的私钥格式不被 7.0 识别静默跳过四是 sshd 配置里PubkeyAuthentication被关掉了。解决先在服务端看/var/log/secure或对应日志公钥认证失败会写明原因。权限问题按第 2 章的chmod 700/600一遍过SELinux 用restorecon -R -v ~/.ssh格式问题用ssh-keygen -p -m PEM -f转一次。排查顺序建议从服务端日志开始别一上来就怀疑密钥本身密钥本身出错反而是概率最低的。5.3 连接建立阶段直接失败提示没有共同的算法现象连一台新装的服务器TCP 能通但握手阶段就断客户端提示找不到匹配的密钥交换算法或加密算法。原因7.0 这个年纪的客户端只支持到当年的算法集合而新版本 OpenSSH 默认关掉了ssh-rsaSHA-1 签名和一批老式密钥交换。两边各退一步才能谈拢。解决优先在客户端侧放开——「会话选项 → 连接 → SSH2」里的密钥交换、加密、MAC 三个列表把服务端支持的算法勾上并拖到前面。服务端侧改配置PubkeyAcceptedAlgorithms、HostkeyAlgorithms之类是下策会把整台机器的安全基线拉低只在前者确实做不到的时候用而且改完记一笔别让它烂在配置文件里。5.4 挂机一段时间后会话无响应按键也没反应现象放那儿吃个饭回来窗口还在敲什么都没回显也不报断开点关闭才提示连接已丢失。原因中间设备的会话表老化、服务端的空闲超时、或者客户端反空闲没开。判断依据是断开的时间间隔——每次都是整 5 分钟、整 30 分钟那是策略时间随机那是网络。解决客户端开反空闲第 3.3 节间隔设得比最短的那个超时值小一半。同时去服务端确认ClientAliveInterval和登录 shell 里的TMOUT。如果两头都配了还断就要看中间有没有负载均衡或者防火墙做了透明老化这种情况要么缩短心跳间隔要么干脆用脚本定时发一条无害命令。5.5 粘贴多行命令时前面几行被提前执行现象从文档里复制一段十行的部署脚本粘进终端中间某行报错后面几行还是照跑跑到一半系统处于半完成状态。原因终端把粘贴进来的每个换行都当成回车一行行往下推没有任何中间暂停。7.0 这个版本没有 bracketed paste 那种把整段粘贴当成一次输入的机制。解决三个办法按场景选。少量命令用「粘贴前确认」好歹能在执行前看一眼成段的脚本先在本地编辑器里过一遍确认没有交互式命令rm -i、read、passwd这类再粘真正要批量跑的写成脚本文件用scp传上去执行或者用第 4 章那种逐行SendWaitForString的方式控制节奏。最后一种最慢但最不会出岔子。6. 配置备份与分发把一个人的顺手变成一群人的基线配置能不能带走决定了这套东西是一次性投入还是长期资产。secureCRT-7.0.0 的所有个性化设置都在两个目录里Sessions放会话Config放全局选项、配色、脚本路径、日志模板。把这两个目录一起打包拷到另一台机器上指过去工作环境就完整还原了。这件事的核心不在备份在于把它做成可复现的基线。我的做法是维护一个「基线会话」把编码、回滚缓冲、反空闲、日志模板、密钥路径全部调好其余所有会话都从它复制。复制完之后只允许改三样东西——主机名、端口、会话名。这条约束听起来死板但它保证了任何一台机器的会话都是同一套行为出问题时可以排除掉配置差异这个变量。版本管理也可以接进来。会话文件是纯文本能 diff 能合并扔进内部仓库是可行的但有两条红线一是仓库必须是私有的Sessions目录里明晃晃写着全部内网地址和主机名二是私钥绝对不能跟着进去把密钥路径写进会话配置没问题把私钥文件本身放进去就是事故。我一般会在仓库根目录放一个.gitignore把*.pub之外的所有密钥文件排除掉再加一条对Config/下缓存文件的忽略规则。验证基线有没有真的生效我用一个很笨但有效的办法在干净机器上还原配置打开三个不同类型的会话一台 Linux、一台网络设备、一台带端口转发的分别做三件事——locale看编码、翻回滚缓冲看行数、连转发端口看通不通。三件事都过基线就是可用的。这个检查清单我写在仓库的 README 里谁改配置谁跑一遍。表格式的检查清单比文字描述好执行检查项操作通过标准编码连 Linux 机跑locale再看中文文件名中文正常显示回滚跑dmesg后往上翻能翻到 5000 行以前公钥断开重连三次全程不弹密码框日志连一次后去日志目录看有当天的文件且带时间戳转发本地连127.0.0.1:13306能握手不是连接被拒最后说个我自己的教训。早几年我把配置随手放在默认路径系统重装前觉得「回头再导」结果重装完发现默认路径在用户目录下跟着一起没了。重建那三十几个会话花了大半天而且有两条端口转发规则根本没想起来直到一周后有人反馈连不上某个内部页面才补回来。从那以后我每次装完客户端第一件事就是把配置目录挪到独立盘符第二件事是把Sessions和Config一起打包传一份到内部存储第三件事是在新会话建好之后立刻对着上面那张表走一遍。这三步加起来不到五分钟能挡掉后面所有的重建成本。希望帮到你。本文还有配套的精品资源点击获取