我有一个 python 项目,应该用于使用 ssh-keygen 创建 SSH 密钥并将其添加到一些远程服务器。当我从命令行运行命令
ssh-keygen -f .ssh/id_rsa -t rsa -N ""
时,一切正常,我只需运行其余的 python 代码即可将密钥传输到远程服务器。之后,可以使用密钥成功建立 SSH 连接,无论是从 python 中的 paramiko 或从命令行。
但是,当我运行相同的命令使用 python 中的子进程库创建密钥时,我无法使用该密钥进行连接,因为它会提示输入密码,例如
Enter passphrase for key 'C:\Users\<my_user>/.ssh/id_rsa':
。我用于构建 SSH 密钥的 python 代码如下:
from pathlib import Path
import subprocess
LOCAL_SSH_KEY_FOLDER = Path().home() / ".ssh"
command = f'-f {LOCAL_SSH_KEY_FOLDER}/id_rsa -t rsa -N ""'
p = subprocess.Popen(["ssh-keygen"] + command.split(' '), stdout=subprocess.PIPE,
stderr=subprocess.PIPE, text=True)
result, errors = p.communicate()
使其工作的一种方法是删除
N ""
部分并要求 python 代码用户输入一个空密码。它有效,但我不希望系统提示我的用户输入此密码。
感谢@Kenster,我发现当我执行原始Python脚本时,SSH密钥密码被设置为“”(两个双引号),而不是空。解决方案是使用以下行更改代码中的命令参数,问题就消失了。
f'-f {LOCAL_SSH_KEY_FOLDER}/id_rsa -t rsa -N '