尧图精选

SSH连接失败排查指南:从FinalShell密码问题到密钥登录配置

🕒 发布时间:2026/10/1 8:43:14 📁 来源:尧图网络
1. 排查前的两个准备先把“坑”的样子看清楚1.1 “一直提示密码”其实分三种情况先别急着改密码。用FinalShell连Ubuntu输入一次密码就弹回输入框、或者一直提示“认证失败”这种情况我碰到太多次了。但很多新手不知道的是“一直提示密码”这句话背后其实是完全不同的三种故障对应完全不同的排查方向。第一种连上了但立刻被断开或者密码输进去以后提示Password authentication failed然后又弹一次密码框。这种情况大概率是用户名、密码本身不对或者是服务端把密码认证给关了。第二种密码框压根不出来直接提示Permission denied (publickey,password)。这往往说明服务器的sshd_config里只允许密钥登录密码认证已经被禁用了。这时候你不管输多少次密码都没用系统根本不会进入密码比对这一步。第三种连密码框都见不着直接提示Connection refused或者连接超时。这不是密码的问题是网络、端口、防火墙或者SSH服务根本没起来的问题。很多人卡在这一步还在那里疯狂改密码方向从一开始就跑偏了。所以拿到手第一件事先看清楚你属于哪一种报错再决定下一步做什么。1.2 确认服务器IP、用户名、端口有没有填错确认了报错类型之后第二件事是核对FinalShell里填的信息。听起来像废话但我在帮别人排查时发现绝大多数“密码一直不对”的案例最后都是信息填错。登录Ubuntu服务器先执行whoami看看当前用户名到底是什么。很多人以为root是默认用户名但Ubuntu默认安装完成后root账号是没有密码的你装系统时创建的普通用户才是能登录的账号。你在FinalShell的主机名一栏填root然后输普通用户的密码那当然一直提示密码错误。再看IP。在Ubuntu里执行hostname -I注意是大写的I拿到当前主机的IP地址把这个IP填进FinalShell。如果你连的是云服务器填的是公网IP那还要检查云厂商的安全组和防火墙规则是否放行了22端口。如果是虚拟机还要看虚拟机的网络模式是NAT还是桥接NAT模式下宿主机能不能直接访问虚拟机IP这是另一串问题。端口也要确认。默认SSH端口是22但如果服务器上有人改过sshd_config里的Port你客户端还连22那就连接不上。在Ubuntu里执行ss -tlnp | grep ssh就能看到ssh实际监听的端口。还有一个容易被忽视的坑用户名、IP有没有大小写错误有没有多余空格。FinalShell里主机名不能带空格用户名必须原样输入这些细节看似无所谓实际上SSH认证里一个字符都不能差。2. 用命令行直连把客户端和服务端分开2.1 手动打一条SSH命令能暴露大量信息排查到这一步如果基本信息都对但FinalShell还是连不上那就别再纠结FinalShell了。先在Windows上打开自带的终端或者Windows Terminal手动敲一条最原始的SSH命令ssh 用户名服务器IP -p 端口比如ssh sambacai192.168.1.100 -p 22第一次连接会提示确认服务器指纹输入yes回车然后输入密码。注意Linux的终端里输密码是没有任何回显的你敲了密码屏幕上不会显示星号光标也不动这是正常现象不是键盘坏了。输入完直接回车就行。命令行直连的结果会告诉你很多信息如果命令行能连上说明SSH服务、网络、密码全都没问题问题出在FinalShell这一侧的配置。如果命令行也连不上提示Permission denied说明问题在服务端认证设置或者密码本身。如果提示Connection refused说明ssh服务没起来或者端口不通。如果卡住不动、最后超时说明防火墙或网络连通性有问题。这一步是我每次排查FinaShell连接问题的必备动作。它的意义在于把问题一分为二客户端的问题还是服务端的问题省得在FinalShell界面里反复试错浪费时间。2.2 命令行能连但FinalShell不行问题锁定在客户端配置如果命令行直连一切正常但FinalShell用同一组账号密码连不上这就有意思了。常见原因我在下面列出来都是实操里真的见过的。第一个原因是FinalShell密码框里的密码和你以为的密码不一样。很多时候用户开了“记住密码”功能但保存的还是旧密码后来在服务器上改过密码FinalShell里却没更新。你每次都手动输入新密码但FinalShell实际提交的是保存的旧密码。处理办法很简单打开连接配置把密码清掉重新输入一遍或者直接删掉这个连接配置重新建一个。第二个原因是密码里的特殊字符。比如密码里有、#、$、空格、!这些字符在FinalShell的连接配置里可能被转义或解析出问题。我自己遇到过密码末尾有个空格在网页系统里改的密码复制到FinalShell时把换行符也带进去了结果客户端每次提交的密码长度都比真实密码多一位怎么连都连不上。后来我改成在FinalShell里逐字手动输入密码才绕过去。第三个原因是FinalShell版本太老。老版本的FinalShell对OpenSSH新版的某些算法支持不完整比如新版OpenSSH禁用了ssh-rsa签名算法后老客户端连不上。这种情况升级FinalShell到最新版问题立刻消失。遇到命令行能连、FinalShell连不上的情况我的建议是不要在FinalShell里反复改密码了直接新建一个连接配置用最简单的用户名和密码排除掉之前配置里的垃圾数据。3. 服务端三重检查从SSH服务、配置到日志3.1 先确认OpenSSH Server装了没、跑没跑如果命令行也连不上那问题大概率出在Ubuntu服务器自己身上。第一件事是确认SSH服务端软件装没装。Ubuntu有个很坑的地方默认安装时只装了openssh-client用来连别人的没装openssh-server让别人连自己。也就是说你如果安装Ubuntu的时候没有勾选“安装OpenSSH server”选项那么这台机器本身就不具备被SSH连接的能力。这种情况下客户端会提示Connection refused因为22端口根本没有任何程序在监听。检查方法sudo systemctl status ssh如果提示Unit ssh.service could not be found说明压根没装。安装命令sudo apt update sudo apt install -y openssh-server sudo systemctl enable --now ssh安装完成后再次执行sudo systemctl status ssh看到active (running)就说明服务起来了。如果服务是failed状态可以执行sudo journalctl -u ssh查看失败原因。接着确认端口有没有在监听sudo ss -tlnp | grep ssh如果看到LISTEN 0 128 0.0.0.0:22说明服务端一切正常。如果这里没有任何输出说明sshd没有启动成功或者配置里改了非默认端口。还有一种情况是sshd只监听在IPv6地址上输出*:22或者[::]:22这都是正常的。3.2 sshd_config里三个关键参数决定你能不能登录如果服务在跑、端口在监听但还是提示Permission denied那就要检查SSH服务端的配置文件了。配置文件在/etc/ssh/sshd_config有些发行版还会在/etc/ssh/sshd_config.d/目录下放一些额外配置文件。Ubuntu默认情况下sshd_config文件顶部会有一行Include /etc/ssh/sshd_config.d/*.conf这意味着除了主配置文件子目录里的配置也会生效。排查的时候要两边都看。需要重点确认三个参数PasswordAuthentication。这是开关密码登录的总闸。如果它是no那无论密码多正确都会被拒绝。需要改成yes。PermitRootLogin。这个参数控制是否允许root直接登录。Ubuntu的默认值是prohibit-password意思是root不允许用密码登录但允许密钥登录。如果你在FinalShell里用的是root账号那就会一直提示密码不对。想允许root密码登录改成PermitRootLogin yes。但我个人建议日常操作还是用普通用户加上sudoroot直接暴露密码登录容易招来暴力破解。PubkeyAuthentication。这是密钥认证开关如果设置了no那密钥登录也会失败。一般保持yes即可。修改配置后必须重启服务才生效sudo systemctl restart ssh或者是sudo systemctl restart sshdUbuntu上服务名是ssh所以第一条更常用。这里还有一个巨坑要提醒改配置前先备份改完之后千万别把当前会话断开太早。建议的做法是sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak然后修改配置、重启SSH、立刻开一个新的终端会话去连接测试确认能连上再关旧会话。否则一旦配置改错你可能会把自己锁在服务器外面。3.3 auth.log日志让系统自己说出真相排查到这一步如果还没弄清楚为什么拒绝认证那就让日志说话。Ubuntu的SSH认证日志写在/var/log/auth.log里。可以用下面的命令实时查看sudo tail -f /var/log/auth.log然后在另一边用FinalShell或者命令行尝试连接观察日志输出。这是整个排查过程里信息量最大的一步。常见的日志关键信息Failed password for sambacai from 192.168.1.50 port 52410 ssh2说明密码输入错误客户端和服务端确实在进行密码比对但密码不对。你需要检查密码本身。Connection closed by authenticating user sambacai 192.168.1.50 port 52410 [preauth]这行出现时往往说明密码认证阶段被中断。可能是用户不存在也可能是禁用了密码登录。Accepted password for sambacai from 192.168.1.50 port 52430 ssh2说明认证通过了。如果日志显示Accepted但FinalShell还是弹密码那问题就回到了客户端。看日志的时候注意区分sshd进程有没有报权限错误。如果日志里有类似Could not load host key或者bad permissions的提示说明sshd自身的密钥文件权限有问题这也会导致SSH服务异常。日志排查法的好处是客观。用户自己猜来猜去不如让系统直接告诉你失败原因在哪尤其适合那种“密码明明是对的但连不上”的诡异场景。4. FinalShell端容易踩的4个细节坑4.1 “记住密码”没勾上的真相回到FinalShell本身。很多人以为在连接配置里输入一次密码之后每次连接就不需要再输了。但FinalShell的逻辑是密码要在“设置”里保存并且保存后连接时勾选“自动登录”才会自动带出密码。这里有两个不同的概念需要区分连接时弹窗手动输入密码和配置里保存了密码后自动登录。如果配置里密码没保存好每次新建连接或者重启FinalShell后它还是会弹出密码框让你输入。你以为是“一直提示密码”其实只是客户端没保存密码需要你每次都手动输入这个是FinalShell的正常交互逻辑不是bug。处理办法新建连接时在密码栏里输入密码然后勾选“保存密码”最后点确定。下次双击连接时如果能直接进入终端说明保存成功。如果还弹密码框就把连接配置删掉重新创建一次有时候是配置没有被正确写入。还有一个很容易忽略的点FinalShell会为每个连接单独保存密码你在A连接里改了密码但脑子里以为改的是B连接。这种时候两个连接的密码不一样用B连接自然永远对不上。建议给每个连接起有辨识度的名字比如“Ubuntu-办公机-192.168.1.100”避免混淆。4.2 复制粘贴惹的祸看不见的换行符密码出问题十个里有五个是复制粘贴搞的鬼。Windows的记事本、浏览器、聊天工具里的密码复制到FinalShell密码框时有时候会带上一个看不见的换行符。这个换行符在界面上看不出来但SSH客户端会把它当成密码的一部分提交给服务器。服务端校验时发现密码多了一个字符就会拒绝认证。怎么排查很简单把密码复制到一个纯文本编辑器里比如记事本然后把光标移到密码末尾按一下退格键看看密码会不会变成空行或者多删除一个字符。如果感觉长度不对就说明有隐藏字符混进去了。更省事的方案是在FinalShell的密码框里手动逐字输入密码不要用复制粘贴。虽然麻烦一点但能百分之百排除隐藏字符问题。等确认能连上之后再考虑用“记住密码”功能把这串密码保存下来。4.3 全角半角字符问题这是个看似荒谬但真实存在的坑。Windows下的输入法默认可能是中文状态这时候如果你敲键盘上的数字、字母外的符号比如引号、括号、冒号有可能会被输入成全角形式。全角字符和半角字符在计算机里是完全不同的Unicode编码FinalShell把这些字符加密传输给SSH服务端服务端解密后拿到的密码和你实际想输入的密码在字节层面上不一样认证自然失败。我用中文输入法的时候经常出现这个问题尤其是密码里的和:最容易中招。解决办法在输入密码前先把输入法切换成英文模式比如微软拼音里按Shift切换中英文确保所有字符都是半角。或者直接在FinalShell的设置里把密码保存好用自动登录代替手动输入从源头避免这个问题。4.4 FinalShell版本和本地缓存排除以上所有因素后如果还是连不上就要考虑FinalShell自身的问题了。我在排查中最常见到的是版本过旧。FinalShell的更新频率不高但OpenSSH的更新频率很高。新版OpenSSH 8.8以上默认禁用了ssh-rsa签名算法如果FinalShell版本稍老可能会出现“算法协商失败”的情况表现就是输入密码后马上断开。判断方法是看FinalShell的输出窗口里有没有no matching key exchange method字样。解决办法就是去官网下载最新版覆盖安装。另外一个办法是用绿色版直接解压运行不污染系统环境。本地缓存问题也比较常见。FinalShell的配置保存在本地文件中如果之前的连接配置损坏可能会导致连接受影响。Windows上FinalShell的配置目录大致在C:\Users\用户名\finalshell\下你可以把其中某个连接对应的连接配置删掉重新在FinalShell里创建。记得先关闭FinalShell再操作否则配置文件可能被覆盖回写。这个方法在处理“同一账号、同一密码有时候能连有时候不能连”的间歇性故障时特别有效。5. 一步到位换SSH密钥登录彻底告别密码弹窗5.1 为什么密钥登录比密码登录稳排查完一圈密码问题后如果你问我有什么一劳永逸的解决方案我的答案是别用密码登录了直接换成SSH密钥认证。SSH密钥认证的原理本质上是一对非对称加密文件公钥放在服务器上私钥放在你的电脑上。连接的时候服务器给客户端出一个加密难题只有持有对应私钥的客户端才能解开。它不通过网络传输密码本身所以不会有密码泄露的风险也不存在“密码记错了”“密码有隐藏字符”这种破事。平时自己用的话私钥直接保存在本机连接时几乎是一键直连。远程生产服务器上一般还会直接禁用密码登录只允许密钥认证这样别人连密码爆破的入口都没有了。如果你经常连接多台服务器密钥登录更是刚需。每台服务器装一次公钥之后所有机器都无需输密码。相比之下密码登录每次都输密码不说还得担心密码被记录在FinalShell的本地配置里。5.2 在FinalShell里生成密钥并上传到Ubuntu密钥登录的配置也可以用命令行完成但FinalShell提供了图形化操作对新手友好得多。第一步生成密钥。打开FinalShell顶部菜单找到“工具”里面有一项“SSH密钥管理器”。点开后能看到当前电脑上已有的密钥列表如果之前没生成过点“新建”。密钥类型选RSA长度选2048或者4096都行2048已经足够安全。生成过程中可以设置一个私钥口令这样就算别人拿到你的私钥文件没有口令也解不开。当然如果图方便口令也可以不设。第二步把公钥复制到服务器。密钥生成后密钥管理器里可以看到公钥内容是一长串以ssh-rsa AAAA...开头的文本。复制这串内容。然后回到终端在Ubuntu服务器上执行mkdir -p ~/.ssh chmod 700 ~/.ssh vim ~/.ssh/authorized_keys把之前复制的公钥内容粘贴进去保存退出。然后chmod 600 ~/.ssh/authorized_keys这三条命令的含义分别是创建.ssh目录、设置目录权限为700只有自己可读写执行、把公钥写进authorized_keys文件、设置文件权限为600只有自己可读写。一个快捷办法是在本地执行ssh-copy-id命令。但你如果还没有任何能正常登录服务器的方式这个奇招也就无从谈起了。所以最实际的方式还是先在Ubuntu图形界面或者物理终端上执行上面的命令。第三步用FinalShell测试密钥连接。回到FinalShell编辑之前的连接配置在认证方式里选择“公钥”有些版本叫“密钥登录”指定用你刚才生成的那把私钥密码留空。确认后连接。如果前面步骤没出错这次你就直接进到终端了。5.3 密钥登录的权限检查清单密钥登录比密码登录稳定但权限要求更苛刻。服务器上.ssh目录和authorized_keys文件权限不对服务端会直接拒绝读取公钥然后一切正常认证都会失败。这里整理一份权限检查清单~/.ssh目录权限必须是700drwx------~/.ssh/authorized_keys文件权限必须是600-rw-------宿主机~目录也就是home目录权限不能太宽松最好是755或者更严如果开启了SELinuxUbuntu默认没有需要额外注意上下文标签检查命令ls -ld ~ ~/.ssh ~/.ssh/authorized_keys正常情况下输出应该类似drwxr-xr-x 5 sambacai sambacai 4096 Mar 12 10:00 /home/sambacai drwx------ 2 sambacai sambacai 4096 Mar 12 10:01 /home/sambacai/.ssh -rw------- 1 sambacai sambacai 745 Mar 12 10:02 /home/sambacai/.ssh/authorized_keys如果权限不对用chmod命令修正chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys还有一点如果你给/etc/ssh/sshd_config里加了其他自定义选项比如设置了AuthorizedKeysFile指向非默认路径那公钥文件的位置就得对应修改不然服务端找不到公钥。密钥登录配置成功后如果你确定以后都用密钥登录可以在服务端把密码登录彻底关掉sudo sed -i s/^#PasswordAuthentication yes/PasswordAuthentication no/ /etc/ssh/sshd_config sudo systemctl restart ssh但我要提醒一句先确保密钥登录已经完全可用再执行这条命令否则你可能把自己锁在服务器外面。建议改完配置后开两个SSH窗口一个窗口负责改配置另一个窗口用来验证新配置是否生效都确认没问题后再关闭旧窗口。6. 问题排查速查表与我的几点实操心得6.1 用户场景速查表把前面讲过的内容整理成一张表方便你遇到问题时直接对照省得把所有地方都翻一遍故障现象大概率原因处理方案提示密码错误但密码确认无误密码含隐藏字符、全角字符手动逐字输入密码切换英文输入法提示Permission denied (publickey,password)服务端禁用密码登录修改sshd_config开启PasswordAuthentication或改用密钥登录提示Connection refusedSSH服务未安装/未启动安装openssh-server并启动服务提示连接超时防火墙/安全组拦截22端口检查ufw状态、云安全组入方向规则FinalShell填了root提示密码错误Ubuntu默认禁止root密码登录改用普通用户sudo或修改PermitRootLogin命令行能连FinalShell连不上FinalShell配置保存的旧密码删除连接配置重新创建输入密码后秒断开客户端版本过旧/算法协商失败升级FinalShell到最新版日志显示Accepted但客户端仍弹密码客户端配置问题重启FinalShell重新加载连接配置这张表是我自己在长期排障过程中沉淀出来的。遇到问题时先判断自己的现象落在那一行然后按对应方案处理能少走很多弯路。6.2 连接成功后FinalShell里头几个推荐先做好的设置好不容易连上了别急着高兴。有几个基础设置建议初始化的时候就做好能省掉后面很多麻烦。第一个是修改终端编码为UTF-8。在连接配置里找到“终端”或“高级”选项确认编码设置为UTF-8。Ubuntu默认就是UTF-8这一步主要是防止中文文件名乱码。第二个是开启“SFTP”面板也就是左侧的文件管理。FinalShell的核心优势之一就是SFTP文件上传下载配置好后拖拽文件就能直接传到服务器上。这个功能在连接成功后默认就能用不需要额外设置。第三个是保存好连接分组。服务器多了之后建议按照生产环境、测试环境、跳板机等用途建立不同分组配合FinalShell的同步功能以后换电脑也能一键拉回配置。第四个是检查终端的自动重连设置。网络不稳定时SSH容易断线FinalShell有“自动重连”选项勾选后只要网络恢复终端会自动重新建立连接。这在用笔记本连服务器长期跑任务时非常实用。6.3 我的几点实操心得最后说说我做Linux服务器运维这几年围绕SSH连接踩过的一些经验和心得。第一个心得排查密码问题最多花30分钟在客户端上超过30分钟就转去查服务端和日志。很多人遇到连不上就一直在FinalShell里改密码、删连接、重启软件其实大部分时候问题不在客户端。先把服务端的日志打开看一眼所有真相都在/var/log/auth.log里躺着。第二个心得改sshd_config之前永远先备份永远先开第二个会话再改。我见过太多人因为改配置把服务器锁在外面最后只能去云平台控制台用VNC救回来。正确做法是修改配置文件前执行sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak修改并重启服务后立刻开一个新的SSH窗口测试连接确认能连上了再关旧窗口。永远不要在一个会话里完成“改配置-重启-等连接”的整个过程。第三个心得能上密钥登录就尽量上密钥登录。密码登录的问题在于你无法判断这次连不上到底是密码输错了是网络问题还是服务端改了配置。但密钥登录只要密钥文件还在、权限没问题、服务器没改端口基本上是必通的。尤其是运维多台服务器的时候用密钥登录配一个简单的私钥口令比每个服务器记一个复杂密码可靠十倍。第四个心得注意Ubuntu和Ubuntu Linux的拼写问题。网上很多教程把Ubuntu拼成“ubantu”这个拼写导致的后果是搜索准确率下降。建议搜问题的时候用正确的拼写Ubuntu配合关键词ssh、sshd_config、auth.log搜索能更快找到高质量解决方案。最后再分享一个小技巧如果你遇到的是FinalShell里密码一直弹而命令行能连的情况其实可以不排查直接绕过。用FinalShell创建连接时认证方式不要选密码改成密钥认证然后把密钥配置好。这样你既保留FinalShell的图形化界面和文件管理功能又彻底躲开了密码弹窗这条路上的所有坑。我自己的使用习惯是本机生成密钥对服务器只放公钥FinalShell里保存好私钥路径。之后每次连接鼠标双击就能进系统。密码不对的问题从此彻底成为历史。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →