没有密码的自动 ssh-keygen,如何?

hum*_*ace 146 scripting ssh

我想制作一个自动脚本,该脚本调用ssh-keygen并创建一些稍后将使用的发布/私有密钥对。原则上一切正常....
ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
...除了它要求我提供加密密钥的密码。这使得 - 目前 - 自动化变得困难。

我可以通过命令行参数提供密码-N thepassphrase,以防止出现提示。我什至不希望拥有密钥——另外通过加密保护——并且希望密钥对是明文。

这个问题的(最佳)解决方案是什么?

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

请不要开始说教或教导我“缺少密码”的利弊,我知道这一点。在交互式表单中(不是作为脚本),用户只需按两次 [ENTER],密钥将被保存为纯文本。这就是我想在这样的脚本中实现的目标:

#!/bin/bash

命令 1
命令 2
var=$(command3)

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

hum*_*ace 187

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

ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N ""
Run Code Online (Sandbox Code Playgroud)

使用内置 SSH 的 Windows 10

电源外壳:

ssh-keygen -b 2048 -t rsa -f C:/temp/sshkey -q -N """"
Run Code Online (Sandbox Code Playgroud)

指令:

ssh-keygen -b 2048 -t rsa -f C:/temp/sshkey -q -N ""
Run Code Online (Sandbox Code Playgroud)

  • 这有效。但是,如果`/tmp/sshkey` 已经存在,则会出现覆盖提示。这可以通过重定向/关闭标准输入来防止 - 例如通过添加`0>&-`。 (8认同)
  • 在 /tmp 中生成一对清晰的密钥是不好的做法;) (4认同)
  • 为了让它不问问题,指定目的地(`-f ~/.ssh/id_rsa`)并指定密码(`-N ''`)就足够了。 (3认同)
  • Powershell 应该是 `ssh-keygen -t rsa -b 4096 -f "C:/temp/sshkey" -q -N '""'` (单引号围绕一组双引号)。虽然 2 组双引号在此特定情况下有效,但与其他参数配对时可能会导致问题(例如空注释/`-C` 例如 `ssh-keygen -t rsa -b 4096 -f "C:/temp/ sshkey" -q -N '""' -C '""'` )。 (2认同)

小智 48

我发现做你想做的最简单的方法是这个(使用默认文件名的例子)

    cat /dev/zero | ssh-keygen -q -N ""
Run Code Online (Sandbox Code Playgroud)

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

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

无论哪种方式,您都没有覆盖任何内容,并且您最终知道您有一个密钥。

  • 你为什么 cat /dev/zero? (7认同)
  • @JoeHolloway 我明白了 - 那么 `cat` 是多余的,即 `< /dev/zero ssh-keygen -q -N ''` 的工作原理相同。 (2认同)

小智 18

这对我有用:

ssh-keygen -t rsa -f /home/oracle/.ssh/id_rsa -q -P ""
Run Code Online (Sandbox Code Playgroud)

-P是密码选项,""是空密码。

  • `-P <passphrase>` 选项用于提供(旧)密码。https://linux.die.net/man/1/ssh-keygen (7认同)
  • key_save_private:没有这样的文件或目录 (2认同)

Bit*_*Nix 7

您可以使用 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\"
")
Run Code Online (Sandbox Code Playgroud)

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