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

新手上路,请多包涵

我想在 Centos7 上使用 shell 脚本自动生成一对 ssh 密钥,我已经尝试过

yes "y" | ssh-keygen -t rsa
echo "\n\n\n" | ssh-keygen...
echo | ssh-keygen..

所有这些命令都不起作用,只需输入一个 ‘enter’ 并且 shell 脚本在“Enter passphrase (empty for no passphrase)”处停止,我只想知道如何在 shell 中连续模拟多个 ‘enter’。

如果有人可以提供帮助,非常感谢!

原文由 Jeremy Wang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 917
2 个回答

我们需要自动完成 两个步骤

  1. 输入密码。使用 -N 标志(此示例为空字符串):

ssh-keygen -t rsa -N ''

  1. 覆盖密钥文件

使用 -f 输入路径(在本例中为 --- id_rsa )加上 此处的字符串 来回答以下问题:

 ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y >/dev/null 2>&1

或者,在 bash 类似 shell 下,如果您 确实想覆盖前一个,只需使用 here-string为命令 提供所有需要的 _输入_:

 ssh-keygen -q -t rsa -N '' <<< $'\ny' >/dev/null 2>&1

来自 ssh-keygen 手册 页:

>    -N new_passphrase provides the new passphrase.
>   -q                silence ssh-keygen.
>   -f filename       specifies the filename of the key file.
>
> ```

* * *

**一步一步的解释**

$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/klashxx/.ssh/id_rsa):


**1** )为了避免输入密钥使用 `-f` :

$ ssh-keygen -t rsa -f ~/.ssh/id_rsa Generating public/private rsa key pair. /home/klashxx/.ssh/id_rsa already exists. Overwrite (y/n)?


**注意**:如果您不关心 RSA 文件名并且肯定想覆盖前一个文件名,请查看以下第四点的说明。

**2** )现在我们需要自动回答“ **y** ” _覆盖问题_(让我们使用 [_here-string_](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Here-Strings) 来完成这项工作):

$ ssh-keygen -t rsa -f ~/.ssh/id_rsa <<< y Generating public/private rsa key pair. /home/klashxx/.ssh/id_rsa already exists. Overwrite (y/n)? Enter passphrase (empty for no passphrase):


**3** ) 最后,我们将使用 `-N` 标志来输入无效通行证:

$ ssh-keygen -t rsa -N “ -f ~/.ssh/id_rsa <<< y Generating public/private rsa key pair. /home/klashxx/.ssh/id_rsa already exists. Overwrite (y/n)? Your identification has been saved in /home/klashxx/.ssh/id_rsa. Your public key has been saved in /home/klashxx/.ssh/id_rsa.pub. The key fingerprint is: SHA256:Xo0t6caMB/8TSsigxfY28JIfqYjyqxRZrFrPncx5yiU klashxx@server The key’s randomart image is: +—[RSA 2048]—-+ | | | . | | o . | | + * = | | +. + BSo= o | |…o.+o+XO… | |.. .o.E==+B. . | |o . …=.o… | |.+o. o .. | +—-[SHA256]—–+


**4** ) _多余的球_,清理输出,只检查返回码:

\( ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y >/dev/null 2>&1 \) echo $? 0


* * *

**覆盖先前 RSA 文件的替代路径(不需要 -f 标志)**

**注意**:只有 `bash` 像贝壳。

如果您不关心 RSA 名称而只想覆盖它,我们需要自动回答这两个问题:

> 1. 输入保存密钥的文件:/example/path/.ssh/id_rsa 已存在。
>
> 2. 覆盖(是/否)?

如果我们手动执行此操作,对于第一个问题,我们只需要按 _enter_ ,对于第二个问题,键入 `y` 并按 `enter` 。

我们可以使用以下 [_here-string_](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Here-Strings) 来模拟这些操作:

`$'\ny'`

从 `bash` 手册页:

> $'string' 形式的单词被特殊处理。该词扩展为“字符串”,并按照 ANSI C 标准的规定替换反斜杠转义字符。
>
> \\n 换行

所以,如果我们使用 `od` 来分析我们的字符串:

cat - <<< $‘\ny’ | od -c 0000000 \n y \n


我们看到我们得到了回答问题所需要的东西。

**第 1 点和第 2 点可概括为**:

ssh-keygen -q -t rsa <<< $‘\ny’


**最后的命令** 将是:

\( ssh-keygen -q -t rsa -N '' <<< \)’\ny’ >/dev/null 2>&1 \( echo \)? 0

”`


荣誉

@lukasz-dynowski、@redochka、@mellow-yellow、@yeti 和该线程中的其他人。

原文由 Juan Diego Godoy Robles 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您不想提示用户输入保存密钥的文件,则可以在命令中添加文件输出标志 -f

ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa

这样,除非 id_rsa 文件已经存在,否则不会提示用户输入任何内容。

原文由 Lukasz Dynowski 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题