iOS设备通过SSH免密访问服务器,核心是在本地生成密钥对、将公钥部署到服务器,并在iOS的SSH客户端中配置私钥。整个过程无需越狱,借助Termius或Blink Shell这类工具就能完成,配置一次之后,后续连接不再需要输入密码。
准备工作:确认环境与工具
动手之前,先确认三件事,第一,你的iOS设备系统版本,建议保持在较新的正式版,避免旧版本兼容问题,第二,服务器端的SSH服务是否正常运行,多数Linux服务器默认开启,第三,你手上有没有服务器账号密码,以及服务器是否允许密钥登录(PermitRootLogin或PubkeyAuthentication配置)。
iOS平台没有自带终端,需要安装第三方SSH客户端,目前主流选择有两款:Termius和Blink Shell,Termius界面友好,免费版够用,适合大多数场景;Blink Shell更极客,支持Mosh协议,网络切换时连接更稳定,如果你经常在移动网络和Wi-Fi之间切换,Blink Shell的Mosh支持会明显改善体验,这一点在对比ios ssh连接工具时值得留意。
ios ssh免密登录配置:从生成密钥到验证登录
整个配置过程分三步走,每一步都有明确的执行路径,跟着做就行。
第一步:在iOS本地生成密钥对
打开Termius,进入Settings(设置)→ Keys(密钥)页面,点击右上角的加号,选择Generate Key(生成密钥),这里有几个参数需要选:
- 算法:默认的Ed25519是当前推荐选项,安全性高且密钥短,便于复制粘贴,如果你的服务器比较老旧,只支持RSA,那就选RSA并设置4096位长度。
- 密码短语:这是保护私钥的本地密码,可以留空,留空意味着拿到手机就能用私钥,安全性低一些;设置的话每次连接需要输入短语,但私钥本身被加密保护,建议设置一个,代价只是多输入一次短语,换来的是私钥泄露也不怕被直接用。
生成完成后,Termius会自动保存密钥对,公钥和私钥都会显示在列表中,公钥以ssh-ed25519 AAAA...开头,私钥是-----BEGIN OPENSSH PRIVATE KEY-----开头,此时公钥还没上服务器,需要手动部署。
第二步:将公钥部署到服务器
这一步有两条路,选一条你顺手的。
通过密码登录后手动追加
用你现有的SSH客户端(电脑上的终端或Termius的密码登录模式)连上服务器,执行以下命令:
mkdir -p ~/.ssh chmod 700 ~/.ssh echo "你的公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
要完整复制,从ssh-ed25519一直到末尾的注释部分,缺一个字符都验证不过,追加完之后,可以用cat ~/.ssh/authorized_keys无误。
使用ssh-copy-id命令
如果你习惯在电脑上操作,macOS或Linux终端直接执行:
ssh-copy-id -i ~/.ssh/id_ed25519.pub 用户名@服务器IP
这条命令会自动把公钥追加到服务器的authorized_keys文件中,并设置好权限,Windows用户可以用Git Bash或WSL里的同样命令。
第三步:在iOS客户端中配置私钥并测试连接
回到Termius,在Hosts(主机)页面新建一个主机条目,填入服务器IP、端口(默认22)、用户名,然后进入该主机的SSH设置,在Key(密钥)下拉框里选择你刚才生成的密钥,保存后点击连接,如果一切正常,你会直接进入服务器命令行,不再提示输入密码。
首次连接时,iOS客户端会弹出服务器指纹确认提示,类似“The authenticity of host … can’t be established”,选择接受并记住即可,这个指纹是服务器身份的标识,确认过之后就不会再提示,这也是防止中间人攻击的重要环节。
Blink Shell的配置逻辑类似,但操作方式更偏命令行,在Blink中先运行ssh-keygen生成密钥,然后通过ssh-copy-id上传公钥,最后用ssh 用户名@服务器IP连接时会自动匹配密钥,Blink的密钥管理不如Termius可视化,但灵活度更高,适合习惯命令行的用户。
密钥登录失败的排查方向
多数情况下,配置失败的原因集中在服务器端权限或文件内容上,按以下顺序排查,基本能定位问题:
- authorized_keys文件权限:必须是600,即仅属主可读写,如果权限过宽,sshd会拒绝使用这个文件,执行
chmod 600 ~/.ssh/authorized_keys修复。 - .ssh目录权限:必须是700,权限不对时,即使密钥正确也会被拒绝,执行
chmod 700 ~/.ssh修复。 - 是否完整:复制过程中容易遗漏末尾的换行或注释部分,重新粘贴一遍,确保以换行结束。
- 服务器SSH配置:检查
/etc/ssh/sshd_config中PubkeyAuthentication是否为yes,AuthorizedKeysFile是否指向.ssh/authorized_keys,修改配置后需要重启sshd服务:sudo systemctl restart sshd。 - SELinux上下文:如果服务器开启了SELinux(常见于CentOS/RHEL),新创建的authorized_keys文件可能上下文不对,执行
restorecon -Rv ~/.ssh恢复正确上下文。
如果你用的是Root账号登录,有些服务器默认禁止Root密码登录但允许密钥登录,确认一下PermitRootLogin的值,如果设为prohibit-password,密码登录被禁但密钥登录可用,这正好符合你的需求。
多台服务器共用一个密钥的注意事项
很多人会有多台服务器,想用同一把密钥免密登录所有机器,技术上可行,但要注意两点:
- 每台服务器的authorized_keys文件都要追加同一个公钥,操作方式与单台一致。
- 一旦某台服务器的私钥泄露,所有服务器都暴露在风险中,行业共识认为,更安全的做法是每台服务器使用独立密钥对,在Termius里为每个主机单独生成密钥并分别部署,虽然管理成本高一些,但安全收益明显。
如果你只有一两台个人服务器,共用一个密钥问题不大,如果是生产环境或公司资产,建议分开管理。
iPhone ssh连接服务器教程之外:日常使用细节
配置完成只是开始,日常使用中有几个细节值得留意。
连接断线重连:iOS的SSH客户端在App切换到后台一段时间后,连接会断开,Termius有Keep Alive(保活)设置,可以在主机配置里开启,发送心跳包维持连接,Blink Shell的Mosh协议天然解决这个问题,网络切换时会话不中断。
密钥备份:私钥只存在iOS设备上,一旦手机丢失或重置,私钥就没了,建议在配置完成后,将私钥导出并妥善保管,Termius支持导出私钥,导出后存到密码管理器或离线U盘里,注意私钥等同于服务器的钥匙,泄露等于把服务器门敞开。
多因素认证叠加:如果服务器安全性要求高,可以在密钥登录基础上叠加TOTP二次验证,服务器端安装google-authenticator,iOS端用Authenticator类App扫码绑定,这样即使私钥泄露,攻击者没有动态码也进不去。
ios ssh密钥登录失败时的替代方案
如果你尝试了上述所有排查,依然无法免密登录,还有一个临时替代方案:使用SSH的ControlMaster复用连接,在Termius的配置里,可以设置连接复用,同一台服务器的多个会话共享一条TCP连接,减少重复认证的次数,但这不是真正的免密,只是减少了输密码的频率。
另一个思路是检查iOS端时间是否准确,SSH密钥认证依赖时间戳校验,如果iOS设备时间偏差过大,服务器会拒绝认证,在“设置→通用→日期与时间”中开启自动设置,通常能解决这个问题。
常见问题解答
ios ssh免密登录配置完成后,为什么还是提示输入密码?
先确认你在Termius的主机配置里正确选择了密钥,然后检查服务器端authorized_keys文件的权限和内容,多数情况下是权限问题,按前文排查步骤逐一确认即可,如果服务器开启了SELinux,记得执行restorecon -Rv ~/.ssh。
Termius和Blink Shell哪个更适合ios ssh密钥管理?
Termius提供图形化的密钥管理界面,生成、导入、导出都直观,适合不熟悉命令行的用户,Blink Shell更轻量,启动速度快,支持Mosh协议,但密钥操作需要通过命令行完成,如果你追求稳定性和可视化操作,选Termius;如果你对命令行不排斥且需要Mosh支持,选Blink Shell。
想在iPhone上管理多台服务器的密钥,有什么推荐的整理方式?
在Termius中利用分组功能,按项目或环境(生产、测试、个人)划分组,每个组下添加对应主机,密钥可以按服务器单独生成,也可以共用一个,但建议至少区分生产环境和测试环境,这样日常连接时,通过分组快速定位目标主机,不需要每次手动输入IP和用户名。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/772250.html


