有一段时间我同时维护着几台 Linux 服务器和两三台 Windows 主机,桌面上常年飘着五六个窗口:一个敲 SSH 命令,一个传文件的 FTP 客户端,再开一个 mstsc 连远程桌面。每次切换我都觉得自己像调度员,但调度的是一堆随时可能关错的窗口。后来我把 SSH、FTP、RDP 全部收进了一个窗口里,这个方案就是基于 Tabby 这个开源终端搭起来的。这篇文章从选型、配置到实际排错,把我这套“一个窗口管三样”的完整方案说清楚。如果你也是一个人管多台机器、天天在命令行和文件传输之间来回折腾,这篇应该对你有用。
1. 这个需求是怎么来的:终端、文件、桌面三头跑的日常
1.1 远程运维最常见的三个角色
先说清楚一件事:为什么要把 SSH、FTP、RDP 三者放到一起管,而不是继续各用各的工具。
我日常做远程维护,基本逃不开这三类动作:
- SSH:登录 Linux 服务器查看日志、改配置、重启服务、跑脚本,这是命令行的主战场。
- FTP/SFTP:上传安装包、下载日志文件、备份配置、同步目录。比如某个服务报错,我先 SSH 上去看日志,发现缺一个配置文件,本地改好后传上去,再 SSH 重启服务。
- RDP:接入 Windows 服务器装软件、改注册表、看带图形界面的管理程序,或者调试一些只能在桌面端完成的操作。
一个典型的线上问题排查链路是这样的:先用 SSH 进 Linux 看应用日志定位问题,然后本地准备修复文件,用 FTP/SFTP 传上去,最后再回到 SSH 重启服务。如果问题还牵涉到 Windows 机器上的管理端,那就得再开一个 RDP。这一套下来,窗口数量轻轻松松涨到四五个。
1.2 多窗口方案的核心痛点
单看每个工具,它们做得都不差:Xshell 的终端做得专业,FileZilla 传文件稳定,mstsc 是 Windows 亲儿子。但把它们拆开用,存在几个实打实的问题:
- 窗口切换开销大:Alt+Tab 来回找窗口,找错了还得再切,一天的重复操作消耗不少精力。
- 凭据散落:Putty 记一个密码、FileZilla 存一个密码、远程桌面又存一个密码,时间一长连自己都不记得某台机器密码存在哪个软件里。
- 会话上下文丢失:终端窗口在网络抖动中断开之后,之前执行的命令记录、路径位置全部没了,重新连上还得从头回忆。
- 没有一个全局视角:同时维护多台机器时,你想一眼看到哪些机器在线、哪些连接是活跃的,拆开的工具根本给不了这种视图。
1.3 “一个窗口”不是把三个工具塞进一个界面
这里要澄清一个概念:Tabby 不是简单地把终端、FTP、RDP 做成三个标签页拼在一起,而是把连接信息、凭据、会话状态统一管理起来。它的主窗口结构是:
- 左侧是连接列表(Profiles),所有 SSH、FTP、RDP、串口、本地终端都在这里统一管理和分组。
- 中间是标签页区域,每个连接占一个 Tab,可以拖动排序,也可以分栏同时显示多个会话。
- 右侧可以随时呼出 SFTP 文件面板,不需要单独开一个文件传输窗口。
一句话总结我的需求:我要的不是“三个软件凑一个文件夹”,而是打开一个应用,所有远程连接都在侧边栏里等着,点一下就进去了。
2. 工具选型:MobaXterm、FinalShell、Xshell 都试过,最后留了 Tabby
2.1 同赛道选手的横向对比
做技术选型的时候,我把市面上一圈工具都装过一遍。这里列一下我实际用过的方案和感受:
| 方案 | 优点 | 缺点 | 能否算“一个窗口” |
|---|---|---|---|
| Xshell + Xftp | 终端流畅,Xftp 传文件稳定,用户基数大 | 免费版个人使用有限制,RDP 还要另开 mstsc | 不算,SSH 和 FTP 是两个独立程序 |
| MobaXterm | Windows 下功能全面,SFTP 面板顺手,支持插件 | UI 风格偏老,多平台支持弱,配置迁移麻烦 | 勉强算,RDP 插件要额外调 |
| FinalShell | 国内资料多,图形化 SFTP 直观 | 安装包大,广告和推送,开源程度有限 | 基本算,但 RDP 能力很弱 |
| Windows Terminal | 终端体验极好,跨平台 | FTP/RDP 得完全靠手动搭,不适合统一管理 | 不算 |
| Tabby | 开源、跨平台、插件机制完善,SSH/SFTP/RDP 都能装进来 | 初次配置需要熟悉,追求极致轻量的人会觉得 Electron 偏重 | 算,核心卖点就是这个 |
2.2 为什么最后选了 Tabby
选 Tabby 有几个硬理由:
- 开源且跨平台:Windows、macOS、Linux 都有对应版本。我家里用 Mac、公司用 Windows,一个工具两边通吃,配置还能通过文件同步保持一致。
- 连接管理是原生设计:Tabby 的核心就是 Profiles,SSH、SFTP、RDP 都作为连接类型存在,统一放侧边栏。这点和“终端模拟器顺便挂个文件面板”的工具完全不同。
- 插件系统可靠:RDP 是通过官方插件扩展出来的,不是破解也不是魔改,更新跟随主版本走,出了问题能定位到具体依赖。
- 配置可读可备份:Tabby 的配置是 YAML 格式,可以手动编辑、批量导入导出,这对维护大量机器的人来说非常重要。
当然也要说点公道话:如果你只在 Windows 上干活,MobaXterm 其实也够用;如果你洁癖到不能接受 Electron,那 Terminal 才是归宿。但我的使用场景是跨平台 + 多协议 + 需要统一管理,Tabby 在这个组合下最合适。
2.3 安装与首次启动的几个细节
安装没什么难度,GitHub Releases 下载对应安装包,macOS 可以直接brew install --cask tabby。我想说的是两个容易被忽略的点:
- 配置目录:Windows 在
%APPDATA%\tabby,macOS/Linux 在~/.config/tabby。整个目录保存了所有 Profles、主题、插件配置。我建议装好之后第一时间把这个目录做一次备份,以后换电脑直接把配置拷过去就能无缝恢复。 - 首次启动会问你要不要导入旧版 Terminus 的配置、选主题和字体。这里别急着跳过去,我建议把字体设置成等宽字体,主题选一个对比度高的,因为后面你会长时间盯着这个窗口。
3. SSH 连接这块我踩过的坑:密钥、跳板、超时与批量登录
3.1 SSH 连接配置的正确姿势
在 Tabby 里新建 SSH 连接需要填几个字段:Host(主机地址)、Port(默认 22)、Username(登录用户)、认证方式。
有一点要特别提醒:如果直接在 Profiles 里保存密码,Tabby 默认会把它放在本地配置文件中。虽然本地文件权限能挡住大部分用户,但为了安全,我建议生产环境一律用密钥认证,开发环境如果用密码也建议配合系统钥匙串保存。
认证方式里我推荐用私钥。Tabby 支持直接指定私钥文件路径,也支持读取~/.ssh/id_ed25519这类默认密钥。填好之后可以先用「Test Connection」按钮验证,这一步能提前暴露掉 90% 的网络密钥问题。
3.2 密钥登录与连接失败的排查链路
热搜词里经常出现“ubuntu ssh无法连接”“华为交换机ssh配置”“ssh连接服务器”这类问题,本质上排查路径是一样的。我总结一个固定套路:
- 先确认网络通不通:在本地执行
ping 目标IP,通了再继续。 - 确认端口通不通:执行
nc -zv 目标IP 22,如果端口不通,问题在防火墙或服务没启动。 - 新版 Ubuntu 的坑:很多 Ubuntu Server 默认没装
openssh-server,需要先sudo apt install openssh-server并启动服务。 - 用详细模式看认证过程:在 Tabby 里连接失败时,可以开一个本地终端手动执行
ssh -v user@host,输出里会直接告诉你密钥被拒绝还是密码验证失败。
密钥登录还有一个常见坑:too many authentication failures。这个报错通常是因为本地~/.ssh/config或者 ssh-agent 里注册了多个密钥,客户端一个个尝试,超过了服务器的最大尝试次数。解决办法是在 Tabby 的连接配置里不勾选「Use SSH agent」,或者把不想用的密钥从 agent 里移除。
3.3 跳板机与端口转发配置
需要跳板机登录内网机器的场景很常见。Tabby 里新建 SSH 连接时,在 Proxy 设置里选 SSH Proxy,然后填跳板机的连接信息,目标连接就会被自动封装。
本地端口转发也是刚需。比如数据库只允许内网访问,我需要在本地跑一个客户端去看数据。在 Tabby 的连接配置里找到端口转发设置,加一条规则:本地端口3306转发到远端内网IP:3306,SSH 连接建立后本地mysql -h 127.0.0.1就能直连。
3.4 多标签页与“批量登录”的替代方案
热搜词里有“ssh批量登录”,这是很多运维人的想法:能不能一个命令吧所有服务器都登进去,然后执行同一个操作。
Tabby 本身没做“一登录全部”的按钮,但我的做法是:在连接列表里把同一类机器放到一个分组,使用键盘快捷键依次开标签页,然后配合分栏(Split)功能,把几个关键机器的会话左右排开。视觉上能同时看到多个终端,比来回切换标签页舒服。
如果你要真正执行“同一命令发到所有会话”,更可靠的做法是登录后在每台机器上都启动 tmux,然后开一个终端作为控制端进入每个 tmux 会话,用 tmux 的synchronize-panes开启同步输入。这个方式和 Tabby 不冲突,因为 Tabby 只是终端容器,里面跑什么工具完全由你决定。
3.5 长任务与断线重连
热搜词里有“ssh命令执行过程中退出,命令还会继续么”,答案是:如果没有用 nohup、tmux、screen 这类工具,SSH 连接断开后,命令会被 SIGHUP 信号终止。所以跑长时间任务前,我习惯先用 tmux 开一个会话,把任务丢进去,然后即使 Tabby 标签页关掉,任务也还在服务器上跑着。
Tabby 自身还有个很实用的设置,在 Connection 的高级配置里可以开启自动重连机制。网络抖动导致连接断开后,它能自动尝试重新连接,省去手动重连的麻烦。
4. FTP/SFTP 传文件:从“能连上”到“能传进去”的排查笔记
4.1 SFTP 面板:SSH 连接自带的文件管理
这是 Tabby 最打动我的功能之一。SSH 连接建立之后,标签页左侧会出现一个文件夹图标,点开就是 SFTP 面板,直接展示当前用户目录下的文件。
右上角可以上传、下载、新建目录、重命名、删除,功能不花哨但很够用。我传安装包时直接在本地文件夹把文件拖进去,传输速度跑满带宽,不需要再单独开一个 FTP 客户端。
这个面板最大的价值是省掉了“重新配一个 FTP 账号”的过程:它直接复用当前 SSH 连接的认证信息,不用记第二套密码。
4.2 独立的 FTP/SFTP 连接配置
虽然 SFTP 面板覆盖了大多数场景,但有时候对方服务器只开了 FTP 服务(比如旧的 Windows FTP Server,或者某些嵌入式设备上的 FTP),Tabby 也支持配置独立 FTP 连接。
新建连接时选 FTP 类型,填主机、端口、用户名、密码即可。这里要提醒一点:FTP 协议默认是明文的,账号密码和数据传输都会被抓包看到。所以能用 SFTP 就不要用 FTP,如果对方只支持 FTP,尽量通过加密通道转发后再连。
4.3 “FTP 能登录但传不了文件”的真实排查案例
所有 FTP 问题里,最常见的就是“能登录、列表正常,一上传就报错”。我的排查思路是从下往上:
第一步查权限:FTP 登录之后所在的目录是不是对当前用户可写。很多时候用户能登录但主目录是/var/ftp,文件属主是 root,普通账号根本没有写权限。在服务器上执行ls -ld /目标目录看一眼权限位就知道了。
第二步查被动模式端口:FTP 默认有两个端口通道,21 端口用于控制命令,数据传输要么走主动模式(服务器连客户端高位端口),要么走被动模式(客户端连服务器高位端口)。如果服务器开了 21 端口但没放行被动模式端口段,就会出现“登录成功、列目录成功、传文件超时”的现象。解决方式是在防火墙放行 FTP 数据端口范围,或者把客户端设置改成主动模式试试。
第三步查 SELinux/系统防火墙:Linux 服务器如果启用了 SELinux,需要确认 FTP 相关布尔值是否放行;Windows 服务器则要去防火墙里确认“FTP Server”规则已启用。
4.4 “FTP 响应 501”是什么
热搜词里有“ftp响应501的原因和解决办法”。501 本身是 “Syntax error in parameters or arguments” 的缩写,在真实环境里,我遇到 501 的场景通常是:
- 客户端和服务器对 PASV 模式支持程度不一致,服务器无法正确解析客户端发出的
PASV或EPSV指令。 - 服务器传输端口超出了防火墙白名单,响应时给不出有效数据端口。
处理思路也不复杂:换被动/主动模式试一下,两边端口范围尺寸对齐,关闭中间设备的 FTP 协议过滤功能。
4.5 Windows 服务器 FTP 防火墙设置要点
跟 Windows 服务器打交道的同学大概率查过“windows服务器ftp防火墙设置”。核心要做两件事:
- 防火墙放行 TCP 21 端口,这个端口是 FTP 控制通道。
- 如果使用被动模式,还要放行你指定的被动端口范围(比如 TCP 30000-30100)。如果只放行 21 端口,客户端连上但数据传输时会被防火墙拦掉。
配置完可以在客户端测试一次。 一次登录 → 列目录 → 下载 → 上传全流程,全部通过才算完。
4.6 FTP 安全登录的正确方向
关于“ftp安全登录 ssh”:如果有人在搜这个词,大概率是意识到 FTP 明文传输的问题了。我的建议很直接:
- 首选 SFTP,它走 SSH 通道,复用 SSH 认证,数据全加密。
- 如果必须用 FTP,就上 FTPS(FTP over SSL/TLS),至少让控制通道和数据通道都加密。
- 永远不要在公网直接暴露明文 FTP 服务。如果 IT 环境允许,尽量隐藏端口并绑定访问来源。
5. RDP 远程桌面:用插件把 Windows 主机拉进同一个窗口
5.1 Tabby 的 RDP 能力从哪里来
Tabby 本身不带 RDP 协议实现,它通过插件机制接入。具体操作是打开设置 → Plugins,搜索 rdp,安装 RDP 插件之后,新建连接的类型里就会多出一个 RDP 选项。
这个功能本质是调用系统里的 FreeRDP 库来建立远程桌面会话。好处是界面统一:你不需要再打开 mstsc,直接在 Tabby 里就能看 Windows 桌面。
5.2 跨平台使用时的依赖问题
在 Windows 上装 RDP 插件比较简单,一般自带依赖。但 macOS 和 Linux 上需要确认 FreeRDP 是否可用:
- macOS:执行
brew install freerdp - Ubuntu/Debian:执行
sudo apt install freerdp2-x11 - 如果插件连接时报“failed to initialize”,首先检查这些底层依赖是否装好。
5.3 实际配置:从连通到顺手
新建 RDP 连接时,主要填这几个参数:
- Host:Windows 主机的 IP 或域名
- Port:默认 3389
- 用户名/密码:Windows 登录凭据
- 分辨率:可以设成窗口模式或者全屏模式,全屏时鼠标移到屏幕顶部会弹出连接工具条
- 高级设置里可以打开剪贴板共享、磁盘映射、打印机重定向
剪贴板共享对日常工作非常关键,我经常需要把服务器上的一段文本复制回本地,或者在本地写好配置再粘到远端。磁盘映射则是把本地目录直接映射到远程桌面里,省去“先传文件再拷贝”的步骤。
5.4 RDP not listening 的排查链路
热搜词里有“rdp not listening”,这个英文提示我猜来自某些扫描工具或 RDP 客户端,含义是远程主机 3389 端口没有响应。按下面的顺序排查:
- 确认 Windows 上是否开启了远程桌面:右键“此电脑” → 属性 → 远程桌面 → 确保“启用远程桌面”处于打开状态。
- 确认服务运行中:在 Windows 运行
services.msc,找到 “Remote Desktop Services” 和 “Remote Desktop Services UserMode Port Redirector”,确保状态是“正在运行”,启动类型是“自动”。 - 确认端口被监听:在 Windows 上执行
netstat -an | findstr 3389,如果没有任何结果,说明服务没起来或者端口被改过。 - 确认防火墙放行:入站规则里需要允许 TCP 3389,Windows 防火墙一般在启用远程桌面时会有弹窗提醒,但组策略或第三方安全软件可能把它拦掉。
5.5 关于 RDP Wrapper 这类工具的提醒
搜“rdp wrapper”的同学,多数是想让家庭版 Windows 支持多人同时远程登录。说实话,我用过一段时间,它在某些版本上确实能解锁多会话,但它和系统版本强相关,一旦 Windows 更新到了新版本,就很容易出现 “not supported” 的提示,导致整个远程桌面服务异常。
我的建议是:生产环境不要依赖这类工具。远程桌面多用户是商业版和服务器版的授权能力,用第三方 wrapper 去“解锁”,短期能用,长期只要一次系统更新就可能搞坏环境,而且这类工具本身也容易成为安全软件的怀疑对象。
如果你确实需要多用户远程登录,正确的路线是换到 Windows 专业版或 Windows Server。如果只是自己日常维护,单用户 RDP 在 Tabby 里已经完全够用了。
5.6 不在同一内网时的连接思路
如果你的 Windows 和本地电脑不在同一个局域网,RDP 默认是连不上的。我的做法是用内网穿透或组网工具把两端打通,让 Windows 主机在逻辑上变成内网里的一个 IP,然后在 Tabby 里填这个内网 IP 连接。
这类组网方案各有各的优缺点,关键点是选一个在你的网络环境下延迟低、稳定靠谱的,配置好之后把它当成虚拟内网用就行。安全方面要注意把 RDP 端口的访问范围限制在组网网段内,别直接暴露到公网。
6. 把它打磨成日常主力工作台:快捷键、配置同步与安全习惯
6.1 快捷键与窗口布局的自定义
Tabby 的快捷键基本都在设置里可以改,我把几个常用的改成自己最顺手的组合:
- 新建标签页:绑定到
Ctrl+T - 切换下一个/上一个标签:绑定到
Ctrl+Tab和Ctrl+Shift+Tab - 分栏:绑定到
Ctrl+Shift+任意方向键 - 关闭当前标签:绑定到
Ctrl+W
做到“手不离键盘”之后,日常打开多台机器的速度会快非常多。Tabby 的分栏比多标签更进一步,我习惯把一台应用服务器和一台数据库服务器分左右栏同时显示,排查问题的时候很有用。
6.2 用配置文件批量管理连接
如果你有两三百台机器,一个一个在界面上点“新建连接”会疯掉的。Tabby 的配置是 YAML 格式,可以直接编辑config.yaml。我维护的机器超过一定数量后,就写脚本生成连接配置。
节选一段结构示例:
profiles: - id: "web-prod-01" type: "ssh" name: "web-prod-01" host: "192.168.1.10" port: 22 username: "root" auth: type: "key" privateKey: "/Users/me/.ssh/id_ed25519" - id: "win-server-01" type: "rdp" name: "win-server-01" host: "192.168.1.20" port: 3389 username: "administrator"注意:直接在 YAML 里写密码是可以的,但我不建议这么做。更安全的做法是用密钥认证(SSH)或者配置系统钥匙串存储(RDP/密码)。批量生成时注意 id 不要重复。
每次改完配置文件需要重启 Tabby,或者用命令重新加载。所以更稳妥的流程是:本地写脚本生成 → 校验 YAML 格式 → 备份旧配置 → 覆盖新配置 → 重启 Tabby。
6.3 安全习惯:密钥、防爆破、日志
这台工具窗口是你所有机器的入口,安全习惯比工具本身更重要。我给自己定的规则是:
- 生产环境禁用密码登录 SSH:只允许密钥认证,密码登录是爆破攻击的重灾区。
- 改掉默认端口或加访问控制:SSH 如果暴露在公网,23 点左右会有大量扫描,我一般会把端口改到高位,或者用防火墙限制来源 IP。这不能彻底防住,但能过滤掉 90% 的脚本扫描。
- 开启 Tabby 的日志记录:设置里可以开会话日志,把每次操作记录存到本地。出问题的时候翻日志复盘,比靠脑子回忆强一万倍。
- 定期清理连接列表:不用了的旧机器、旧测试环境主动删掉,防止误连到已经废弃的服务器上执行命令。
6.4 与 VS Code Remote SSH 的配合
用 Tabby 做了大量命令行操作之后,真正写代码调试我还会配合 VS Code Remote SSH。这两者不冲突——Tabby 负责快速连接、传文件、日常运维,VS Code 负责在远程项目里写代码、看报错、断点调试。
热搜词里有个很常见的报错:“此扩展在此工作区中被禁用,因为其被定义为在远程扩展主机中运行”。这个问题通常发生在你本地的 VS Code 装了某些扩展,但该扩展只能在远程主机端安装。解决方法是在 VS Code 的扩展面板里找到这个扩展,点击“在远程主机上安装”,装好之后重新加载窗口即可。如果扩展版本冲突,先卸载再重装远程端版本。
密钥配置上,Tabby 和 VS Code Remote SSH 可以共用同一份~/.ssh/config和私钥。我在 Tabby 里测试好密钥没问题之后,VS Code 里选择 SSH Target 就能直接连上,两边互相不干扰。
6.5 我现在的打开方式
最后说一个我用了很久的工作流。早晨到工位,打开 Tabby,左侧分组里点开重要机器的连接,标签页自动恢复常态。查日志、改配置直接命令行;要传文件开 SFTP 面板;Windows 机器要操作就再开一个 RDP 标签。整个工作期间我只保持这一个主窗口,想找之前跑过什么命令,翻历史记录就行。
这套方案跑了很长时间,最大的体会是:工具不用多,关键是它能不能把你每天的重复动作压缩到最低。一个能同时承载 SSH、FTP、RDP 的窗口,配合好的密钥管理和文件面板,真的会让日常运维轻松很多。