You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS重启后SSH密钥未保存,需优化fish终端重复添加逻辑

解决macOS SSH代理密钥持久化与避免重复添加问题

我之前也碰到过一模一样的情况——每次登录macOS后,ssh-add -l总显示The agent has no identities,只能在fish配置里加手动加载密钥的命令,但开个新终端标签页就重复执行,特别烦。下面分两部分帮你搞定:


一、在Fish Shell中避免重复添加密钥

你可以在~/.config/fish/config.fish里加一段判断逻辑,先确认目标密钥是否已经在代理中,只有不存在时才执行ssh-add:

方法1:检查代理是否为空(简单通用)

如果只要代理里有密钥就不执行加载,用这个:

# 检查SSH代理是否没有任何密钥
if ssh-add -l | grep -q "The agent has no identities"
    # 替换成你的私钥路径,多个密钥可以追加
    ssh-add ~/.ssh/id_rsa
    # ssh-add ~/.ssh/another_private_key
end

方法2:检查特定密钥(精准控制)

如果想确保某个特定密钥已加载,先获取该密钥的指纹:

ssh-keygen -lf ~/.ssh/id_rsa

输出会类似2048 SHA256:xxxxxxx yourname@yourmac (RSA),把那个SHA256指纹记下来,然后写判断:

# 检查指定密钥是否已在代理中
if not ssh-add -l | grep -q "SHA256:xxxxxxx"
    ssh-add ~/.ssh/id_rsa
end

这样每次打开终端标签页时,只会在密钥未加载的情况下执行添加操作,不会重复运行命令。


二、实现SSH代理密钥持久化(无需每次手动加载)

你试过-K和ssh_config没生效,可能是macOS版本差异或配置细节没到位,试试下面两种方案:

方案1:利用macOS钥匙串持久化(推荐)

从macOS Sierra开始,系统原生支持把SSH密钥密码存在钥匙串,登录时自动加载:

  1. 先把密钥添加到钥匙串(注意版本差异):
    • 旧版macOS(Mojave及之前):
      ssh-add -K ~/.ssh/id_rsa
      
    • 新版macOS(Ventura及之后):-K已被替换为--apple-use-keychain:
      ssh-add --apple-use-keychain ~/.ssh/id_rsa
      
  2. 修改~/.ssh/config文件(不存在就创建),添加以下配置:
    Host *
      AddKeysToAgent yes
      UseKeychain yes
      IdentityFile ~/.ssh/id_rsa
    
    这里的Host *表示对所有主机生效,要是只想针对特定主机,把*换成具体主机名就行。

配置完第一次用SSH连接时,会提示你输入密钥密码(如果设置了的话),之后系统会自动从钥匙串读密码并加载密钥到代理,再也不用手动操作了。

方案2:用Launchd自动启动SSH代理

如果钥匙串方案不生效,就用Launchd让系统登录时自动启动ssh-agent并加载密钥:

  1. 创建Launchd配置文件~/Library/LaunchAgents/com.user.ssh-agent.plist,替换里面的你的用户名为实际用户名:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <key>Label</key>
      <string>com.user.ssh-agent</string>
      <key>ProgramArguments</key>
      <array>
        <string>/usr/bin/ssh-agent</string>
        <string>-s</string>
        <string>-D</string>
        <string>-a</string>
        <string>/Users/你的用户名/.ssh/agent.sock</string>
      </array>
      <key>RunAtLoad</key>
      <true/>
      <key>StandardOutPath</key>
      <string>/Users/你的用户名/.ssh/agent.out</string>
      <key>StandardErrorPath</key>
      <string>/Users/你的用户名/.ssh/agent.err</string>
    </dict>
    </plist>
    
  2. 加载这个配置文件:
    launchctl load ~/Library/LaunchAgents/com.user.ssh-agent.plist
    
  3. 在~/.config/fish/config.fish中添加环境变量,让终端连接到这个代理:
    set -x SSH_AUTH_SOCK ~/.ssh/agent.sock
    # 再加上之前的密钥判断逻辑
    if not ssh-add -l | grep -q "SHA256:xxxxxxx"
        ssh-add ~/.ssh/id_rsa
    end
    

这样每次登录系统时,Launchd会自动启动ssh-agent,终端打开后会自动连接到这个代理,且只有密钥未加载时才执行添加操作。


关键注意事项

  • 确保你的私钥文件权限是600,.ssh目录权限是700,不然ssh-agent会拒绝加载:
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/id_rsa
    
  • 如果之前手动启动过ssh-agent,先关闭旧代理:killall ssh-agent,再重启终端测试。

内容的提问来源于stack exchange,提问作者miguelopezv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:09:02