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

oiopk7p5  于 2022-11-16  发布在  Shell
关注(0)|答案(8)|浏览(280)

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

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

所有这些命令都不起作用,只要输入一个“回车”,shell脚本就停在“输入密码短语(空表示没有密码短语)"上,我只想知道如何在shell中连续模拟多个”回车“。
如果有人能帮忙,非常感谢!

j8ag8udp

j8ag8udp1#

我们需要自动完成两个步骤
1.输入密码。使用-N标志(本例中为空字符串):
ssh-keygen -t rsa -N ''
1.覆盖密钥文件
使用-f输入路径(在本例中为id_rsa),再加上here-string,即可对以下问题回答 yes

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)现在,我们需要对 *overwrite问题 * 自动回答“y”(让我们对该作业使用 here-string):

$ 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]-----+

4Extra ball,清除输出,只检查返回代码:

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

覆盖以前的RSA文件的替代路径(不需要-f标志)
:仅bash类 shell 。

如果您不关心RSA名称,只想覆盖它,则需要自动回答以下两个问题:
1.输入保存密钥的文件:/示例/路径/.ssh/id_rsa已存在。
1.是否覆盖(y/n)?
如果我们手动执行此操作,对于第一个问题,我们只需按 enter,对于第二个问题,键入y并按enter
我们可以使用下面的 here-string 来模拟这些操作:
$'\ny'
bash缐上手册:
$'string'形式的单词将被特殊处理。该单词将扩展为“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和这条线上的其他人。

jdg4fx2g

jdg4fx2g2#

如果您不想提示用户输入保存密钥的文件,则可以在命令中添加文件输出标志-f
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
这样就不会提示用户输入任何内容-除非id_rsa文件已存在。

qco9c6ql

qco9c6ql3#

没有一个答案完全符合预期。所需的行为:使用默认设置运行ssh-keygen(就像我们刚刚发送了垃圾邮件Enter),而不提示输入。
要运行的命令为:

yes '' | ssh-keygen -N '' > /dev/null

如果您想打印输出,请忽略〉/dev/null。
说明:
yes y spams 'y',ssh-keygen从字面上理解它,并使$PWD/y和$PWD/ www.example.com中的键y.pub。如果.ssh目录不存在,则使用-f ~/.ssh/id_rsa指定文件会失败。如果rsa是默认类型,则不需要-t rsa选项(我们是垃圾输入反正)。密码不是从stdin读取(我们是垃圾输入),而是直接从键盘读取,所以没有什么可以拦截它。因此,您需要指定-N ''为空密码。

7gyucuyw

7gyucuyw4#

对我来说,当在ssh命令中使用时,我必须同时使用@Lukasz答案和@Juan一

ssh -p$SSH_PORT -q joker@$INSTANCE_IP 'yes y | ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa'
irlmq6kh

irlmq6kh5#

在我的Dockerfile(From node:8.13.0)中,下面的代码运行良好:yes 'y' | /usr/bin/ssh-keygen
更完整的示例:

yes 'y' | /usr/bin/ssh-keygen -q -N '' -t rsa -f /etc/ssh/ssh_host_rsa_key && \
yes 'y' | /usr/bin/ssh-keygen -q -N '' -t dsa -f /etc/ssh/ssh_host_dsa_key
kninwzqo

kninwzqo6#

接受的答案仍然指定了一个自定义文件名。这对我很有效:

ssh-keygen -t rsa -b 4096 -N '' <<<$'\n'
  • -t rsa指定要创建的密钥类型(RSA)。
  • -b 4096指定要创建的密钥中的位数(4096位)。
  • -N ''提供密码短语(本例中为空)。
  • <<< shell 部件:“here string”将字符串输入到ssh-keygen的stdin中。
  • $'\n'换行符(使用$使单引号字符串解释特殊字符)。

上面给出的命令创建了一个4096位的RSA密钥,密码短语为空。Enter file in which to save the key (.../.ssh/id_rsa):,因此在stdin中加入一个换行符(\n),以自动接受默认文件名。如果键已经存在,它将不执行任何操作。
但是,如果您确实希望自动覆盖现有密钥而不进行任何提示,请使用(* 这是原始问题的真实的答案,但它在这里是为了防止不阅读就复制和粘贴的人无意中覆盖 *):

ssh-keygen -t rsa -b 4096 -N '' <<<$'\ny\n'

使ssh-keygen标准输出静音,请添加-q(安静)选项或>/dev/null

ssh-keygen -t rsa -b 4096 -N '' <<<$'\n' >/dev/null
gajydyqb

gajydyqb7#

删除当前私钥以防止覆盖请求。

rm -f ~/.ssh/id_rsa && ssh-keygen -m PEM -t rsa -b 4096 -N '' -f ~/.ssh/id_rsa
j5fpnvbx

j5fpnvbx8#

根据上面的答案,我创建了自己的版本
我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,|铅拷贝
它会自动创建ssh密钥并将公钥复制到剪贴板--〉这允许我粘贴到github,azure dev...

相关问题