1. Mac 版 SecureCRT 的定位与踩坑根源
先说结论:SecureCRT for mac 不是一个"装完就能用"的软件,它是一个把二十年 Windows 运维习惯硬搬到 macOS 上的桌面客户端。功能确实强,会话管理、日志、脚本、批量执行这些能力在同类工具里属于第一梯队,但它在 macOS 上的每一个"顺手"背后,都藏着一个和系统习惯不合的默认值。我第一次在 Mac 上用它,光是让它正常显示中文、让 Option 键能当 Meta 用、让日志按天分文件这三件事,就折腾了整整一个下午。
这篇内容写给三类人:一是刚从 Windows 运维岗转到 Mac 笔记本的人,二是需要在 macOS 上管理几十上百台设备的人,三是已经装了 SecureCRT 但总觉得"哪里不对劲"的人。我会把安装、会话配置、键盘映射、日志、脚本、报错排查这几条链路全部拆开讲,包括那些官方文档里不会写、只有真正踩过才知道的细节。
需要提前说明一点:SecureCRT 是商业软件,官方渠道提供试用期,长期使用请走正规授权。网上流传的各种"注册机""激活工具""汉化版打包"我强烈不建议碰——这类文件会篡改应用包内容,一旦签名被破坏,macOS 的 Gatekeeper 会直接拦下来,甚至可能带来更麻烦的安全问题。后面我会专门用一小节讲清楚为什么。
2. 安装与首次启动:新手最容易卡住的四个环节
2.1 安装包来源与授权方式的选择
macOS 上的软件来源比 Windows 讲究得多,SecureCRT 官方只提供 dmg 安装包,没有走 Homebrew 官方 cask 的渠道(至少我看到的情况是这样)。这意味着你在终端里敲一句命令就装好的路子基本走不通,必须老老实实去官网下 dmg、拖进应用程序文件夹。这一步本身不复杂,但坑在于"下完之后怎么办"。
授权方式上,官方是试用 + 付费授权。我的建议很直接:如果你的使用场景是公司运维,走公司采购;如果是个人学习,先用试用期把功能摸熟,再决定要不要买。真正要警惕的是那些"打包好的安装包",很多都内置了修改过的二进制文件。判定方法很简单——安装完成后在终端里跑一句签名检查:
codesign -dv --verbose=4 /Applications/SecureCRT.app正常的官方包会显示 VanDyke Software 的签名信息。如果输出里出现Signature=adhoc或者干脆报code object is not signed at all,那这个包十有八九被动过手脚,别用。我见过有人为了省事装了一个"绿色版",结果每次系统更新后都要重新折腾一遍,因为签名失效会被系统反复拦截,时间成本远超授权费用。
注意:应用包一旦被第三方工具修改过,后续用系统更新或重新下载覆盖安装时,残留的配置目录可能和新版本冲突,表现为启动崩溃或者会话列表空白。遇到这种情况,先把
~/Library/Application Support/VanDyke/整个目录备份后移走,再重装。
2.2 打开时提示「已损坏」或「来自身份不明的开发者」
这是 macOS 上所有非 App Store 软件的第一个坎。SecureCRT 的 dmg 首次打开时,可能会遇到两种提示:一种是"来自身份不明的开发者",另一种更狠,直接说"已损坏,无法打开,你应该将它移到废纸篓"。第二种提示往往不是文件真损坏,而是 dmg 从浏览器下载后被加上了隔离属性(quarantine)。
处理方式分两步。第一步,在"系统设置 - 隐私与安全性"里找到被拦截的记录,点"仍要打开"。第二步,如果压根没有这个入口,或者提示的是"已损坏",那就需要手动清掉隔离标记:
xattr -dr com.apple.quarantine /Applications/SecureCRT.app这条命令的意思是递归删除应用包内的扩展属性,-d是删除,-r是递归。执行完再双击打开,正常情况下就能进了。这里有个细节很多人忽略:要先确认应用已经拖进 /Applications 目录再执行,直接在 dmg 挂载卷里执行是无效的,因为挂载卷是只读的。
还有一种情况是 Apple Silicon 机器上的架构问题。较老的 SecureCRT 版本是纯 Intel 构建,在 M 系列芯片上要通过 Rosetta 2 转译运行。转译本身能用,但会带来两个副作用:一是启动明显变慢,二是某些和串口、系统钥匙串交互的功能可能表现异常。安装 Rosetta 的方式是:
softwareupdate --install-rosetta --agree-to-license判断自己装的是不是原生版本,可以在终端里查:
file /Applications/SecureCRT.app/Contents/MacOS/SecureCRT如果输出里同时出现x86_64和arm64,说明是通用二进制;只有x86_64就是 Intel 单架构。较新的 9.x 版本基本都已经提供原生支持,具体以官方发布说明为准。
2.3 关于汉化包:我为什么不建议装
搜索结果里"SecureCRT 汉化""SecureCRT 中文"这类词热度一直很高,说明很多人对英文界面有心理负担。但我要泼一盆冷水:汉化包是 macOS 上 SecureCRT 最容易把环境搞崩的一类操作。
原理不复杂。汉化包的做法通常是替换应用包内部的资源文件(比如各种 .nib、.strings 或者 Qt 的翻译文件),替换之后整个包的代码签名就失效了。失效的后果有三个层次:轻度的是每次启动都要重新授权、Gatekeeper 反复弹窗;中度的是某次系统小版本更新后直接打不开;重度的是应用能开但部分功能面板空白、点击无响应,因为资源文件和二进制不匹配。
我自己最后选择的是纯英文界面,配合两个设置让阅读压力降到最低:一是把字体调大一点(会话选项 - 终端 - 外观,字号 14 到 16 之间比较舒服),二是把常用的几个菜单项用系统快捷键或者按钮栏做快捷入口。实际上 SecureCRT 的界面英文难度很低,配置项就那么几十个,用一周基本就形成肌肉记忆了。为了省这点阅读成本去承担环境崩溃的风险,性价比太低。
2.4 首次启动必须改的三个全局设置
刚装完的默认配置是"能用但难用"的状态,我会在第一次启动时就把三件事做掉,因为它们会影响之后创建的每一个会话。
第一件是修改默认会话模板。SecureCRT 的会话管理器里有一个 Default 条目,所有新建会话都从它继承配置。我会在这里先把终端类型设成xterm-256color、字符编码设成 UTF-8、字体设成支持中文的等宽字体。这样后面每新建一个会话,这些基础项就是对的,不用一台一台去改。
第二件是配置全局日志目录。默认情况下 SecureCRT 可能不记录日志,或者记在应用包附近,这在 macOS 上很容易踩权限坑。我会在全局选项里指定一个明确的路径,比如~/Documents/securecrt-logs,并且确保这个目录自己提前建好。文件夹不存在时,日志会静默失败,你以为在记,其实一个字都没写。
第三件是把系统钥匙串的授权搞清楚。SecureCRT 在 Mac 上保存密码是走系统钥匙串的,首次保存会话密码时会弹一个授权框,问你"是否允许访问钥匙串"。这里有个大坑:如果你点了"拒绝",后面即使重新输入密码也不会再弹窗,表现就是密码永远保存不上,每次连接都要手输。解决办法是打开"钥匙串访问"应用,找到对应的条目删掉,再回 SecureCRT 重新保存一次,这次记得点"允许"。
3. 会话配置的硬核细节:把每个参数讲透
3.1 会话目录结构与批量改会话的骚操作
这是我认为 Mac 版 SecureCRT 最有价值、却最少人知道的一点:它的所有会话配置都是明文 ini 文件,可以直接用文本工具批量改。
配置文件在哪儿?Mac 上的路径是:
~/Library/Application\ Support/VanDyke/SecureCRT/Config/进去之后能看到Sessions目录,每个会话一个子目录或者一个 .ini 文件,里面存着主机名、端口、用户名、终端类型这些键值。Windows 版的对应路径是%APPDATA%\VanDyke\Config\。两边格式基本一致,这就是后面配置迁移的基础。
批量改的价值在哪?假设你手上有八十台设备,主机名从10.10.1.1到10.10.1.80,一台一台新建会话要人命。实际做法是:先用文本编辑器复制出一份模板,然后批量替换主机名那一行。会话文件里的键值长这样(不同版本写法略有差异,有的是S:Hostname=,有的是S:"Hostname"=):
S:"Hostname"=10.10.1.1 S:"Username"=ops D:"[SSH2] Port"=00000016注意那个端口的十六进制写法,00000016就是十进制的 22,这是 SecureCRT 的一个历史遗留格式。批量改端口的时候别直接写22,要写成十六进制。这个坑我踩过,改完发现端口变成别的东西,连了半天连不上,一直以为是网络问题。
批量替换可以用 sed 一行搞定:
cd ~/Library/Application\ Support/VanDyke/SecureCRT/Config/Sessions for i in $(seq 1 80); do cp -r Template "10.10.1.$i" sed -i '' "s/^S:\"Hostname\"=.*/S:\"Hostname\"=10.10.1.$i/" "10.10.1.$i/__Template.ini" done注意 macOS 自带的 sed 必须用-i ''(BSD 风格),直接写sed -i会报错,这是从 Linux 迁过来的用户最常踩的一个坑。
3.2 密钥登录:从生成到免密的完整链路
密码登录在运维里迟早要被淘汰,密钥登录是必修课。SecureCRT 支持自己生成密钥对,也支持导入已有的密钥。我的习惯是在 Mac 本地用 ssh-keygen 生成,然后把公钥推到远端服务器,再让 SecureCRT 指向私钥——这样命令行和图形客户端共用一套密钥,不用维护两份。
生成密钥:
ssh-keygen -t ed25519 -C "mac-ops" -f ~/.ssh/id_ed25519_ops推荐 ed25519 而不是 RSA,理由是密钥更短、握手更快,安全性也够用。生成时会让输密码短语(passphrase),如果图省事可以直接回车留空,但留空意味着私钥文件泄露就等于资产泄露,这个取舍自己判断。
推公钥到远端:
ssh-copy-id -i ~/.ssh/id_ed25519_ops.pub ops@10.10.1.1如果这台机器上没有 ssh-copy-id(有些精简系统不带),可以手动来:
cat ~/.ssh/id_ed25519_ops.pub | ssh ops@10.10.1.1 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"权限这一步是必须的,很多人推完公钥还是被拒,八成就是因为权限不对。SSH 服务端对这几个文件的权限非常敏感:家目录不能让组和其他用户写,.ssh目录必须是 700,authorized_keys必须是 600。如果远端开了 SELinux,还需要恢复上下文:
restorecon -R -v ~/.ssh最后回到 SecureCRT 配置:会话选项 - 连接 - SSH2 - 认证,把 PublicKey 拖到最上面,选中你导入的私钥文件。这里有个细节,SecureCRT 在 Mac 上导入私钥时,如果私钥有密码短语,它会问你要不要存进钥匙串,存了之后就可以免密使用。同样的钥匙串授权坑,别点"拒绝"。
3.3 保活与断线重连:让长连接不再半夜断
Mac 笔记本有个天然的劣势:合盖休眠、Wi-Fi 切换、网络抖动,都会导致长连接断掉。我在 Windows 台式机上从来没在意过这件事,换到 Mac 之后才发现,一晚上过去,第二天早上打开电脑看到满屏Connection closed by remote host是常态。
解决思路有三层,我会全部配上。
第一层是 SSH 协议层保活。会话选项 - 连接 - SSH2 里有一个"发送协议层保活消息"的选项,勾上,间隔设 60 秒。这个保活包是 SSH 协议自身的 keepalive 请求,对服务端友好,不会污染你的终端输出。
第二层是终端层反空闲。会话选项 - 终端里有个"反空闲"设置,可以配置成每隔一段时间发送一个特定字符(比如空字符)。这个和上面那个的区别是:协议层保活只维持 TCP 和 SSH 会话,而反空闲是往你的 shell 里塞字符,能防止某些网络设备或者堡垒机因为"无流量"而主动踢你。
第三层是服务端配合。如果远端是 Linux,可以在/etc/ssh/sshd_config里设ClientAliveInterval 60和ClientAliveCountMax 3,这个配置我没法替你改,但值得跟运维同事提一句。
三层配完之后,我实测过合盖再打开,连接依然在的概率大幅提升。当然这也不是万能的,如果笔记本真的进入了深度休眠、网卡断电,那神仙也救不回来,这时候就靠 SecureCRT 的会话重连功能——它会自动尝试恢复之前打开的会话。
3.4 跳板机与端口转发的最小配置
运维场景里经常遇到"只能通过跳板机访问内网服务"的情况,比如内网的数据库只在某个网段开放。SecureCRT 在 Mac 上支持配置端口转发,把本地端口映射到远端服务,这样你在本机就能用本地的数据库客户端连内网。
配置路径是会话选项 - 连接 - SSH2 - 端口转发,选"本地"方向,然后填三个值:本地监听端口、目标主机、目标端口。举例,你想在本机用 13306 连内网数据库 10.20.30.40 的 3306:
| 配置项 | 值 |
|---|---|
| 本地端口 | 13306 |
| 远端主机 | 10.20.30.40 |
| 远端端口 | 3306 |
保存后连上跳板机,本机访问127.0.0.1:13306就等于访问那台数据库。这里有个常见的困惑点:如果本机已经跑了一个 MySQL 占用了 3306,你又把本地端口填成 3306,转发会静默失败。所以养成习惯,本地端口统一加个前缀偏移,比如 13306、15432、16379,一眼就能看出这是转发端口。
3.5 串口会话:/dev/tty.* 与 COM 口的对应关系
这一条专门写给做网络设备调试的人。在 Windows 上串口是 COM3、COM4,到了 Mac 上完全变了样。macOS 的串口设备在/dev目录下,插上 USB 转串口线之后,先看看系统认出来没有:
ls /dev/tty.usb* /dev/cu.usb*通常会看到成对出现的设备,比如tty.usbserial-1420和cu.usbserial-1420。这两个的区别是:tty.*会在设备端等待载波信号,cu.*(call-up)不会。做交互式调试时应该选cu.*,因为用tty.*有时会出现"打开后没反应、敲键盘没输出"的现象,原因就是它在等一个永远不会来的载波信号。这个坑很隐蔽,很多人以为是线坏了或者驱动没装。
新建会话时协议选 Serial,端口填/dev/cu.usbserial-1420,波特率按设备定,交换机一般是 9600,某些设备是 115200。还有一个 WindTerm/SecureCRT 通用的坑:串口会话里箭头键乱码,那是终端类型设置问题,把仿真类型调成 VT100 通常就好。
4. Mac 才有的体验坑:键盘、剪贴板、字体、快捷键
4.1 Option 键、Meta 键与 Emacs/vi 操作
macOS 键盘最让 Linux 用户抓狂的就是:Command 键在终端里没用,Option 键默认也不产生 Meta 信号。结果就是在服务器上用 Emacs 快捷键(比如 Alt+B 后退一个单词)、或者在 Bash 里用Alt+.取上一条命令的最后一个参数,统统失效。
SecureCRT 里需要显式打开这个开关,位置在会话选项 - 终端 - 仿真,找"使用 Option 作为 Meta 键"这一项,勾上。勾完之后 Option+B、Option+F 就能正常用了。如果你用的是外接的 PC 键盘,插在 Mac 上之后 Alt 键会被识别成 Option,Command 会被识别成 Win 键,这套映射关系是系统层面的,SecureCRT 里不需要额外配置,但你会明显感觉到"Ctrl 和 Command 的位置反了",这个只能靠时间适应。
另外提一句和输入法相关的坑,这个坑的杀伤力极大:macOS 默认的输入法切换快捷键是 Ctrl+Space,而 Ctrl+Space 在终端里是 Emacs 的 set-mark,在不少交互式工具里也是常用键。你在终端里想按 Ctrl+Space,结果系统把输入法切成了中文,然后你敲的命令全变成了拼音。解决办法是在"系统设置 - 键盘 - 键盘快捷键 - 输入法"里把它改成别的组合,比如 Ctrl+Shift+Space,或者干脆用 Caps Lock 当切换键。
4.2 多行粘贴确认:一个能救命的小开关
这一条是我认为 SecureCRT 最应该默认开启、却没有默认开启的功能。
场景很常见:你从文档里复制了一段三行的命令,粘到终端里,结果 SecureCRT 一口气全贴进去了,然后三行命令连续执行。前两行是cd /tmp、ls还好,如果中间有一行是rm -rf加上不完整的路径,或者是一行reboot,那就只能祈祷了。
SecureCRT 的会话选项 - 终端里有一个和"多行粘贴"相关的确认开关(不同版本的措辞略有差异,有的是"粘贴时显示确认对话框",有的是按行数阈值触发)。打开之后,粘贴内容超过一定行数会弹窗让你确认,还能看到将要粘贴的完整内容。这个开关在批量粘贴配置、粘贴 SQL、粘贴多行脚本时价值极高,我建议所有会话的默认模板里都打开。
配套的还有一个小技巧:粘贴大量内容前,先把终端窗口拉大,确保内容完整可见,再决定要不要回车。SecureCRT 的粘贴是"贴进去但不自动回车",这一点比某些客户端做得好,但如果你粘贴的内容末尾带了换行符,它就会自动执行。所以从网页上复制命令时,注意别把末尾的空行一起复制进去。
4.3 字体与 Retina 屏:中文变方块的根因
Mac 的 Retina 屏显示中文本来应该很舒服,但 SecureCRT 用默认字体时经常出现"中文显示成方块"或者"中文和英文高度不一致、对不齐"的问题。
根因是字体回退(font fallback)。SecureCRT 默认选的是一套纯英文等宽字体,而这套字体里不包含中日韩字形。有些应用会自动回退到系统字体把中文渲染出来,SecureCRT 在 Mac 上的回退行为并不总是可靠,于是就出方块了。
解决方法是手动换一套带中文的等宽字体。我试过几个方案,效果从好到次排序:
| 字体 | 中文支持 | 中英对齐 | 备注 |
|---|---|---|---|
| 更纱黑体 Mono SC | 完整 | 好 | 需要单独下载安装,中英严格等宽 |
| JetBrains Mono + 系统回退 | 部分 | 一般 | 英文极舒服,中文靠回退 |
| Menlo | 无中日韩 | - | 系统自带,中文会方块 |
| Noto Sans Mono CJK | 完整 | 好 | 开源,体积偏大 |
字体设置在会话选项 - 终端 - 外观里,改完之后记得回默认模板也改一遍,否则新建会话还是老的。另外 Retina 屏上的字号,我个人推荐 14 到 15,太小了眼睛累,太大了屏幕装不下几行。
4.4 快捷键冲突与窗口管理习惯
Mac 上的 Cmd+Q 是"退出应用",不是"关闭窗口"。这个差异在 SecureCRT 上后果很严重:你本来只想关掉当前标签页,手一抖按了 Cmd+Q,整个应用退出,所有打开的会话全部关闭。SecureCRT 有会话恢复机制,重开之后能恢复,但如果当时正在执行一个不可中断的操作(比如数据库迁移脚本跑到一半),那就很难受了。
我现在的习惯是关标签页用鼠标点标签上的小叉,或者用菜单里的关闭项,坚决不碰 Cmd+Q。另外 SecureCRT 支持"关闭窗口时最小化到托盘/后台",不开这个选项的话,关窗口就是断连接。
还有一类冲突来自系统截图。macOS 的 Cmd+Shift+3/4/5 用来截图,其中 Cmd+Shift+4 之后按空格可以截窗口。这些组合和终端里的操作基本不冲突,但如果你在远端系统里也用类似的快捷键,就会打架。这属于习惯问题,不是 bug。
4.5 外接 Windows 键盘的键位改造
很多人在 Mac 上外接一把 Windows 键盘用,这时候会遇到三个问题。第一,键盘上的 Win 键会被当成 Command,Alt 被当成 Option,Ctrl 位置不变但手感全乱。第二,如果你习惯了 Windows 上 Ctrl+C 复制、Ctrl+V 粘贴,在 Mac 上得改成 Cmd+C/Cmd+V,而这个"Cmd"在你手上的物理位置是 Win 键。第三,某些键盘的 Fn 层、多媒体键在 Mac 上识别不全。
系统层面可以做一次键位重映射,位置在"系统设置 - 键盘 - 键盘快捷键 - 修饰键",选中你外接的那把键盘,把 Command 和 Option 对调,或者把 Control 映射成 Command。SecureCRT 本身不需要改,它跟随系统的修饰键映射。
我个人的做法是:保留系统默认映射,逼自己适应两三天。因为一旦你改了映射,下次换回 Mac 自带键盘又会错乱,来来回回更费劲。硬件层面能解决的事,尽量别用软件魔法去绕。
5. 日志与自动化:最容易做对也最容易翻车的部分
5.1 日志文件名变量的正确用法
SecureCRT 的日志功能支持在文件名里使用占位符变量,这是它比很多同类工具强的地方。常用的一组大概是这些(具体变量集合以官方文档为准,不同版本可能有增减):
| 变量 | 含义 | 典型用途 |
|---|---|---|
%S | 会话名称 | 区分不同设备 |
%H | 主机名或 IP | 区分不同主机 |
%U | 登录用户名 | 多账号场景 |
%Y%M%D | 年、月、日 | 按天切分文件 |
%h%m%s | 时、分、秒 | 高频连接场景 |
%P | 协议类型 | 区分 SSH / Telnet / Serial |
一个实战级的命名模板可以写成这样:
~/Documents/securecrt-logs/%Y-%M-%D/%S_%H_%h%m%s.log这个模板的效果是:按天建子目录,文件名里带上会话名、主机和连接时间,永远不会互相覆盖。我之前用的是一个不含时间戳的简单模板,结果同一台设备当天连了五次,日志全被覆盖,最后只剩最后一次的,排查早上的故障时完全没证据。
这里有一个非常容易忽略的前提:中间目录必须已存在。%M这种按天分目录的写法,如果当天目录还没建,SecureCRT 不会自动创建,日志就直接写不进去,而且不报错。稳妥的做法是写一个开机自启的小脚本,或者干脆用系统自带的日历/自动化工具,每天定时创建当天的目录。我试过偷懒不建目录,结果是一周之后才发现日志一直是空的。
5.2 日志编码、追加模式与磁盘占用
日志的第二个坑是编码。SecureCRT 记录日志时有一个独立的编码设置,它和终端显示编码是两回事。如果你终端设了 UTF-8,日志编码还用默认值,写出来的文件在编辑器里打开就是一堆乱码,而且事后无法修复,因为写入时字节已经错了。
所以配日志的时候,编码也要一起设成 UTF-8。这样日志文件在任何编辑器、任何系统上都能正常打开。
第三个坑是磁盘占用。日志这东西是"平时不觉得,回头一看吓一跳"。一个长时间挂着的高频输出会话,一天产出的日志可能有几十兆,一个月就是几个 G。Mac 笔记本的硬盘本来就不宽裕,而且系统数据(就是"系统数据"那个神秘的占用项)会越滚越大。
我的做法是在日志设置里启用"限制日志文件大小"或者"每次连接创建新文件",然后用一个简单的清理脚本定期删旧日志:
find ~/Documents/securecrt-logs -type f -name "*.log" -mtime +60 -delete find ~/Documents/securecrt-logs -type d -empty -delete第一条删掉 60 天前的日志文件,第二条删掉删空之后剩下的空目录。挂到定时任务里,一个月跑一次就够了。删之前建议先确认一下自己的合规要求——有些行业要求日志保留更久,那就把 60 改成 180 或者 365。
5.3 脚本从 VBScript 迁到 Python
SecureCRT 支持脚本自动化,这在批量改配置、批量巡检、自动登录这类场景里非常有用。但如果你从 Windows 迁过来,会发现一个很硬的问题:原来用 VBScript 写的脚本,在 Mac 上跑不起来。
原因是 VBScript 是 Windows 平台的脚本引擎,Mac 上根本没有。SecureCRT 在 Mac 上可用的脚本语言主要是 Python(以及可能的 JScript、Perl,具体看版本和安装情况)。所以迁移的第一件事就是把脚本重写。
我个人的经验是:与其逐行翻译 VBScript,不如直接用 Python 重写,逻辑更清晰,调试也方便。一个最小的 Python 脚本长这样:
# $language = "python" # $interface = "1.0" def main(): tab = crt.GetScriptTab() tab.Screen.Synchronous = True tab.Screen.Send("show version\n") tab.Screen.WaitForString(">", 10) output = tab.Screen.ReadString(">") with open("/tmp/version.txt", "a") as f: f.write(output + "\n") main()几个容易踩的点:第一,脚本头部的$language和$interface注释不能删,SecureCRT 靠它识别脚本类型。第二,Screen.Synchronous建议设为 True,否则会出现"命令还没发完就读结果"的竞态。第三,WaitForString一定要带超时参数,不带的话设备一卡住,脚本就永远挂着。第四,写文件用绝对路径,脚本的工作目录不一定是你想的那个。
注意:批量脚本跑之前,务必先在一台测试设备上验证。批量执行脚本最典型的翻车方式是:提示符匹配写在 Linux 上能过,写在一台 Cisco 设备上永远等不到,脚本卡死半小时。提示符别写死成
#或$,用更宽松的模式匹配。
5.4 按钮栏与「发送到所有会话」的安全用法
按钮栏是 SecureCRT 里一个被低估的功能,可以把常用命令做成按钮,点一下就发到当前会话。配置方式是在按钮栏上右键,新建按钮,填入要发送的字符串,还可以设置"发送后是否回车"。我给几类常用操作各做了一个按钮:查看接口状态、查看路由表、查看日志尾部。日常巡检效率提升很明显。
但同一区域的另一个功能需要格外小心:"发送到所有会话"。这个功能的字面意思就是把一条命令同时发给你当前打开的所有会话。做批量操作时是神器,比如给二十台设备同时下发一条配置。
翻车的场景也很经典:你只是想给一台设备改配置,结果"发送到所有会话"的开关还开着(它往往是一个可以一直保持开启的状态),一条write erase或者reload就同时打到了所有设备上。这类事故我见过不止一次。
我的建议是把这个功能做成"每次都要手动确认"的模式,并且养成一个习惯:操作前先看一眼打开了几个会话标签。如果屏幕上开着十几个标签,任何一条有风险的命令都要先在心里过一遍"这条命令如果发到所有会话上会怎样"。
6. 常见报错速查与排查实录
6.1 连接类报错
连接类问题基本集中在网络可达性和端口两个维度。下面这张表是我这些年攒下来的高频问题清单:
| 现象 | 大概率原因 | 处理动作 |
|---|---|---|
| 卡在"正在连接"不动 | 网络不可达或防火墙丢包 | 终端里先ping一下,再用nc -vz host 22测端口 |
| 秒退,提示 Connection refused | 服务没起或端口不对 | 确认远端 sshd 状态和监听端口 |
| 提示 Connection timed out | 走错了网段或路由 | 检查是不是没连上内网 |
| 连上后立刻断 | 服务端限制、并发数超了 | 换个账号试,看服务端日志 |
| 同样 IP,命令行能连,SecureCRT 不能 | 会话里端口填错(十六进制) | 检查会话文件的端口字段 |
最后一行值得单独说。前面提过会话文件里端口是十六进制存储的,如果你手动改过会话文件,把端口写成了十进制的22或者2222,SecureCRT 会按十六进制解析,2222会被理解成一个完全不同的端口号,表现就是"这台机器明明能 ping 通,就是连不上"。排查时第一件事就是回会话选项里看看端口显示的数字对不对。
6.2 认证与密钥类报错
认证类报错的信息量其实很大,只是很多人不细看。Permission denied (publickey)和Permission denied (password)是两个完全不同的方向。
| 报错 | 含义 | 排查顺序 |
|---|---|---|
| Permission denied (publickey) | 服务端不接受你的密钥 | 私钥路径对不对、权限 600、公钥在不在 authorized_keys、钥匙串有没有拦 |
| Permission denied (password) | 密码错或被禁用 | 确认账号状态、服务端是不是关掉了密码认证 |
| Too many authentication failures | 一次送了太多密钥 | 在 SSH2 认证里只勾一把密钥,别全勾 |
| Host key verification failed | 主机指纹变了 | 确认是不是重装过系统,是的话删掉旧指纹 |
| 私钥有密码短语但每次都要输 | 钥匙串授权被拒 | 钥匙串访问里删条目,重新保存并点允许 |
Too many authentication failures这个坑在 Mac 上特别容易出现,因为很多人的~/.ssh目录下堆了十几把密钥。连通失败时,客户端会挨个试,试到服务端的 MaxAuthTries 上限就被踢了,报错信息看起来像是认证失败,其实是"试太多了"。解决办法是在会话的 SSH2 认证里,把该主机用不到的其他密钥全部取消勾选,只留正确的那一把。
6.3 显示与交互类报错
这类问题不影响连接,但严重影响使用体验,而且往往最难定位,因为"现象和原因之间的距离很远"。
| 现象 | 根因 | 解决 |
|---|---|---|
| 中文变方块 | 字体不含 CJK 字形 | 换更纱黑体等中英等宽字体 |
| 中文乱码(显示为问号或乱字符) | 字符编码不匹配 | 会话选项里设 UTF-8,同时看服务端 locale |
| 方向键变成 ^[[A | 终端类型设置不对 | 仿真类型改 xterm 或 vt100 |
| 光标位置错乱 | 远端 terminfo 和终端类型不符 | 服务端 TERM 与客户端设置对齐 |
| Backspace 删不掉字符 | 退格键发送序列不匹配 | 会话选项里调整退格键发送方式 |
| vim/tmux 里颜色异常 | 终端只声明了 8 色 | 终端类型用 xterm-256color |
| 长时间无操作后卡住 | 网络设备踢空闲会话 | 开反空闲 + SSH 层保活 |
方向键变成 ^[[A^[[B这个问题的根源是终端模式和远端 terminfo 不匹配。如果你连的是 Linux 服务器,通常把客户端终端类型设成xterm-256color,再确认服务端装了对应的 terminfo 数据库就没事。如果是网络设备,设vt100更保险。tmux 用户还要额外注意,tmux 会自己覆盖 TERM 变量,如果外面显示正常、进了 tmux 就乱,那要去看 tmux 的default-terminal配置。
7. 替代方案与配置迁移
7.1 系统自带 ssh + iTerm2 的组合
如果你只是偶尔连几台机器,说实话不需要 SecureCRT。macOS 自带的 ssh 客户端加上一个好用的终端模拟器就够了。我第一次在 Mac 上做运维时用的是这个组合,配置成本几乎为零:
ssh ops@10.10.1.1想要免密就在~/.ssh/config里写几行:
Host db01 HostName 10.20.30.40 User ops Port 22 IdentityFile ~/.ssh/id_ed25519_ops ServerAliveInterval 60写完就能ssh db01直连,比在图形界面里点来点去快得多。ServerAliveInterval 60那行就是我们前面说的保活,在命令行下只需要一个参数。
这套方案的短板在会话管理和日志。没有统一的会话列表,几十台机器全靠记忆;日志要靠script命令或者终端软件自带的记录功能。所以我的判断是:少于十台机器、不需要留日志、不需要批量操作,命令行方案更省事;超过这个规模,或者有审计和批量巡检需求,才值得上 SecureCRT 这类图形客户端。
7.2 其他候选客户端横向对比
Mac 上能选的 SSH 客户端其实不少,我按自己的使用感受列个对比:
| 客户端 | 优势 | 短板 | 适合谁 |
|---|---|---|---|
| SecureCRT | 会话管理强、日志细、脚本能力强 | 商业授权、Mac 适配细节多 | 运维、网络工程师 |
| 系统 ssh + 终端 | 零成本、脚本友好、启动快 | 无图形会话管理、无日志 | 开发者、轻度用户 |
| Termius | 界面现代、跨平台同步 | 高级功能要订阅 | 多端切换的人 |
| Tabby | 开源、可定制、颜值高 | 稳定性偶有问题、资源占用偏高 | 喜欢折腾的人 |
| iTerm2 + ssh | 终端能力天花板、分屏强 | 不是 SSH 客户端,没有会话概念 | 重度终端用户 |
表格里没有绝对答案。我自己现在的配置是:日常开发用 iTerm2,需要批量管设备、要留操作日志的时候开 SecureCRT,两边共用同一套~/.ssh密钥。这样切换成本最低。
7.3 从 Windows 迁到 Mac 的配置搬迁
如果你的机器本来就是 Windows 上用 SecureCRT,现在换到 Mac,是可以把配置搬过来的,不用重头建。
Windows 端配置目录是%APPDATA%\VanDyke\Config\,Mac 端是~/Library/Application Support/VanDyke/SecureCRT/Config/。核心要搬的是两个东西:Sessions目录(所有会话定义)和Global.ini(全局设置)。
搬迁步骤我实际做过一遍:
- 在 Windows 上把
Config目录整个拷到一个 U 盘或者云盘。 - 在 Mac 上先退出 SecureCRT(一定要退干净,不然会覆盖)。
- 备份 Mac 上现有的
Config目录,改个名字放着。 - 把 Windows 的
Sessions目录拷进 Mac 的Config目录。 - 启动 SecureCRT,检查会话列表。
有几个已知的差异要注意。第一,Global.ini我建议不要整个覆盖,最好只把需要的设置项手工抄过去,因为两个平台的默认值差异不小,整包覆盖可能带来奇怪的行为。第二,Windows 上有一些 Mac 版不支持的选项(比如某些脚本引擎相关设置),搬过去会显示为无效。第三,会话文件里的换行符是 CRLF,Mac 上是 LF,一般 SecureCRT 能兼容,但如果出现会话加载异常,用工具统一转一下:
find ~/Library/Application\ Support/VanDyke/SecureCRT/Config/Sessions -type f -name "*.ini" -exec dos2unix {} \;dos2unix需要先用包管理器装一下。macOS 上有一批命令行工具是通过包管理器补的,包管理器本身如果安装报错,通常是网络或者脚本权限的问题,这种情况下先确认系统里有没有 Xcode 命令行工具,很多编译类依赖都要靠它:
xcode-select -p如果没有输出,就用xcode-select --install装一下。这个前置条件不满足,很多通过包管理器装的工具都会编译失败,报的错还跟工具本身没关系,特别容易误导人。
7.4 会话窗口的组织与多任务习惯
最后说一个和工作流有关的事。Mac 的窗口管理逻辑和 Windows 差别挺大——没有任务栏,切换靠调度中心(Mission Control)和 Cmd+Tab。在 SecureCRT 里同时开着十几个生产环境的会话时,很容易误操作。
我现在的做法是分两层控制。第一层,同环境同类型的设备只放一个窗口,用标签页切换,不要开一堆窗口。第二层,把生产环境的会话标签统一用不同颜色区分(会话选项里可以设标签颜色),一眼扫过去就能看出哪个是生产、哪个是测试。这个习惯帮我避过好几次"把测试环境的命令敲到生产上"的事故。
另一个实用做法是给关键会话加"禁止关闭"或者二次确认。SecureCRT 支持在关闭会话时询问,这个开关在你有重要会话的时候非常值钱。关掉一个正在跑长时间任务的标签页,代价可能是一晚上白干。
8. 最后分享几个我踩过的小坑
写到这儿,其实还有几条零碎的、不成体系但很实用的经验,一起倒出来。
第一,会话文件是可编辑的,但改之前一定先备份。我吃过一次教训:批量改了八十个会话的端口,改错了一个字段,结果那台设备再也连不上,而我忘了原来是什么值。现在改任何批量配置前,我都先cp -r Sessions Sessions.bak,几秒钟的事。
第二,别把会话密码和私钥密码短语都交给钥匙串之后就忘了。换电脑、重装系统、钥匙串出问题的时候,你会发现自己完全不记得那些密码了。重要的凭据还是单独存在密码管理器里一份。
第三,SecureCRT 的版本升级要挑时间。不要在临近发版、临近演练的时候升级客户端,尤其是跨大版本升级。我遇到过一次小版本升级后,老会话的终端类型设置被重置,导致一批设备的显示全乱,排查了半天才反应过来是升级引起的。
第四,Mac 上的"系统数据"占用如果异常增长,看看 SecureCRT 的日志和缓存目录。日志按天分目录的写法如果没有及时清理,几个月下来能占掉十几个 G。定期用前面那条find ... -mtime +60 -delete清一下,比事后去手动找大文件省事得多。
第五,也是最重要的一条——任何批量操作之前,先在单台设备上跑一遍,确认输出符合预期,再放大到全部。这条规则适用于脚本、按钮栏、发送到所有会话,适用于一切"一次影响多台设备"的操作。技术上再熟练的人,也架不住一次手滑。
这套东西没有哪家文档会完整地写给你,基本都是在"连不上—排查—再连不上—再排查"的循环里一点点攒出来的。SecureCRT 在 Mac 上确实有坑,但把上面这些配置一次性做对之后,它能提供的会话管理和日志能力,目前我还没找到更好的替代品。