如何以非交互/批处理模式将带密码的.ppk密钥转换为OpenSSH密钥?
如何以非交互/批处理模式将带密码的.ppk密钥转换为OpenSSH密钥?
嘿,这个问题我之前折腾过好一阵子,确实puttygen的官方文档明确说了批处理模式没法直接传入密码,但其实有两个靠谱的非交互方案能解决:
方案一:用Expect脚本自动模拟输入
Expect是专门用来处理交互式命令的工具,刚好能帮我们自动输入PPK的密码。具体步骤:
新建一个脚本文件(比如叫
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给脚本加上执行权限:
chmod +x ppk_convert.exp运行脚本,替换成你的实际路径和密码:
./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库来转换会更灵活,还能批量处理多个密钥:
先安装Paramiko:
pip install paramiko写一个简单的转换脚本:
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
相关产品推荐
相关产品推荐

