赞
踩
使用命令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 来自动敲击回车
安装
sudo apt install expect
或
sudo yum install 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。