You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在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

火山引擎 最新活动