1. SecureCRT 到底解决什么问题
SecureCRT 这个软件,做运维、做网络、做嵌入式调试的人几乎都碰过。它的定位说起来很简单——一款支持 SSH、Telnet、Serial、RLogin 等多种协议的终端仿真客户端,但真正让它在一线站住脚的,是那些日复一日被用到的小功能:会话树、日志自动留痕、按钮栏、脚本接口、多标签批量操作。我用它管过几百台服务器的集群,也用它连过交换机和嵌入式开发板,踩过的坑不算少。这篇文章不打算写成一份菜单翻译,而是把我这些年攒下来的配置习惯、操作细节和排查思路摊开讲清楚,适合刚接触 SecureCRT 的新手,也适合用了几年但一直停留在"新建会话—输密码—敲命令"这个循环里的老用户。
先明确一件事:SecureCRT 不是那种装完就能用的轻量工具。它的功能密度很高,选项面板层层嵌套,第一次打开会有点懵。但反过来讲,默认配置也确实能连上服务器干活,只是跑不了几天你就会发现:日志找不到、中文是乱码、每次登录都要输密码、三十台机器的会话挤在一个列表里分不清谁是谁。这一章先把它的能力边界说清楚,后面的章节再一块块拆解怎么把它调成趁手的样子。
1.1 它和 PuTTY、Xshell 的定位差异
很多人第一次选终端工具时面临的第一个问题就是:市面上这么多,为什么选 SecureCRT?我的判断标准很直接,看你的工作形态。
PuTTY 是典型的"单次连接工具",轻、小、免安装,临时连一台设备敲两条命令非常合适。但它的会话管理基本靠注册表或者手工维护,几十台机器以上的规模就会很难受。Xshell 的界面更现代,中文支持和免费授权对学生和家庭用户很友好,功能上覆盖了大部分日常场景。MobaXterm 的优势在于内置了 X Server 和 SFTP 面板,图形化能力强。
SecureCRT 的差异化在于三个地方。第一是会话组织和配置继承机制,它允许你设置一个"默认会话",所有新建会话都继承这套模板,也可以在任何层级新建文件夹,文件夹本身携带配置并向下传递,这种树形继承在企业环境中管理几十上百台机器时非常省事。第二是日志体系的完整度,日志文件名支持变量替换、支持按会话自动分目录、支持连接即开始记录,这套东西在需要长期留痕的合规场景里几乎是刚需。第三是脚本接口,它同时支持 VBScript、JScript 和 Python,能通过 COM 式的对象模型去驱动屏幕输入输出,做批量巡检、自动登录、配置下发都很方便。
所以我的建议是:如果你只是偶尔连一下路由器或者树莓派,PuTTY 或者系统自带的终端就够了;如果你的日常工作就是面对一堆服务器,需要长时间挂着、需要记录、需要自动化,那 SecureCRT 的投入产出比是划算的。
1.2 什么场景下值得用它
我总结下来,四类人对 SecureCRT 的依赖度最高。
第一类是系统运维和 DevOps。日常要连生产、测试、预发三套环境,每套几十台机器,会话树按"环境—机房—角色"三层分组,日志按会话自动落盘,出故障时回查历史输出非常快。第二类是网络工程师,SecureCRT 的 Serial 支持和 Telnet 支持对交换机、路由器、防火墙的配置调试很顺手,配合日志功能可以完整记录一次割接的所有操作。第三类是嵌入式开发和硬件调试,串口连接的稳定性、字符编码的灵活切换、以及对特殊控制字符的支持,都是刚需。第四类是需要长期留痕的岗位,比如做设备维护记录、做操作审计的场景,日志自动记录加上时间戳,比手工截图靠谱得多。
反过来讲,如果你只是需要一个跑脚本的终端,Windows Terminal 加 WSL 的体验其实更好;如果你的工作重心是文件传输,专门的文件同步工具会更专业。工具是拿来解决问题的,没必要为了用而用。
1.3 获取与授权的正规姿势
SecureCRT 是 VanDyke Software 的商业软件,官方提供全功能试用期,试用期内所有功能都能用。长期使用需要在官方渠道购买授权,官方对个人用户、教育用户通常有一些优惠方案,公司的采购流程走起来也不算复杂。
这里必须提醒一句:不要去碰任何第三方修改版、破解版或者来路不明的安装包。这不是什么道德说教,而是很实际的安全问题。终端客户端手里握着的是你所有服务器的登录凭据,一个被改过的二进制文件在传输密码、生成密钥、读写配置的时候动了手脚,你根本看不出来。我见过有人因为用了来路不明的版本,导致会话里保存的密码被导出。同样的道理也适用于所谓的中文补丁包——较新版本的 SecureCRT 官方内置了简体中文界面,在全局选项里切换即可,不需要任何外部文件。具体在哪里切,第二章会讲。
如果预算确实紧张,也可以考虑开源的替代方案,比如某些跨平台的终端客户端项目,功能上虽然没有 SecureCRT 这么全,但日常够用。关键是来源要干净,最好从官方仓库或者包管理器安装。
2. 装完先别急着连:初始化配置清单
装完之后我建议先花二十分钟把全局配置过一遍,这二十分钟能省掉后面无数次的重复调整。原因在于 SecureCRT 的配置是分层的:全局选项管所有会话的默认值,会话选项管单个连接,会话选项里没改的项会继承全局设置。如果你一上来就建会话连上去,后面再改全局默认,已经建好的会话不会跟着变,还得一个个改回来,很烦。
2.1 安装包选择与实际安装
下载的时候注意区分 32 位和 64 位安装包。现在的主流环境基本都是 64 位系统,直接选 64 位版本。什么时候需要用 32 位?两种情况:一是你还在维护 Windows 7 或者更老的 32 位系统;二是你需要配合某些只提供 32 位接口的第三方组件或插件。除此之外没有理由选 32 位,因为 32 位进程有内存上限,会话开多了或者回滚缓冲区设得很大时容易出问题。
安装过程本身没什么坑,一路下一步就行。有两个地方我习惯调一下:安装路径不要放在带中文或者空格的目录下,虽然现在的软件对中文路径支持普遍不错,但在牵扯到脚本、日志、配置文件读写的时候,路径里的中文和空格偶尔会变成玄学问题的来源;另一个是安装类型,如果你不需要右键菜单集成之类的功能,选自定义安装把不需要的组件去掉,装完之后系统里少几个后台进程。
安装完成后第一次启动,它会问你要不要导入已有配置。如果你是全新安装,跳过;如果是从旧机器迁移过来,这里可以直接指向旧的配置目录,比后面手工拷贝省事。
2.2 全局选项里必须先改的几项
打开 Options 菜单下的 Global Options,这几个地方我会第一时间改。
默认会话模板。在 Global Options 的 Default Session 分类下,你改的所有东西都会成为新建会话的初值。我通常会设置:终端仿真类型选 Xterm 或者 Linux(看目标系统),回滚缓冲区拉到 32000 行以上,字符编码设成 UTF-8,关闭响铃,开启窗口标题跟随会话名。回滚行数这个东西我建议直接拉满,现在硬盘和内存都不缺,出了故障要靠历史输出定位问题的时候,多留几千行可能就是能不能找到关键报错的区别。
密码与密钥的保存策略。Global Options 里有个密码相关的设置,可以控制是否允许保存会话密码、是否使用主密码保护整个配置库。我的建议是:私人电脑上给配置库设置一个主密码,这样即使配置文件被拷走,里面的凭据也是加密的。公用或者共享电脑上干脆不要保存密码,每次手输,虽然麻烦但安全。
配置目录位置。Global Options 的 General 分类下能看到配置文件夹的路径。记住这个路径,后面备份和迁移全靠它。默认在用户目录下的 AppData 里,我习惯把它改到一个我自己管理的位置,方便同步和版本化。
2.3 界面语言与配色:官方内置方案
关于中文界面,前面提过,较新版本的 SecureCRT 提供了官方多语言支持。在 Global Options 的 General 分类里能找到 Language 或者界面语言的下拉框,选简体中文,重启软件生效。这个方法是官方支持的,升级版本之后设置也不会丢。相比之下,网上流传的那些第三方汉化补丁,本质上是替换了程序资源文件,一是可能引入未知代码,二是每次软件升级都要重新打一遍,三是菜单翻译质量参差不齐反而影响查找功能。我个人的习惯是保持英文界面,因为网上大部分教程、报错信息和官方文档都是按英文菜单名写的,对着找反而更快。这个看个人取舍。
配色方面,长时间盯终端的人建议换一套对眼睛友好的方案。Global Options 的 Terminal 分类下可以调整前景色、背景色、光标样式。我用的是一套深灰底配浅色字的方案,比纯黑底白字柔和一些。字体推荐等宽字体,Consolas 或者 JetBrains Mono 都可以,字号根据显示器分辨率调,2K 屏上 12 到 14 号比较舒服。
还有一个小细节:把"关闭窗口时确认"打开。终端窗口里可能有正在跑的任务,误点关闭导致连接中断是很常见的事故。
3. 会话管理:把几百台机器管明白
会话管理是 SecureCRT 最有价值的部分之一,但也是大多数人用得最随意的地方。我见过太多人的会话列表,三十多个条目平铺在一起,名字全是 IP 地址,找一台机器要拿眼睛扫半天。这一章讲讲怎么把它整理成一个能用三年的结构。
3.1 会话树的分组与命名规范
SecureCRT 的会话面板支持文件夹嵌套,而且文件夹会继承和传递配置。这意味着你可以在文件夹层级上做批量配置,比一个个改会话效率高得多。
我的分组逻辑一般是三层。第一层按环境分:生产、预发、测试、开发。第二层按业务或者机房分:比如订单系统、支付系统,或者按机房代号分。第三层如果机器数量不多就直接放会话,多的话再按角色分一层:应用节点、数据库节点、缓存节点。
命名规范上,我的格式是「角色-机房-序号」,比如app-bj01-03。为什么不用 IP 做名字?因为 IP 会变,机器会迁移,而会话名是你自己定义的逻辑标识,改 IP 的时候只需要改会话里的地址,不用重新建会话。另外 IP 作为会话名还有一个问题:IPv6 地址很长,显示不全。
文件夹层级上还可以做一件事:给每个文件夹设置一套默认的日志路径和字符编码。比如生产环境文件夹统一配置日志落到D:\Logs\Prod\下面,测试环境落到另一个目录,这样后面找日志的时候一目了然。
3.2 连接参数里那些容易被忽略的开关
新建会话的时候,大部分人的操作是:填主机名、填用户名、选协议、连。但有几个参数值得花时间看一下。
保持连接。Session Options 的 Connection 分类下有发送协议空包(NO-OP)的设置项。很多企业内网的防火墙或者负载设备会把长时间没有数据流动的连接掐掉,表现就是你去吃个午饭回来,终端卡死不动了。把 NO-OP 设成每 60 秒发一次,基本能解决空闲断连的问题。这个设置和服务器端 sshd 的ClientAliveInterval是两回事,两边都配上最稳妥。
终端仿真类型。默认是 VT100,但对于 Linux 服务器,建议改成 Xterm 或 Linux。原因是不同的 TERM 值会影响服务器端程序的行为:颜色显示、光标移动、方向键、功能键的编码都和这个有关。如果遇到vim里方向键打出一串字母、top界面错乱、less翻页异常这类问题,八成是终端类型不匹配。
字符编码。Session Options 的 Terminal 分类下的 Appearance 里能找到编码设置,常用的有 UTF-8、GBK、GB18030。现代 Linux 发行版基本都默认 UTF-8,所以新建会话时统一设成 UTF-8。只有连一些老的国产设备或者老版本的数据库客户端时,才需要临时切成 GBK。这里有个经验:如果日志里出现方块或者问号,先检查编码;如果出现的是乱七八糟的汉字,说明是编码不匹配,切换试试。切换之后要重新连接才生效。
外观和标题。把"窗口标题跟随会话名"打开,多开窗口的时候任务栏上一眼就能分辨谁是谁,比默认的"主机名 - SecureCRT"清晰得多。
3.3 配置目录与迁移备份
配置目录里主要包含两块东西:Sessions 文件夹存所有会话定义,Global 文件夹存全局配置。整个目录就是你的工作环境,换了新电脑,把这个目录拷过去,在 Global Options 里把配置路径指过去,所有会话、密钥引用、日志设置就全回来了。
这就引出一个很实用的做法:把配置目录放进版本控制或者云同步文件夹。我自己的做法是放在一个私有仓库里,每次做重大调整之后提交一次。好处是配置改坏了可以回滚,换电脑的时候直接克隆。但这里有个安全前提:配置目录里可能包含保存的密码和密钥文件。如果你要同步,务必先给配置库设置主密码,让凭据以加密形式存在。更保险的做法是会话里不保存密码,只保留连接参数,密码和密钥单独管理。
另外提醒一句:Sessions文件夹里的会话文件是文本格式的,但不要手工去编辑,字段多且有关联,容易改坏。要批量修改就用导出导入功能,或者用脚本。
4. 密钥登录:从密码到免密的完整落地
密码登录这件事,日常用问题不大,但在规模化场景里就很痛苦:几十台机器几十个密码,要么用同一个弱密码,要么记不住靠猜。而且很多自动化脚本没法处理交互式密码输入。密钥认证就是来解决这个问题的,配好之后登录不用输密码,安全性还比密码高。
4.1 为什么要换密钥:一次讲透原理
密钥认证的原理说白了是一种"你手里有钥匙、服务器手里有锁孔"的验证方式。你生成一对数学上关联的密钥:私钥留在自己机器上,绝对不外传;公钥可以随便给人,包括贴到服务器上。登录的时候,服务器发一段随机数据,你的客户端用私钥对这段数据做处理后再发回去,服务器用公钥验证处理结果。私钥全程不离开你的电脑,所以就算通信过程被完整记录,也推导不出私钥。
和密码相比,密钥的优势有三个:第一是抗暴力破解,密钥的长度和算法强度远高于人能记住的密码;第二是可以做到一台机器一个密钥,某台机器出问题不影响其他;第三是配合免密登录可以支撑自动化脚本。
反过来说,密钥也有它的风险点:私钥文件一旦泄露就等于密码泄露,而且没有"改密码"这种补救措施,只能重新生成密钥对并替换服务器的公钥。所以私钥文件的权限管理非常关键,后面会讲。
4.2 用 SecureCRT 生成密钥对
SecureCRT 自带了密钥生成工具,在 Tools 菜单下的 Create Public Key 里能找到,不需要额外装别的软件。
生成的时候有几个选项要选。密钥类型上,优先选 RSA 或者 Ed25519,RSA 兼容性最好,几乎所有设备都支持,Ed25519 更短更快但对老设备可能不兼容,具体看你连的目标系统。密钥长度选 2048 或者 4096,2048 已经是安全的下限,4096 更保险但握手稍慢,日常选 2048 就够用。如果设备比较老,比如十年前的交换机,可能只支持 RSA 1024,那就按设备的来。
生成过程中会问你密钥的保护密码,也就是给私钥文件本身加一个密码。我这里强烈建议设一个。理由是私钥文件默认存在硬盘上,如果你的电脑被他人短暂使用,或者文件被某些程序扫描读取,加了口令的私钥至少多一层保护。当然代价是每次用这个密钥的时候要输一次口令,SecureCRT 可以缓存,但重启后会清掉。
格式选择上,如果你要用这个密钥去连 Linux 服务器,选 OpenSSH 格式或者可以同时导出 OpenSSH 格式;如果目标是用 SecureCRT 自己连,它支持多种格式导入。同一个密钥可以在生成界面里同时导出成不同格式的文件。
生成完成之后你会得到两个文件:一个是私钥文件,一个是以.pub结尾的公钥文件。公钥文件里的内容就是那一段以ssh-rsa或者ssh-ed25519开头的长字符串。
4.3 公钥部署的具体命令与权限
公钥要放到服务器的~/.ssh/authorized_keys文件里。部署方式有两种:一种是先用密码登录一次,手工粘贴;另一种是借用ssh-copy-id这类工具。我讲手工方式,因为所有的自动化工具底层做的也是这件事。
登录服务器之后,依次执行下面这些步骤:
# 确保目录存在,权限给对 mkdir -p ~/.ssh chmod 700 ~/.ssh # 把公钥内容追加进去(把整段公钥粘贴到引号里) echo "ssh-rsa AAAAB3NzaC1yc2EAAA... user@host" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys权限这一步是被最多人忽略的坑。SSH 服务端有一个叫 StrictModes 的检查机制,默认开启。如果~/.ssh目录权限不是 700,或者authorized_keys权限不是 600,或者这两个文件的所有者不是当前用户,服务端会直接拒绝使用公钥认证,而且它不会在客户端给出明确提示,只会退回密码认证。很多人配了半天发现还是要输密码,就是这个原因。
如果你的服务器开了 SELinux,还得多做一步:
restorecon -R -v ~/.ssh这条命令的作用是把文件的 SELinux 安全上下文恢复成正确的值。~/.ssh目录的上下文类型应该是ssh_home_t,如果是从别的地方拷贝过来的文件,上下文可能不对,SELinux 就会拦住访问。用复制粘贴的方式创建文件时通常不会出问题,但用cp、mv从其他位置搬过来时就很容易踩。
服务端配置上,检查/etc/ssh/sshd_config里这三项:PubkeyAuthentication yes、AuthorizedKeysFile .ssh/authorized_keys、StrictModes yes。改完之后重启服务生效。测试的时候不要关掉密码认证,等密钥确认能用之后再考虑关闭,否则一旦密钥有问题你就被锁在门外了。
4.4 认证失败的三层排查法
密钥登录不上是最常见的求助场景,我一般按三层排查。
第一层看客户端。Session Options 的 SSH2 分类下的 Authentication,确认你的认证方式是 PublicKey,并且公钥那一栏指向的是正确的私钥文件。这里有个常见误区:SecureCRT 那栏叫 PublicKey,但要选的是私钥文件不是公钥文件。选错了客户端就不会尝试用密钥认证。
第二层看服务端日志。Linux 上是/var/log/secure或者/var/log/auth.log,具体看发行版。里面会写清楚失败原因:是权限不对(会写Authentication refused: bad ownership or modes),还是公钥不匹配(Failed publickey),还是算法不支持(no matching host key type)。这三个报错对应完全不同的处理方式,看日志比瞎猜快十倍。
第三层看算法兼容性。新的 OpenSSH 版本默认禁用了 SHA-1 相关的老算法,如果你的 SecureCRT 版本比较旧,或者服务器比较老,可能在密钥交换阶段就谈不拢,表现为连接刚开始就断开。这种情况要么升级客户端,要么在服务端配置里临时放开老算法,要么用兼容性更好的密钥类型重新生成一对。
5. 日志文件名怎么配:自动留痕的正确打开方式
日志功能是 SecureCRT 里我最看重的部分,也是搜索量最高的功能点之一。原因很实际:终端里的输出是流式的,滚过去就没了。回滚缓冲区再大也有上限,而且一旦窗口关掉就全部清零。真出了故障要复盘,或者要追溯某次变更做了什么操作,没有日志就只能靠回忆。
5.1 日志功能的价值定位
日志有三个层面的价值。
第一是排障取证。线上出问题的时候,你需要的往往不是"现在是什么状态",而是"十分钟前发生了什么"。有日志就能把当时的完整输出调出来,包括命令、返回、报错上下文。
第二是变更留痕。运维做配置变更的时候,如果全程有日志记录,事后追溯谁在什么时间改了什么东西就有了依据。这在多人协作或者需要审计的场景里是刚需。
第三是知识沉淀。有些排查过程很曲折,最后找到原因的那一刻,如果有日志,就能把整个思路固化下来,下次遇到类似问题直接查。
SecureCRT 的日志功能支持自动开始记录、按变量命名文件、按会话分目录,配置一次长期有效。
5.2 文件名变量拼接规则详解
配置入口在 Session Options 的 Terminal 分类下的 Log File 面板。勾上 "Start logging upon connect" 之后,会话一连上就自动开始记录,不用手工点。
核心是文件名那一栏,它支持变量替换。常用的变量有这些:
| 变量 | 含义 | 示例值 |
|---|---|---|
| %H | 主机名或 IP 地址 | 192.168.10.21 |
| %S | 会话名称 | app-bj01-03 |
| %Y | 四位年份 | 2025 |
| %M | 两位月份 | 03 |
| %D | 两位日期 | 17 |
| %h | 两位小时(24 小时制) | 09 |
| %m | 两位分钟 | 42 |
| %s | 两位秒 | 07 |
| %% | 一个百分号字符 | % |
我要强烈推荐的一种拼法是按会话分目录、按时间排序:
D:\CRTLogs\%S\%Y-%M-%D_%h%m%s_%H.log这套命名出来的效果是:每台机器一个独立文件夹,文件夹里是按"日期_时间_主机"排列的日志文件,时间靠前的排在上面,翻起来非常顺。用%S做文件夹名的另一个好处是,如果你把会话按业务分好了组,日志结构自然就跟着业务结构走,找日志的时候不用先想"这台机在哪个网段"。
还有一个细节值得注意:如果要按天切分文件,但又不想每次连接都新建一个文件,可以在文件名里只保留到日:D:\CRTLogs\%S\%Y-%M-%D.log,然后把下面的追加选项勾上。这样同一天的多次连接会写进同一个文件,方便按天归档。
另外,%S如果会话名里带反斜杠,SecureCRT 会把它当成子目录分隔符处理,这可以拿来做更细的分层。但我不建议玩得太花,层级太深反而不好找。
5.3 日志选项、编码与归档清理
文件名下面是几个关键选项。
追加还是覆盖。选"追加"的话,同名文件会继续往后写;选"覆盖"每次连接都清空重来。日常用追加,除非你的文件名精确到秒,每次都是新文件,那两种都无所谓。
是否记录原始数据。有一个选项叫 Raw log 之类的,勾上之后会把终端控制字符(比如颜色转义序列)也一起写进去。好处是日志可以用支持 ANSI 的工具回放,还原当时的颜色显示;坏处是文件更大,而且用普通文本编辑器打开会看到一堆乱码符号。我的建议是:日常排障用普通模式就够了,纯文本好搜索;如果是做操作演示或者需要留证据的场景,再开原始模式。
字符编码。日志文件的编码要和会话编码一致,否则记录下来的中文也是乱的。这个选项通常跟会话的终端编码联动。
日志归档。日志这东西不加管理会迅速吃掉硬盘。我的做法是每季度清理一次,把超过半年的日志压缩打包,按季度归档到一个冷存储目录。压缩比很高,文本日志压完通常只剩原来的一成不到。另外建议在日志根目录放一个说明文件,写清楚命名规则,一年后自己或者同事来看的时候不至于看不懂。
6. 效率工程:按钮栏、脚本与文件传输
配置好会话和日志之后,日常操作的效率还有很大的提升空间。这一章讲三个能明显减少重复劳动的功能。
6.1 按钮栏与键盘映射
按钮栏在 View 菜单下可以打开,它是一条可以自定义的按钮条,每个按钮可以绑定三种动作。
发送字符串。这是最常用的。比如你经常要执行一串固定的检查命令,把它配成一个按钮,点一下就把命令发过去。这里有个技巧:字符串里可以用控制字符,比如\r表示回车,\n表示换行。想让命令自动执行,末尾一定要带上回车。另外可以把登录场景里常见的交互也做进去,比如自动应答某些提示。
运行脚本。绑定一个脚本文件,点一下就执行。适合比字符串更复杂的自动化。
菜单。把一组按钮收进一个下拉菜单,避免按钮条太长。
我自己的按钮栏上常驻这么几个:查看磁盘使用率、查看内存和负载、跟踪最新日志、查看防火墙规则。每个都是一行命令加回车,点一下两秒钟出结果,比手敲快得多,更重要的是不会敲错。
键盘映射在 Session Options 的 Terminal 分类下的 Mapped Keys 里配置。这里可以定义组合键发送特定字符串。常见的用法是把某个组合键映射成 Tab 补全,或者映射成某些设备需要的特殊功能键。方向键在某些老设备上表现异常时,也可以在这里修正。
6.2 用脚本把重复操作干掉
SecureCRT 的脚本系统是这个软件区别于普通终端工具的分水岭。它支持 VBScript、JScript 和 Python,其中 Python 需要在全局选项里指定本机 Python 解释器的路径,VBScript 在 Windows 上开箱可用。不同版本的菜单位置略有差异,但都在脚本相关的设置分类下。
脚本的基本模型是这样的:通过一个全局对象去操作屏幕和会话。核心的几行大概长这样(Python 示例):
# $language = "python" # $interface = "1.0" def main(): crt.Screen.Synchronous = True crt.Screen.Send("df -h\r") crt.Screen.WaitForString("$") output = crt.Screen.ReadString("$") crt.Dialog.MessageBox(output) main()几个要点值得说明。Synchronous设为 True 之后,脚本的命令会等待屏幕响应再继续,否则会出现命令还没发完就去读结果的情况。Send负责发数据,末尾的\r是回车。WaitForString等待屏幕上出现特定字符串,这是同步的关键。ReadString把两个标记之间的内容读出来。
基于这几个原语,就可以写批量巡检脚本了:遍历一个主机列表,依次连接、执行一组命令、把结果写进本地文件。写起来不复杂,但能省掉大量重复劳动。
脚本写的时候有几个坑。一是超时处理,如果目标机器卡住,WaitForString会一直等下去,得加超时判断。二是提示符匹配,不同系统的提示符不一样,$、#、>都可能是提示符的一部分,匹配字符串写得太宽容易误判。三是输出里如果包含特殊控制字符,读出来的字符串会带上这些字符,写文件前最好过滤一下。
另外,SecureCRT 还支持登录脚本,在 Session Options 的 Logon Actions 面板里配置。它可以在连接建立后自动应答各种提示,比如自动处理首次连接的密钥确认、自动跳过某些设备的欢迎信息。这个功能比脚本更轻量,适合处理固定流程的登录交互。
6.3 Zmodem 与 SFTP 两条传输路线
SecureCRT 支持两种主要的文件传输方式,适用场景不同。
Zmodem是在终端会话里直接传文件的方式,需要在服务器端安装lrzsz相关工具。用法很简单:服务器上执行sz 文件名就是下载到本地,执行rz然后在弹出的对话框里选文件就是上传。它的优点是不需要额外开通道,在只有终端访问权限的环境里特别有用,连串口都能用。缺点是速度慢,而且传大文件的时候终端会被占住。
Zmodem 有几个配置项要注意:Session Options 的 Terminal 分类下能找到 Zmodem 相关设置,可以指定上传下载目录、设置同名文件自动覆盖。默认目录是配置文件目录下的一个子目录,容易让人找不到文件,我一般会改成自己的工作目录。另一个常见问题是传输中途卡死,多半是因为文件里有特殊字符触发了误判,可以在设置里调整相关选项。
SFTP是另一种方式,通过独立的标签页操作,支持浏览目录、拖拽上传下载、断点续传的功能。在菜单或者会话的右键菜单里可以打开 SFTP 标签页。它的速度接近网络带宽上限,适合传大文件或者批量传文件。缺点是必须通过 SSH 认证,纯串口或者 Telnet 环境用不了。
我的习惯是:小配置文件、临时脚本用 Zmodem,因为不用切换窗口;大文件、批量同步用 SFTP。
6.4 多标签、平铺与批量发送
SecureCRT 的多标签是它早期就有的功能。多个会话可以在同一个窗口里以标签页形式排列,也可以拆分成上下或左右平铺,方便同时观察多台机器的输出。
一个很实用的功能是"向所有会话发送"。在 View 菜单里能开启这个模式,打开之后你输入的内容会同时发到所有打开的会话。做集群批量操作的时候非常好用,比如同时给十台机器执行同一条检查命令。用的时候要注意两点:一是务必先确认所有标签页的目标环境是同一批,别把生产环境混进去;二是命令要先想好,因为这个模式没有撤销的机会。我自己的做法是,先在一个会话里把命令验证好,再开启批量模式粘贴执行,执行完立刻关掉批量模式。
7. 常见问题排查速查表
这一章把我这些年被问得最多的问题整理一下,按类别归好,方便对号入座。
7.1 连接类问题
连接类问题里,最常见的是连接被拒绝和连接超时,这两者原因完全不同。连接被拒绝说明网络能通,但目标端口没有服务在监听,或者被防火墙的 reject 规则拦了。连接超时说明数据包发出去没有回应,通常是防火墙 drop 规则或者路由不通。排查顺序是先用 ping 确认网络可达(有些环境禁 ping,那就跳过这步),再用端口检测工具确认端口状态,最后看服务端的日志。
另一类是连接建立了但很快断开,通常是认证方式或者算法协商的问题。这种情况打开 SecureCRT 的详细日志(在 Global Options 里开启 Connection 分类下的详细输出),能看到完整的协商过程,卡在哪一步一目了然。
7.2 显示与输入类问题
显示问题最常见的就三种:乱码、花屏、方向键异常。
乱码分两种情况。如果是所有中文都不对,是编码设置问题,切换 UTF-8 和 GBK 试。如果只是部分字符不对,可能是字体问题,换一个完整的等宽字体试试。日志文件里的乱码多半是日志编码和会话编码不一致,单独检查日志设置。
花屏通常出现在全屏类程序里,比如top、vim、htop。这大多是终端类型设置的问题,把 TERM 改成 Xterm 之后重新登录一般能解决。如果还不行,检查回滚缓冲区的设置,有些程序会依赖终端上报的窗口尺寸,尺寸信息不对会导致渲染错位。
方向键异常的表现是按下方向键输出^[[A这样的字符。原因是服务器端的 terminfo 和终端实际上报的类型不匹配。解决办法是确认会话的终端类型和服务器上的TERM环境变量一致,或者在键盘映射里手工修正。
7.3 一张速查表
| 现象 | 最可能的原因 | 处理方式 |
|---|---|---|
| 连接被拒绝 | 端口无服务或被拒绝规则拦截 | 检查服务状态和防火墙规则 |
| 连接超时 | 路由不通或被丢弃规则拦截 | 检查网络路径,逐跳确认 |
| 配了密钥仍要求输密码 | 目录或文件权限不对 | 检查.ssh目录 700、authorized_keys600 |
| 中文显示为乱码 | 会话编码与服务器不一致 | 统一切换为 UTF-8 后重连 |
| 全屏程序显示错乱 | 终端类型不匹配 | 改为 Xterm 或 Linux 后重连 |
| 空闲一段时间后卡死 | 中间设备掐断长时间空闲连接 | 开启定时发送空包 |
| 日志文件找不到 | 默认路径在配置目录下 | 在日志设置里改成自定义绝对路径 |
| 日志中文乱码 | 日志编码与会话编码不一致 | 单独调整日志编码选项 |
| Zmodem 传输中断 | 文件中含特殊字符触发误判 | 换用 SFTP 传输 |
| 脚本读取结果不完整 | 未启用同步模式或超时设置过短 | 开启同步并增加等待超时 |
8. 我踩过的坑和几条硬规矩
前面都是方法论,这一章讲讲我实际踩过的坑,这些内容在官方文档里基本找不到。
关于会话配置,我最惨的一次教训是把一批生产环境的会话配置改坏了,原因是想批量修改某个参数,手工编辑了会话文件。SecureCRT 的会话文件虽然有文本结构,但内部字段有依赖关系,改错一个字段可能导致整个会话不可用。正确做法是用导出导入功能,或者先备份配置目录再动手。
关于密钥,我见过太多人把私钥放在云盘或者聊天记录里传来传去。私钥就是身份,泄露的后果比密码泄露严重得多,因为密码泄露至少还能改,密钥泄露只能全网替换公钥。我自己的做法是:私钥文件只放在本地固定目录,权限设成只有自己能读,另有一份加密备份放在离线介质里。给私钥设口令这一步也不要省。
关于日志,最常见的坑是磁盘写满。日志文件在长时间运行下增长很快,特别是那些输出频繁的会话。我给的建议是设置一个独立的日志分区或者定期清理任务,并且在日志设置里留意一下有没有单文件大小限制的选项。另外,日志里可能包含敏感信息,比如命令中带的口令参数、返回结果里的连接串,归档和分享之前一定要过一遍。
关于批量操作,我给自己定的规矩是:任何时候开启"向所有会话发送"之前,先逐个确认每个标签页的目标主机名。因为我真的见过有人在批量模式下误发了一条重启命令,把整个测试集群全重启了。虽然测试环境影响不大,但如果是生产,后果不堪设想。
最后一点关于工具本身。终端工具是每天都要用几个小时的东西,值得花时间把它调顺手。但也不要陷入无限折腾配置的状态——配置的目的是让你更快地解决问题,而不是让配置本身变成一个问题。我一般会在新环境装好之后集中配置一次,之后基本不动,遇到具体问题再针对性调整。这样既保持了效率,也不会因为配置变来变去导致自己都记不清哪台机器设了什么。