【Linux】ssh-keygen不需要回车,自动生成密钥,批量免密操作!

文章介绍了如何在shell脚本中自动化生成SSH密钥对,避免手动输入回车确认,以及如何解决首次连接服务器时的确认问题和密码输入问题。通过使用`ssh-keygen`的特定参数和结合`expect`或`sshpass`工具,可以实现自动ssh-copy-id到多台服务器,提高自动化部署效率。
摘要由CSDN通过智能技术生成

使用命令ssh-keygen 需要手动敲击回车,才会生成密钥,如下代码所示

[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:liDdKl+uW9TmA++L3uoO99l/mFNRBP77bm/DbDuLHB4 root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
|              .o.|
|     . .     .  .|
|    . o .     . .|
|     . o o     o |
|    . . S o     o|
|     o = =      o|
|      o + +  Eo= |
|       = = +o B*=|
|      o=*.*..=oOX|
+----[SHA256]-----+

但是有些场景,例如shell脚本中,需要自动生成密钥并自动 ssh-copy-id 这样就很麻烦,
其实只需要将需要确认的内容,告知到命令中就不需要再敲回车确认了:
ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa -q
执行上面的命令,会自动创建root用户的公钥和私钥(具体用户需要修改绝对路径的文件夹)
这样就不需要手动敲击回车了

将密码传输到各个服务器也需要敲击回车,或输入密码,其中有的第一次登陆的服务器需要输出yes
下面一一来解决上面的问题
1、首先解决第一次登陆敲击yes的问题
这是由于~/.ssh/known_hosts 文件中并未记录相关信息,才需要手动敲击yes后才可以到输入密码界面
解决办法:
sed -i '/StrictHostKeyChecking/c StrictHostKeyChecking no' /etc/ssh/ssh_config
执行上面的命令,将StrictHostKeyChecking no这个选项修改为no,不需要确认yes即可。

2、输入密码问题
解决了yes的问题,输入密码也需要手动输入,比较麻烦,不能称之为自动传输,只能称为半自动
下面解决这个问题
两种方法:
第一种:sshpass
第二种:expect
市面上常见的是expect 来自动敲击回车

expect <<EOF
spawn ssh-copy-id -i user@host
expect {
  "yes/no" { send "yes\n";exp_continue }
  "password" { send "${PASSWORD}\n" }
}
expect eof
EOF

这种比较常用
但sshpass这个并不是很常见,下面展开说说
sshpass 非默认安装,需要手动安装
rpm -qa | grep sshpass || yum install sshpass -y
安装完成之后,即可使用sshpass来传输密码
sshpass -p 密码 ssh-copy-id -i 用户@主机ip
这个前提,需要将ssh_config文件下的StrictHostKeyChecking no 修改为关闭状态
否则报错:

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/root/.ssh/id_rsa.pub”

最后附上脚本
expect相关(注意不需要修改ssh_config文件下的StrictHostKeyChecking no )

#!/bin/bash
## 注意下面配置的是网段,并不是完整ip
NET=192.168.100
USER=(root zclinux)
PASSWORD=123456
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &> /dev/null
for i in {1..254} ; do
{
expect <<EOF
spawn ssh-copy-id -i ${USER[0]}@${NET}.${i}
expect {
  "yes/no" { send "yes\n";exp_continue }
  "password" { send "${PASSWORD}\n" }
}
expect eof
EOF
}&
done
wait

sshpass相关脚本

#!/bin/bash
## 注意下面配置的是网段,并不是完整ip
NET=192.168.100
USER=(root zclinux)
PASSWORD=123456
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &> /dev/null
sed -i '/StrictHostKeyChecking/c StrictHostKeyChecking no' /etc/ssh/ssh_config
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
for i in {1..254} ; do
{
  sshpass -p $PASSWORD ssh-copy-id -i ${USER[0]}@${NET}.${i} &> /dev/null
}&
done
wait
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值