SSH免密登录与Windows Terminal配置:打造一键连接服务器的终极工作流

发布时间:2026/9/13 2:01:04
SSH免密登录与Windows Terminal配置:打造一键连接服务器的终极工作流 如果你的日常是像我一样每天要在十几台Linux服务器之间切换部署、查日志、改配置那你一定经历过这样的时刻打开终端工具选中一台机器输入密码回车——再选中下一台输入密码回车……一天重复几十次。明明只有几台常用机器明明密码复杂到只有密码管理器才记得住可就是绕不开这一步。后来我花了一个晚上折腾SSH密钥认证配合Windows Terminal的配置文件把所有常用服务器做成了下拉菜单里的一个人性化入口点一下名称一个新标签页弹出来人已经静静停在目标机器的shell里。整个过程不需要输入任何东西比Xshell、Putty那套舒服太多。这篇文章我会从零讲清楚两件事SSH免密的原理到底是什么以及如何用Windows Terminal把这套能力固化下来。不预设你有多少基础但会尽量给到可以直接抄作业的配置和命令。适合每天跟服务器打交道的后端、运维、SRE也适合刚入行但想把工作流收拾利索的Linux新手。1. 为什么我要把SSH客户端从Xshell迁到Windows Terminal1.1 工具选择的转折点先说结论Xshell和Putty都能做SSH免密但体验完全不在一个量级。我用了很久的Xshell个人版。它能保存会话也能记住密码配合密钥也能做到一键连接这没什么问题。但真正让我厌烦的是另外几件事多标签管理不够顺滑主题和字体审美还停留在十年前配置文件搬家麻烦另外个人版在商业环境有授权风险。Putty就更别提了会话管理靠手工保存注册表界面粗粝每次打开都是一副能用但不想多看一眼的样子。真正让我动心的是Windows Terminal。微软从2019年开始把它做成了Windows平台的默认终端开源、免费、支持GPU加速渲染、多标签页、分割窗格、自定义主题和快捷键。最关键的是它本质上不绑定任何SSH功能——它只是一个终端模拟器你可以往里塞任何命令行程序。所以SSH自动登录这个需求在Windows Terminal里并不是一个内置按钮而是通过配置文件里新增一个启动项来实现的每次点这个启动项就等同于在终端里手动敲下一条ssh userhost命令。理解了这层关系你会发现Windows Terminal做免密登录其实是白嫖了OpenSSH客户端的能力自己只负责把命令执行得漂漂亮亮。1.2 免密的本质密钥认证不是记住密码很多人在这一步会有一个误区以为所谓免密登录是终端工具悄悄把密码存起来了登录时自动帮你填进去。不是。真正推荐、也真正安全的方式是改用SSH密钥认证。你本地持有私钥服务器持有公钥登录时用一套非对称加密的握手过程来证明你确实持有对应的私钥整个过程不需要传输密码也不需要在本地保存任何密码。好处是密码永远不会暴露在网络上没有抓包泄露的问题私钥可以设置口令passphrase即使文件被拷走没有口令也解不开服务器端可以彻底关闭密码登录只允许密钥登录大幅降低被暴力破解的风险Windows Terminal在其中的角色只是一个触发器它负责打开一个新标签页、执行一条SSH连接命令。真正完成免密验证的是OpenSSH客户端和服务器之间的密钥协商。所以接下来我们绕不开原理至少要理解个大概否则后面遇到各种诡异的报错会一头雾水。2. SSH免密登录的原理解读2.1 非对称加密的日常类比要理解SSH密钥认证得先理解非对称加密。听起来高大上其实可以拿信箱打比方。想象我有一个信箱任何人都可以往里面投信但只有我手里的钥匙能打开。这个信箱相当于公钥——可以随便分发钥匙相当于私钥——只能自己持有。服务器怎么确认我的身份呢流程是这样服务器生成一个随机数用我的公钥把它锁进信箱然后问我你猜里面是什么我用自己的私钥打开信箱读出这个随机数回给服务器。服务器一比对发现完全正确于是认定对面这个人确实持有与该公钥配对的私钥。这套逻辑的精髓在于私钥永远不离开本地它只用来解一个服务器发来的挑战题。就算网络里有窃听者也只会看到密文和答案无法倒推出私钥。2.2 密钥认证的三个关键阶段在实际的SSH握手过程里密钥认证可以粗分为三个阶段传输层协商客户端与服务器协商协议版本、加密算法、压缩算法并建立一条加密信道。这部分会用到服务端的主机密钥就是首次连接问你的那个host key用来防止中间人攻击。用户认证在加密信道之上客户端对服务器说我想以用户deploy的身份登录然后服务器发起挑战用deploy用户家目录~/.ssh/authorized_keys文件里保存的公钥加密一段随机数。客户端必须用对应的私钥解出这段随机数并返回。解密成功认证通过。会话建立认证通过后双方开始交互终端指令和输出都走前面建立好的加密信道。理解这三步后面所有排查都有方向了连不上看网络和host key认证失败看密钥和authorized_keys进去了卡住再看会话配置。2.3 常用密钥算法怎么选生成密钥时最常见的选项是rsa、ecdsa、ed25519三种。算法优势劣势建议RSA兼容性最好几乎所有SSH实现都支持位数要求越来越高2048位勉强4096位偏慢老设备多时选这个ECDSA密钥短、速度快依赖曲线参数部分实现有侧信道风险一般不建议ED25519现代方案速度快、密钥短、安全性强OpenSSH 6.5原生支持极老设备不支持新环境首选我自己主用ed25519遇到个别老交换机、老Unix系统不认再单独生成一把RSA 4096备用。两种情况并存没毛病服务器上authorized_keys里可以放多把公钥。3. 密钥生成与公钥部署完整步骤3.1 确认本机OpenSSH Client可用Windows 10 1809之后的系统默认在可选功能里装好了OpenSSH Client命令是ssh。验证方法最干脆打开PowerShell或Windows Terminal敲ssh -V如果输出类似OpenSSH_for_Windows_9.x这样的版本号说明客户端已经可用。如果提示找不到命令去设置 → 应用 → 可选功能 → 添加可选功能里搜索并安装OpenSSH 客户端。装完重新开一个终端窗口再验证一次。3.2 生成密钥对ed25519在Windows Terminal里执行ssh-keygen -t ed25519 -C lenovo-work-laptop-C后面是注释建议写成能让你识别出这是哪台机器、给谁用的字符串。接下来会有两次提问私钥保存位置默认是C:\Users\你的用户名\.ssh\id_ed25519直接回车即可是否设置passphrase私钥口令这个可以留空也可以设置关于passphrase我的建议是设置一个然后配合ssh-agent使用。原因后面安全章节细说。如果你现在只想快速跑通可以先留空但至少要知道这一步可以填。生成完成后在.ssh目录下会看到两个文件id_ed25519私钥绝对不能外传id_ed25519.pub公钥可以安全地放到任何目标服务器上3.3 把公钥安全地送到服务器目标服务器上需要把公钥追加到对应用户的~/.ssh/authorized_keys文件里。Windows没有内置ssh-copy-id但有更直接的摸法。假设目标服务器IP是192.168.1.101用户名是deploy在PowerShell里执行type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy192.168.1.101 mkdir -p ~/.ssh cat ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys这个命令做的事情是把本地公钥内容通过管道传给远程服务器的一条shell命令远程在用户家目录创建.ssh目录如果不存在把公钥追加到authorized_keys然后把目录和文件的权限收敛到合理范围。如果管道方式在你的环境里偶尔抽风也可以用更稳妥的两步法scp $env:USERPROFILE\.ssh\id_ed25519.pub deploy192.168.1.101:~/ ssh deploy192.168.1.101 mkdir -p ~/.ssh cat ~/id_ed25519.pub ~/.ssh/authorized_keys rm ~/id_ed25519.pub chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys这一步会要求你输入一次密码这是整个过程中最后一次手动输密码。3.4 部署后的第一轮验证公钥放上去后先别急着配置Windows Terminal先裸连一次ssh deploy192.168.1.101如果是第一次连这台服务器会看到host key确认提示输入yes回车如果部署成功不再要密码直接进入服务器shell如果仍然要密码或者报错先别往下走直接跳到第5章排查这一轮验证极其重要。只有裸连已经免密了后面Windows Terminal才可能实现打开就进去的效果。顺序反过来的话你根本分不清是Windows Terminal配置问题还是密钥部署问题。4. Windows Terminal建立自动登录配置4.1 认识settings.jsonWindows Terminal的配置核心是一个JSON文件settings.json。打开方式有两种快捷键Ctrl ,打开设置界面然后点左下角的打开JSON文件或者直接在文件资源管理器地址栏输入%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json不同版本路径有差异最稳的还是从设置界面点打开JSON文件。settings.json的内容很长但我们只需要关注profiles.list数组。Windows Terminal的启动项全部在这个数组里每增一项就是一个新的下拉菜单入口。你可以把list里的每一项理解成一种终端会话模板它能执行任意命令当然也包括ssh。4.2 新增一个SSH自动登录profile打开settings.json找到profiles下的list在里面追加一个对象。最简单有效的配置如下{ name: Dev-Web, commandline: ssh deploy192.168.1.101, tabTitle: Dev-Web, hidden: false }字段说明name显示在下拉菜单里的名称commandline打开这个profile时实际执行的命令。默认我不写-i参数因为OpenSSH会自动使用当前用户名默认路径下的私钥tabTitle打开后标签页上显示的名字默认会用ssh进程带的参数但显式写出来更可控hidden设为false才会出现在下拉菜单里保存文件后Windows Terminal一般会自动重载配置。点击标签栏右侧的下拉箭头就能看到新增的Dev-Web入口。点一下新标签页会启动执行ssh deploy192.168.1.101配合我们前面部署好的密钥你直接落在服务器上。4.3 多服务器、多环境配置示例我管着开发、测试、生产好几组机器样式类似下面这样{ name: Dev-Web, commandline: ssh deploy192.168.1.101, tabTitle: Dev Web, hidden: false }, { name: Prod-DB, commandline: ssh -i C:\\Users\\me\\.ssh\\id_ed25519 dbadmin10.0.0.22, tabTitle: Prod DB, hidden: false }多个profile之间用逗号分隔。注意JSON里反斜杠要写成\\Windows路径尤其容易在这里翻车。如果你的名字带有特殊字符或者默认私钥不在默认位置用-i参数显式指定私钥路径比如上面Prod-DB的例子。对我来说默认私钥足够所以一般只在特殊机器上才显式-i。另外还有一个小技巧ssh命令支持读取~/.ssh/config文件里的主机别名。你可以在该文件里写上Host dev-web HostName 192.168.1.101 User deploy IdentityFile ~/.ssh/id_ed25519然后把Windows Terminal的commandline简化成ssh dev-web。这个方式的好处是VSCode的Remote-SSH、git命令、rsync等工具全都能共享同一套主机配置不用为每个工具单独维护一份服务器列表。4.4 让配置更顺手的小技巧有几个细节值得一说都是我用了很久之后才发现好用的第一设置默认启动项。在settings.json的全局配置里找到defaultProfile字段改成你常用profile的名称这样打开Windows Terminal直接进入那台机器连下拉都不用点。第二调节视觉和字体。在defaults里可以统一设置字体、字号、背景透明度defaults: { fontFace: Cascadia Code, fontSize: 11, useAcrylic: true, opacity: 90 }第三多台机器同时管理。按住Ctrl点选多个profile可以展开为多个标签页。配合Windows Terminal的splitPane功能左边窗格连开发机右边窗格连生产库视觉上非常清爽。第四登录后自动进入目标目录。如果你希望SSH登录后直接切到某个工作目录可以改一下commandlinecommandline: ssh -t deploy192.168.1.101 \cd /work/project bash\-t参数强制分配伪终端这样远程的bash才能正常交互。这条命令的效果是登录即进入/work/project目录。5. 实战排错自动登录失败的几大原因Windows Terminal本身只是个终端模拟器所以它很少是问题源头。绝大多数失败都出在SSH密钥和服务器配置上。这里把踩过的坑按出现频率排个序。5.1 本地私钥权限过大这是Windows上最容易踩的坑没有之一。OpenSSH for Windows延续了Unix的严格安全习惯私钥文件如果允许其他用户读取它就直接拒绝使用。报错长这样Bad permissions. Try removing permissions for others on the file C:\Users\me\.ssh\id_ed25519.解决办法在PowerShell里执行icacls $env:USERPROFILE\.ssh\id_ed25519 /inheritance:r /grant:r $env:USERNAME:F这条命令的作用是移除该文件的所有继承权限然后只给当前用户完全控制权。执行后再试连接一般就恢复正常了。如果你手动在图形界面改权限也可以右键私钥文件 → 属性 → 安全 → 高级 → 禁用继承 → 删除所有用户 → 添加当前用户并给完全控制。命令行更快建议记下来。5.2 首次连接host key确认每台服务器首次连接时OpenSSH都会询问是否信任这台机器的host keyThe authenticity of host 192.168.1.101 cant be established. Are you sure you want to continue connecting (yes/no)?输入yes后host key会写入本地known_hosts文件后续连接不会再问。如果服务器的SSH服务重装过、host key变了会收到WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!这其实是一个敏感的安全信号理论上要确认服务器没被劫持。确认服务器确实是自己重装过系统执行下面命令清掉旧记录ssh-keygen -R 192.168.1.101然后重新连接再信任一次新的host key。这里建议不要为了省事直接删known_hosts文件只删有问题的那条记录更安全。如果想批量预置可以先用ssh-keyscan把主机指纹提前追加到known_hosts这样第一次连接也不会问适合大量机器批量配置的场景。5.3 服务器端权限与配置问题部署完公钥仍然要密码十有八九是以下问题之一第一种远程目录权限不对。SSH对家目录权限有要求~/.ssh必须是700authorized_keys必须是600多人可写比如设置为777就会拒绝使用。用下面的命令修正chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys第二种authorized_keys内容格式错误。很多次我把公钥手抖复制成了多行或者中间多了回车、注释都会导致认证失败。确认内容应该是一行完整的ssh-ed25519 AAAA... 注释格式。第三种sshd_config没开启公钥认证。检查/etc/ssh/sshd_configPubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys修改后重启sudo systemctl restart sshd第四种SELinux拦路。在CentOS、RHEL、Rocky这类系统上即使权限正确SELinux也可能拒绝SSH读取authorized_keys。执行以下命令恢复上下文restorecon -Rv ~/.ssh5.4 一条诊断命令串起定位思路当你走到这一步还没搞定建议用ssh -v跑一次详细日志所有问题都会现出原形ssh -v deploy192.168.1.101输出里重点看几行内容Offering public key: ...客户端是否尝试发送你的公钥Authentications that can continue: ...服务器还接受哪些认证方式Permission denied (publickey,password)最终拒绝说明密钥协商失败问题基本在服务端公钥存放或命令行权限上用-v输出对照前面提到的权限问题90%的情况都能定位。剩下10%请检查网络安全组是否放通了22端口以及服务器防火墙firewall-cmd --list-all或ufw status是否放行。6. 安全加固与进阶玩法6.1 私钥加密与ssh-agent前面提到passphrase可以留空快速跑通但生产环境强烈建议给私钥设置口令。设置了口令后每次SSH连接都会先问口令这好像又回到了输入密码的老路。解法是让ssh-agent帮你记。Windows其实自带这个服务只是默认没启动。用管理员身份运行PowerShellSet-Service ssh-agent -StartupType Automatic Start-Service ssh-agent ssh-add $env:USERPROFILE\.ssh\id_ed25519ssh-add执行时会让你输入一次passphrase之后私钥就待在内存里的ssh-agent进程中。后续所有SSH连接只要机器不重启都不再询问口令。Windows Terminal那边什么都不用改直接点profile就能免密进入服务器。这个方案的优雅之处在于私钥在磁盘上是加密的在内存里才解密就算有人偷走文件没有passphrase也白搭。而密码登录那种方式密码要么记在终端工具里要么每次手动敲暴露面大得多。6.2 服务器安全加固密钥认证跑通后建议择机在服务器上关闭密码登录# /etc/ssh/sshd_config PasswordAuthentication no PubkeyAuthentication yes然后重启sshd。做这一步之前务必先在另一个终端窗口验证密钥登录正常并且保留至少一个已登录会话避免把自己锁在门外。关掉密码登录后暴力破解的路径基本被堵死这比任何防火墙规则都管用。我自己的习惯是新服务器先放公钥确认可以密钥登录后再关密码登录遇到个别核心机器再叠加fail2ban双重保险。6.3 与VSCode Remote-SSH协同一个容易被忽略的收益是Windows上的密钥和~/.ssh/config配置VSCode的Remote-SSH插件可以直接复用。VSCode连接远程服务器时会默认读取C:\Users\你\.ssh\config所以你在里面写好的主机别名、私钥路径、用户名VSCode都能识别。也就是说我在Windows Terminal里连开发机和我在VSCode里Remote-SSH连同一台开发机用的是同一把密钥同一个known_hosts不会再出现终端能连上、VSCode连不上的割裂。6.4 一点经验之谈折腾这套方案到现在我最大的感受是免密登录只是表面收益真正值钱的是把连接服务器这件事做成了不打断思考的肌肉记忆。以前要输密码时脑海里总是断一下这台机器的密码是什么来着现在点了名字就进入工作状态频率越高越能感受到差异。最后再分享一个小技巧如果你有几十台服务器的连接入口要同时管理可以把这些profile的commandline全部简化为ssh 别名别名统一维护在~/.ssh/config文件里。这样Windows Terminal里的配置非常短、非常稳换机时只需要复制.ssh目录和settings.json两个东西五分钟恢复全部工作环境。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询