如何回答 Python 的 ssh-keygen 密码提示?

Posted

技术标签:

【中文标题】如何回答 Python 的 ssh-keygen 密码提示?【英文标题】:How to answer the ssh-keygen passphrase prompt from Python? 【发布时间】:2020-02-01 16:38:31 【问题描述】:

在 Python 中,我想通过命令 ssh-keygen -y -f 验证一对具有密码短语的公钥/私钥。代码如下,

#/usr/bin/env python3
...................
...................
command = "ssh-keygen -y -f ".format(key1)
args = bytes("%s\n%s\n" % (psw, psw), encoding='utf8')
proc = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
proc.communicate(input=args)

我认为subprocess.communicate(input=args) 可以用密码回答提示。

但我仍然收到密码提示。

欢迎任何cmets。

【问题讨论】:

那么你想“回答提示”如你的标题所说的那样吗?还是您想“避免提示”,正如您的问题正文所说的那样? @Martin Prikryl “回答提示”是最想要的。 @Martin Prikryl 你有回答密码提示的解决方案吗? @Martin Prikryl 我也是这样做的,但这不是我需要的。如果我使用command = "ssh-keygen -y -f -P \"\"".format(key1, passphrase),我可能会遇到密码为无的情况,那么command 将失败。因此,我需要一个解决方案来处理密码短语的提示,无论它是否存在。该解决方案必须处理三种情况, 1. 密码存在并且我将其输入到脚本中; 2. 密码不存在,我在脚本中输入 null; 3. 密码存在,我忘记在脚本中输入。 @Martin Prikryl 它已修复。我明白了。如果没有密码,我曾经在 -P 中输入一个空值,而不是双引号。因此,在“参数过多”之后出现异常,“Command 'ssh-keygen -y -q -P -f /tmp/tmp0ktbhszv/id_rsa' 返回非零退出状态 1”。 【参考方案1】:

ssh-keygen-P switch 提供密码:

command = "ssh-keygen -y -f  -P \"\"".format(key1, passphrase)

当密钥未加密时,可以使用空密码 (-P "")。

如果您使用错误/空密码短语 (-P "wrong"),对于加密密钥,ssh-keygen 将失败 - 它不会再次提示您输入正确的密码短语。

【讨论】:

以上是关于如何回答 Python 的 ssh-keygen 密码提示?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ssh-keygen生成key

如何在没有提示的情况下执行 ssh-keygen

ssh-keygen - 如何使用特定用户名设置 rsa 密钥

如何使用ssh-keygen生成key

如何在TortoiseGit中使用ssh-keygen生成的key

如何在TortoiseGit中使用ssh-keygen生成的key