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

如何以非交互/批处理模式将带密码的.ppk密钥转换为OpenSSH密钥?

如何以非交互/批处理模式将带密码的.ppk密钥转换为OpenSSH密钥?

嘿,这个问题我之前折腾过好一阵子,确实puttygen的官方文档明确说了批处理模式没法直接传入密码,但其实有两个靠谱的非交互方案能解决:

方案一:用Expect脚本自动模拟输入

Expect是专门用来处理交互式命令的工具,刚好能帮我们自动输入PPK的密码。具体步骤:

  1. 新建一个脚本文件(比如叫ppk_convert.exp),把下面的内容复制进去:

    #!/usr/bin/expect -f
    # 接收命令行参数:PPK路径、输出SSH密钥路径、密码
    set ppk_file [lindex $argv 0]
    set ssh_key_file [lindex $argv 1]
    set passphrase [lindex $argv 2]
    
    # 启动puttygen转换命令
    spawn puttygen $ppk_file -O private-openssh -o $ssh_key_file
    # 等待密码输入提示,然后自动发送密码
    expect "Enter passphrase for load:"
    send "$passphrase\r"
    # 等待命令执行完成
    expect eof
    
  2. 给脚本加上执行权限:

    chmod +x ppk_convert.exp
    
  3. 运行脚本,替换成你的实际路径和密码:

    ./ppk_convert.exp your_encrypted.ppk output_ssh_key.id_rsa "your_secure_passphrase"
    

⚠️ 小提醒:如果担心密码暴露在命令历史里,可以把密码存在环境变量里,脚本里改成set passphrase $env(PPK_PASS),然后运行前先执行export PPK_PASS="your_passphrase"。

方案二:用Python的Paramiko库处理

如果你更熟悉Python,用Paramiko库来转换会更灵活,还能批量处理多个密钥:

  1. 先安装Paramiko:

    pip install paramiko
    
  2. 写一个简单的转换脚本:

    import paramiko
    
    def convert_ppk(ppk_input_path, ssh_output_path, passphrase):
        # 读取加密的PPK文件
        with open(ppk_input_path, 'rb') as ppk_file:
            ppk_content = ppk_file.read()
        
        # 用密码解密PPK并解析成密钥对象
        private_key = paramiko.RSAKey.from_private_key(ppk_content, password=passphrase)
        
        # 保存为OpenSSH格式的私钥
        with open(ssh_output_path, 'w') as ssh_file:
            private_key.write_private_key(ssh_file)
    
    # 替换成你的实际参数
    convert_ppk("your_encrypted.ppk", "output_ssh_key.id_rsa", "your_secure_passphrase")
    

运行这个脚本就能直接完成转换,完全不需要交互。

备注:内容来源于stack exchange,提问作者Mauricio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 11:09:07