没有密码的自动ssh-keygen,怎么办?


86

我想制作一个自动脚本,该脚本调用ssh-keygen并创建一些发布/专用密钥对,稍后将使用它们。原则上,一切都可以正常工作
ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
。目前,这使自动化变得困难。

我可以通过命令行参数提供密码-N thepassphrase,以防止出现提示。仍然我什至不希望拥有密钥- 此外还通过加密保护 -并希望密钥对为纯文本。

什么是(最佳)解决方案?

-q选项可能意味着“安静/安静”,仍然不能避免密码短语的交互。我也没有找到这样的东西
ssh-keygen ...... -q --no-passphrase

请注意,请不要开始宣讲“丢失密码短语”的优缺点或向我讲授“丢失密码短语”的优缺点。以交互形式(不是脚本),用户只需按两次[ENTER]键,该键将另存为纯文本。这就是我想要在这样的脚本中实现的功能:

#!/ bin / bash

command1
命令2
var = $(command3)

#这不应该停止脚本并要求输入密码
ssh-kegen -b 2048 -t rsa -f / tmp / sshkey -q

Answers:


105

这将防止密码短语提示出现,并将密钥对设置为以明文形式存储(当然,它具有所有缺点和风险):

ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N ""

3
这可行。如果/tmp/sshkey已经存在,则会出现一个覆盖提示。可以通过重定向/关闭stdin来防止这种情况-例如通过add 0>&-
maxschlepzig

34

我发现最简单的方法就是执行此操作(使用默认文件名的示例)

    cat /dev/zero | ssh-keygen -q -N ""

如果该~/.ssh/id_rsa文件已经存在,该命令将不做任何修改就退出。

如果没有,您将在该文件名中得到一个全新的密钥。

无论哪种方式,您都没有覆盖任何内容,并且您知道最后您拥有一把钥匙。


确认:在lubuntu 14.04.2上
user77115

如果您真的想让它安静,请将输出通过管道传递到/ dev / null:cat /dev/zero | ssh-keygen -q -N "" > /dev/null
Chris Gregg,

在(肯定是过时的)SLES 11上,上述命令无法生成密钥。yes "" | ssh-keygen -N "" >&- 2>&-但是可以正常工作,并且不输出任何内容(密钥文件是否已经存在),并且不会覆盖以前存在的密钥文件。
zrajm

在Ubuntu
Trusty

2
为什么您选择/ dev / zero?
maxschlepzig


5

您可以使用Expect为您发送“输入”

cat test.sh
#!/bin/bash
set -x
XYZ=$(expect -c "
spawn ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
expect \"Enter passphrase (empty for no passphrase):\"
send \"\r\"
expect \"Enter same passphrase again:\"
send \"\r\"
")

但是请注意,如果文件/ tmp / sshkey已经存在,它将失败,因为命令的输出将不同。


1
感谢您的贡献。对于相同类型的问题,期望似乎更加通用。...以及脚本和用户交互会冲突的那些问题。我将意识到/ tmp / sshkey已经存在的潜在冲突,并在使用您的命令之前进行检查。
humanityANDpeace

2

我在ssh-keygen之前做了一个简单的回显。所以su - <user> -c "echo |ssh-keygen -t rsa"

这已经在Redhat 6上进行了测试


我不认为这是最好的答案,但是我认为,也没有任何理由拒绝投票。
cubuspl42 '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.