多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Tabby SSH 远程登录全流程:密钥、跳板机与 SFTP 实战

Tabby SSH 远程登录全流程:密钥、跳板机与 SFTP 实战 用 Tabby 做服务器远程 SSH 登录这件事我前后折腾了差不多两个月才把它固化进每天的工作流里。最早我用的是 PuTTY 加一堆 .ppk 文件后来换到 Xshell再后来又试过系统自带的 ssh 命令行能用但每次要连十几台机器的时候那种“会话散落在各个窗口、配色不统一、密钥要手动指、传文件还得另开一个工具”的别扭感一直没解决。Tabby 算是把这几个痛点一次收走了它是一个跨平台的终端工具原名 Terminus内置 SSH 客户端、连接配置管理、SFTP 文件面板和多标签分屏Windows、macOS、Linux 都能装。这篇文章我打算把“用 Tabby 做远程登录”这条链路从头到尾讲透——怎么下载安装、怎么配密码登录、怎么做密钥免密、怎么用跳板机连内网、怎么传文件、出问题怎么排查。不管你是刚买第一台云服务器的新手还是每天要维护几十台机器的运维看完都能直接抄作业。1. 为什么值得为 SSH 换一个终端工具1.1 传统 SSH 工具的三种典型痛点先说清楚我为什么换。第一种是 PuTTY 这种老牌工具功能没问题但它的会话管理是“每个会话一个注册表项 一个 .ppk 密钥文件”换电脑就要重新配一遍配置导出还是注册表格式迁移起来非常别扭。第二种是系统自带的ssh命令优势是轻、脚本化友好缺点是没有任何可视化的会话列表连十台机器就得记住十个别名密钥、端口、跳板参数全塞进~/.ssh/config新手一看就晕。第三种是各种 IDE 内置的远程终端比如编辑器里带的远程开发功能它更适合改代码但你真要在上面跑个top、看个日志轮转、做一次磁盘扩容体验就有点勉强了。我自己的判断标准很朴素一个合格的 SSH 工具应该让“打开一台服务器”这个动作的成本趋近于零。理想状态是打开软件、点一下、进去了中间不需要回忆 IP、不需要翻密码本、不需要确认密钥路径。Tabby 在这件事上做得比较彻底它的连接配置是一个可视化的列表支持分组、支持搜索、支持一键导入~/.ssh/config点两下就能进去。1.2 Tabby 的定位终端模拟器 连接管理器需要澄清一个概念Tabby 不是 SSH 协议的实现者它本质是一个终端模拟器底层调用的还是系统或它内置的 SSH 客户端库。也就是说你电脑上该有的 SSH 能力它一样要有Tabby 负责的是把这些能力包装成一个好用的界面。它支持本地 Shellcmd、PowerShell、bash、zsh、SSH、Telnet、串口连接还能通过插件扩展功能。这个定位决定了它的两个优势。第一本地终端和远程终端在同一个窗口、同一套快捷键、同一套配色里切换成本极低。第二所有的连接配置都落在一个 YAML 文件里可以备份、可以版本管理、可以跟着你换电脑走。对我这种经常重装系统的人来说配置能带走这件事的价值远超想象。1.3 它适合谁不适合谁它适合三类人。一是需要管理多台服务器的人比如手里有测试、预发、生产好几套环境二是同时用 Windows 和 macOS、希望两个平台体验一致的人三是喜欢折腾外观和插件、愿意花半小时调教工具的人。它不太适合两类人。一是完全靠脚本和 CI 完成部署、几乎不手动登服务器的团队那用ssh命令加配置文件就够了装个 GUI 反而多余。二是机器配置很低、或者对启动速度极其敏感的人Tabby 基于 Electron冷启动一般在一秒到三秒之间比原生终端慢一点这是它目前绕不开的取舍。2. 下载安装与环境准备把第一步走稳2.1 各平台安装包怎么拿Tabby 的分发渠道挺多我按平台整理一下都是我自己实测过的路径。平台推荐方式具体命令或来源Windows包管理器winget install Tabby或scoop install tabbyWindows安装包官网和 GitHub Releases 下载.exemacOSHomebrewbrew install --cask tabbyUbuntu / Debiandeb 包下载.deb后sudo dpkg -i安装通用 LinuxAppImage下载后chmod x直接运行我个人的偏好是Windows 用wingetmacOS 用 Homebrew因为后续升级一条命令就搞定不用每次去手动下载新版本。Linux 桌面环境我一般直接用.deb省得处理 AppImage 的桌面图标。注意从非官方渠道下载的安装包风险很高尤其是搜索“tabby下载”时排在前面的那些下载站经常捆绑别的东西。认准官网和 GitHub Releases这两个渠道就够用了。2.2 关于“有没有手机版”这个问题搜“tabby 有安卓版吗”的人不少我直接说结论官方没有 Android 版本Tabby 目前的定位是桌面端工具。如果你确实需要在手机上连服务器那是另一个赛道的问题桌面端的配置管理逻辑在手机上也不成立。所以别在这件事上纠结手机临时用的话系统自带的终端 App 加密钥就够了。2.3 首次启动要做的四件事安装完第一次打开别急着连服务器先把基础体验调好后面会省很多事。第一切换中文界面。设置里的语言选项支持简体中文切完之后菜单可读性会好很多。第二设定默认 Shell。Windows 上默认可能是 cmd我一般改成 PowerShell 7 或者 Git BashmacOS 和 Linux 保持 zsh 或 bash 即可。第三调字体和字号。等宽字体是必须的推荐 JetBrains Mono、Cascadia Code 或者 Fira Code字号我习惯 14看日志不累。第四打开配置文件的所在目录确认一下方便以后备份# Windows %APPDATA%\tabby\config.yaml # macOS ~/Library/Application Support/tabby/config.yaml # Linux ~/.config/tabby/config.yaml确认完这四件事工具本身就算“驯服”了接下来才是真正的重头戏连服务器。3. SSH 连接配置从密码登录到密钥免密3.1 新建一个 SSH 连接的完整参数填写点击左侧的“配置与连接”选“新建”类型选 SSH会出现一堆字段。很多人第一次看会懵我把每个字段的含义和我一般填什么列出来。字段含义建议填法名称会话显示名用“环境-用途”格式如prod-web-01主机服务器地址填 IP 或域名端口SSH 端口默认 22改过就填实际值用户名登录账号如root、ubuntu、deploy认证方式密码或密钥生产环境一律用密钥私钥密钥文件路径指向~/.ssh/id_ed25519分组会话归类按环境分测试、预发、生产颜色标签页配色生产环境我固定用红色防手滑这个“颜色”字段看着不起眼实际上是保命的。我给自己定的规矩是生产环境标签页一律红色测试环境蓝色本地绿色。有一次半夜改配置就是靠这个颜色反应过来自己点错了标签页避免了一次事故。注意密码认证虽然方便但几乎所有主流云厂商的默认镜像都建议关闭密码登录。密码存着方便的同时也意味着任何拿到你电脑的人都能直连服务器。养成密钥登录的习惯长期收益远大于那点初期麻烦。3.2 生成密钥对与公钥上传密钥登录的原理很简单你本地持有一把私钥服务器上存着对应的公钥登录时服务器发一段随机挑战你用私钥签名服务器用公钥验证。私钥永远不出本地所以比密码安全得多。第一步本地生成密钥对。推荐用 Ed25519比 RSA 短、比 RSA 快ssh-keygen -t ed25519 -C your_emailexample.com回车后会问你保存路径默认~/.ssh/id_ed25519就行然后问你要不要设 passphrase我建议设一个——这样即使私钥文件被拷走没有口令也用不了。设了口令之后配合系统的密钥管理或 Tabby 内置的加密存储日常使用并不会变麻烦。第二步把公钥传到服务器# 最省事的做法 ssh-copy-id -i ~/.ssh/id_ed25519.pub userhost # 如果系统没有 ssh-copy-id手动追加 cat ~/.ssh/id_ed25519.pub | ssh userhost mkdir -p ~/.ssh chmod 700 ~/.ssh cat ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys这两行里最容易出问题的就是权限。SSH 对权限很敏感~/.ssh必须是 700authorized_keys必须是 600~家目录不能是组可写。我见过太多次“明明公钥传上去了就是登不上”的案例最后都是权限问题。注意私钥文件本地的权限也要对Linux 和 macOS 下必须是 600。Windows 下权限模型不同一般不用管但如果你用 WSL 或者 Git Bash一样要chmod 600。第三步在 Tabby 里把连接的认证方式改成密钥指到私钥路径保存点连接。如果一切正常你会直接进到服务器。第一次登录会弹出一个主机指纹确认框核对一下指纹再点接受这个后面还会细说。3.3 用 config 文件管理多台服务器当服务器超过五台我建议不要再手工在 Tabby 里一台台加而是维护一份~/.ssh/config然后让 Tabby 导入。这样做的好处是这份配置同时能被命令行 ssh、Git、rsync、编辑器的远程功能共用一处维护多处受益。# ~/.ssh/config Host prod-web-01 HostName 203.0.113.10 User deploy Port 22 IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60 ServerAliveCountMax 3 Host test-db HostName 10.0.1.21 User ubuntu IdentityFile ~/.ssh/id_ed25519 ProxyJump bastion这份配置里有几个参数值得说。ServerAliveInterval 60表示每 60 秒给服务器发一次探测包配合ServerAliveCountMax 3可以在网络抖动时主动断开而不是僵死比默认行为优秀得多。ProxyJump bastion是跳板机配置后面单独讲。Tabby 支持直接导入~/.ssh/config导入后每个 Host 会变成一条独立的连接配置双击即可使用。我现在的做法是所有连接都写在 config 文件里Tabby 只负责“打开”这件事配置本身完全脱离工具换工具也不心疼。4. 高频场景实操跳板、转发、批量与传文件4.1 通过跳板机连内网服务器公司内网服务器通常不开放公网必须先登跳板机再跳进去。这件事用 Tabby 有两种做法。第一种是刚才提到的ProxyJump写在 config 里用起来和直连完全一样Host bastion HostName 198.51.100.5 User ops IdentityFile ~/.ssh/id_ed25519 Host inner-app-01 HostName 10.0.2.30 User app ProxyJump bastion第二种是在 Tabby 的连接设置里找到“跳板机”相关的选项把前置连接配好逻辑和ProxyJump一样都是让 SSH 在本地和跳板机之间建一条链路再在这条链路里转发到目标主机。这里有一个我踩过的坑值得分享跳板机的公钥和目标的公钥是两回事。有时候你能登跳板机但跳不过去八成是目标机上的authorized_keys没有你本地那把公钥或者目标机的sshd_config里AllowUsers没包含你的账号。排查的时候记得分开验证不要一股脑怀疑网络。4.2 端口转发把远端服务映射到本地这一块是很多人忽略但极其好用的功能。典型场景是远程服务器上跑着一个只监听127.0.0.1的数据库或者一个内部后台面板你不想对外暴露端口但又需要在本地访问。本地转发把远端端口拉到本地的配置逻辑是# 命令行等价写法方便理解 ssh -L 13306:127.0.0.1:3306 userremote-host含义是本地监听13306所有连接通过 SSH 链路转发到remote-host视角下的127.0.0.1:3306。配好之后你在本地用数据库客户端连127.0.0.1:13306就等于连上了远程那台机器上的 MySQL。这样做的最大好处是数据库端口完全不用对公网开放安全边界收得更紧。反向转发把本地端口推到远端则适合另一种场景你在本地开发一个服务部署测试的同学需要访问但你的机器在内网没有公网 IP。ssh -R 18080:127.0.0.1:8080 usertest-server这条命令让测试服务器上的18080指向你本机8080。同事访问测试服务器的 18080实际打到你本地的开发服务上。临时联调的时候非常好用用完关掉即可不留痕迹。Tabby 的连接设置里有转发端口的管理面板可以配置多条转发规则连上之后自动生效不用每次手敲命令。我的习惯是把常用的几条转发规则写在对应会话里比如“测试环境数据库”“预发环境后台”连上就是可用状态。4.3 多标签、分屏与批量登录多标签是基础能力就不多说了重点说说分屏。我排查线上问题时经常需要同时看三样东西应用日志、top输出、以及 Nginx 的错误日志。用分屏一次性铺开比开三个窗口切来切去高效太多。Tabby 支持横向和纵向分屏快捷键可以在设置里自己定义我一般映射成自己顺手的两组键。批量登录这个需求说实话 Tabby 本身没有“一键连十台机”的开关但可以绕开把所有机器的连接配置放进同一个分组打开分组后按住多选一次打开多个标签页。更稳妥的做法是脚本化比如把一批机器写进文件用循环逐个执行命令#!/bin/bash # batch_check.sh for host in $(cat hosts.txt); do echo $host ssh -o ConnectTimeout5 -o BatchModeyes $host uptime; df -h / | tail -1 done这里的BatchModeyes会在密钥登录失败时直接报错而不是卡在密码提示上做批量操作时非常关键否则脚本会挂死在那里。ConnectTimeout5则是给每台机器设一个上限避免个别不可达的机器拖垮整个循环。4.4 上传下载文件Tabby 内置了 SFTP 面板SSH 会话连上之后在侧边栏或者标签上能找到文件传输入口打开就是一个双栏视图左边本地、右边远端拖拽即可上传下载。这对偶尔传个配置文件的场景足够了比开另一个工具省事。但大文件或者大量小文件我还是建议走命令行。原因很直接命令行能看进度、能断点续传、能加压缩。比如传一个几万个小文件的目录打包再传通常比直接递归传快好几倍# 远端打包本地接收 ssh userhost tar czf - -C /var/www app app.tar.gz # 本地打包推上去 tar czf - -C ./dist . | ssh userhost tar xzf - -C /var/www/app这两行的思路是数据不落地成中间临时文件直接用管道穿过 SSH端到端加密。数据量大的时候能省不少磁盘 IO。注意长时间执行的命令一定要挂后台否则 SSH 一断命令就跟着被终止了。两个常用手段nohup command 或者tmux/screen起一个会话。我个人的习惯是凡是超过一分钟的任务一律先起 tmux这样断线重连后还能回到原来的现场。5. 常见问题与排查技巧实录5.1 连接类问题速查表我把这些年遇到的问题整理成一张表出现症状先在这张表里对一对能省掉大量试错时间。症状大概率原因处理方式Connection refusedSSH 服务没起或端口不对检查sshd服务状态、确认监听端口Connection timed out防火墙或安全组没放行检查云厂商安全组和本机防火墙规则Permission denied (publickey)公钥没传对或权限错检查~/.ssh700、authorized_keys600Host key verification failed服务器重装或指纹变更清理known_hosts中对应条目后重连ssh: command not found系统没装 SSH 客户端安装 OpenSSH 客户端或其替代实现连上就断会话超时或资源限制加ServerAliveInterval检查服务端限制中文显示成方块字符集不匹配统一 UTF-8检查服务端 locale日志里出现^M文件换行符是 CRLF用dos2unix转换或编辑器改换行符拿“新装 Ubuntu 连不上”举例最常见的原因就是默认没装 SSH 服务端。很多人以为自己网络有问题其实是服务器根本没监听。登录控制台执行sudo apt install openssh-server sudo systemctl enable --now ssh就好了。步骤很简单但没经历过的人能在网络排查上耗掉一晚上。再看Host key verification failed这个报错的本质是服务器的主机公钥变了而你的本地记录还是旧的。变的原因可能是重装系统、换了机器、或者集群做了迁移。处理方式是删掉本地记录里对应的那一条再重新连接并核对新指纹。这里我要强调一点核对指纹这件事不能省。指纹不匹配在极少数情况下意味着中间有人插入直接无脑接受等于把这层保护关掉了。5.2 千奇百怪的小坑合集坑一命令执行到一半断网命令还在跑吗这取决于命令是否在会话的前台。SSH 断开的瞬间前台进程会收到挂断信号并被终止。所以长任务必须挂后台。但“挂后台”也有讲究后面如果终端关闭进程仍可能收到信号稳妥写法是nohup ... 或者直接扔进tmux。判断任务是否还在跑重新连上后ps -ef | grep一下最直接。坑二分不清ssh和工具内置客户端的行为差异。Tabby 有些版本会用自己内置的 SSH 实现有些场景下会走系统的ssh。这两者在算法协商、密钥加载上可能有细微差别。如果你遇到某个服务器用命令行能连、用 Tabby 连不上可以先在 Tabby 的日志面板里打开详细输出对比一下协商过程。命令行侧的ssh -vvv userhost也能打印完整协商日志两边一起看问题基本藏不住。坑三生产环境手抖。前面提到的标签页颜色是一个手段还有一个更狠的在生产会话里设置一个醒目的背景色或者加一条Banner提示。有些团队还会在登录时强制打印一段警示文字。这些都不影响功能但对降低误操作率很有效。坑四Windows 上的 PowerShell 回车换行。如果你在 Windows 上写脚本推到 Linux 执行经常报奇怪的语法错误多半是 CRLF 惹的祸。养成习惯Git 配置core.autocrlf或者直接让编辑器保存为 LF。5.3 排查的通用思路我自己的排查顺序固定为四步先看能不能通、再看能不能认、再看能不能登、最后看登进去对不对。“能不能通”用ping和telnet host port判断注意云服务器很多禁 ICMP所以 ping 不通不代表有问题端口通才是硬指标。“能不能认”是看指纹和密钥协商前面说过。“能不能登”看的是认证公钥权限、密码、账号状态都在这一层。“登进去对不对”则是登录成功后的问题比如环境变量没加载、目录不对、权限不足。把问题按这四层拆开你会发现绝大部分故障都能在五分钟内定位到某一层剩下的就是查这一层的具体原因而不是漫无目的地瞎试。6. 配置备份与进阶玩法6.1 让配置跟着你走Tabby 的配置全在一个 YAML 文件里这意味着你可以直接把它放进版本管理。我的做法是建一个私有仓库把config.yaml提交进去换电脑时 clone 下来放到对应路径重启 Tabby 就是完整的工作环境。这里要注意一点配置里可能包含主机地址、用户名等信息别往公开仓库推。如果需要更自动的方式Tabby 设置里有配置同步功能可以同步到云端存储适合不想手动折腾的人。6.2 插件怎么挑Tabby 的插件生态是它的加分项。我常用的几个方向给你参考一是输出保存类能把终端输出直接存成文件排查问题时很方便二是链接识别类日志里的 URL 和文件路径可以点击跳转三是快捷键增强类可以自定义组合键提高操作效率。装插件的原则是“缺什么补什么”不要一次装十几个插件多了会拖慢启动还会互相干扰。6.3 和编辑器远程开发配合如果你平时用编辑器做远程开发Tabby 和它其实不冲突甚至可以互补。我的习惯是编辑器负责写代码和调试Tabby 负责跑命令、看日志、传文件。两者用的是同一份~/.ssh/config配置只需要维护一次。需要注意的一点是编辑器里的一些功能扩展可能只在本地生效在远程工作区里会被禁用这是它的运行机制决定的不是配置错了。遇到这种情况把需要在远端跑的操作放到 Tabby 里做分工清楚反而更顺。6.4 几个我经常用的快捷键思路与其抄别人的键位不如按自己的操作频次来排。我把“新建标签”“关闭标签”“切到上一个标签”“水平分屏”“竖直分屏”“复制粘贴”这六个动作定义为最高频全部映射到左手单手可及的位置。这样做的收益是长时间操作手腕不容易累而且不用回头看键盘。另外复制粘贴在终端工具里通常和系统默认不一样常见的是加 Shift 修饰第一次用容易懵建议一上手就在设置里改成自己熟悉的方式。7. 一些实测下来的个人体会说了这么多操作层面的东西最后聊几句我自己的感受。Tabby 最让我满意的一点不是某个具体功能而是它把“连接”这件事从一堆散落的命令行参数变成了一个可以整理、可以分组、可以备份的对象。以前我换一台新电脑光是恢复开发环境就要花半天现在 clone 一个仓库、放一份配置、装几个插件二十分钟就能进入状态。它的不足也很明显。Electron 带来的资源占用是客观存在的内存吃得多、冷启动慢在配置差的机器上体验会打折。所以我一般会建议如果你的日常工作就是登一两台机器、跑几条命令系统自带的终端加一份~/.ssh/config完全够用没必要为了好看装个 GUI。但如果你像我一样每天要在十几台机器之间来回横跳还要经常传文件、开分屏对照日志那花半个小时把 Tabby 调教好回报是实打实的。还有一个经验值得单独拿出来说把密钥当资产来管理。我现在的做法是每台设备一把独立密钥公钥统一登记离职或者机器丢失时只吊销对应那一把不影响其他设备。这件事听起来麻烦但真到需要的时候你会庆幸自己当初做了区分。工具只是壳真正决定安全边界的永远是你对密钥、权限和配置的管理方式。
返回列表