在macOS >=10.13系统中获取SSH密码短语的方法问询
获取最新macOS版本中SSH密钥密码的可行方法
在macOS High Sierra(10.13)及之后的版本里,Apple修改了SSH密钥密码在系统钥匙串中的存储逻辑,导致旧的命令行和代码方法都失效了。别担心,下面是针对最新macOS版本的有效解决方案:
命令行快速获取
使用系统自带的security工具,你需要调整参数来匹配新的钥匙串条目属性,两种方式都可以:
# 方式1:通过条目标签精准匹配 security find-generic-password -l "SSH: /Users/<你的用户名>/.ssh/id_rsa" -g # 方式2:通过服务名+密钥路径匹配 security find-generic-password -s "com.apple.ssh.passphrases" -a "/Users/<你的用户名>/.ssh/id_rsa" -g
执行命令后,终端会输出包含密码的信息,找到password: "<你的密码短语>"这一行就是目标内容。
Go语言代码实现(依赖go-keychain库)
如果你用Go语言开发,基于keybase/go-keychain库,需要调整查询参数来适配新的存储规则:
package main import ( "log" "os/user" "path/filepath" "github.com/keybase/go-keychain" ) func main() { usr, err := user.Current() if err != nil { log.Fatalf("Failed to get current user: %v", err) } keyPath, err := filepath.Abs(filepath.Join(usr.HomeDir, ".ssh/id_rsa")) if err != nil { log.Fatalf("Failed to get key path: %v", err) } // 构造符合最新macOS规则的钥匙串查询 query := keychain.NewItem() query.SetSecClass(keychain.SecClassGenericPassword) query.SetService("com.apple.ssh.passphrases") // 新的服务名 query.SetAccount(keyPath) // 密钥的绝对路径作为账户标识 query.SetMatchLimit(keychain.MatchLimitOne) query.SetReturnAttributes(true) query.SetReturnData(true) results, err := keychain.QueryItem(query) if err != nil { log.Fatalf("Failed to query keychain: %v", err) } if len(results) == 0 { log.Fatal("No SSH passphrase found in system keychain") } keyPassword := string(results[0].Data) log.Printf("SSH key passphrase: %s", keyPassword) }
这段代码通过指定正确的服务名com.apple.ssh.passphrases,并以密钥的绝对路径作为账户查询条件,能够准确从钥匙串中获取到SSH密钥的密码短语。
小提示:
- 确保你的SSH密钥密码已经被存储到系统钥匙串中(首次使用密钥时,系统会提示是否保存到钥匙串,选择"是"即可)
- 执行命令或代码时,系统可能会弹出权限请求,允许访问钥匙串即可
内容的提问来源于stack exchange,提问作者nbari




