所有文件的github位置:https://github.com/tobewithyou1996/ssh-batch-believe.git 便于下载,直接复制容易有编码问题。
思路:将所有主机的公钥文件都收集到一台主机,最后将包含所有主机的公钥文件添加到每一台主机。
主要文件有 believe.sh ,sshcopy.exp ,sshkeygen.exp,hosts文件
1. believe.sh文件
#!/bin/bash #检查本地是否有密钥文件,没有则添加。 ./sshkeygen.exp #循环取出ip和密码 for i in $(cat ./hosts ) do #取出ip和密码 IP=$(echo "${i}" |awk -F":" '{print $1}') PW=$(echo "${i}" |awk -F":" '{print $2}') #将本地的公钥复制到远程主机 ./sshcopy.exp $IP $PW #将脚本sshkeygen.exp复制到远程主机 scp -p ./sshkeygen.exp $IP:/root/ #远程主机安装expect ssh root@$IP "yum install expect -y " #远程主机创建密钥文件 ssh root@$IP "/root/sshkeygen.exp&" #将远程主机的公钥添加到本地authorized_keys文件 ssh root@$IP "cat ~/.ssh/*.pub" >>./authorized_keys done #将本地的公钥复制到远程主机 for i in $(cat ./hosts) do IP=$(echo "${i}" |awk -F":" '{print $1}')
#将本地主机的公钥文件添加到authorized_keys文件
cat ~/.ssh/*.pub >>./authorized_keys scp ./authorized_keys $IP:~/.ssh/authorized_keys done
2. sshcopy.exp
#!/usr/bin/expect -d set ip [lindex $argv 0] set pw [lindex $argv 1] set timeout 60 spawn ssh-copy-id $ip expect { #"*yes/no" {send "yes "; exp_continue}
#如果上面这行注释了,我们需要在/etc/ssh/ssh_config 将# StrictHostKeyChecking ask 修改为 StrictHostKeyChecking no。 "password:" {send "$pw "} } expect eof
3. sshkeygen.exp
#!/usr/bin/expect -d set timeout 90 spawn ssh-keygen expect { ".ssh/id_rsa" {send " ";exp_continue} "Overwrite (y/n)?" exit "Enter passphrase" {send " ";exp_continue} "Enter same passphrase again:" {send " "} } expect eof
4. hosts文件
149.28.244.75:*p8V1xGV{7)%sQdV! 149.28.245.101:K(1q@jsHvM@dUVZtk
注意事项:believe.sh ,sshcopy.exp ,sshkeygen.exp 三个文件都要具有可执行权限。 sshcopy.exp文件的第七行需要注意,根据自己的情况进行是否注释。 这里的expect脚本都开启了调试参数,可不开启
这里还有些问题没有解决就是当我们第一次去远程登陆主机的时候还是要询问我们是否连接远程主机,
解决办法:
1. 在所有的主机上面,我们需要在/etc/ssh/ssh_config 将# StrictHostKeyChecking ask 修改为 StrictHostKeyChecking no。
2.将一台包含所有主机的known_hosts文件的文件上传到所有的主机上。
3.或者在使用ssh时加上-o GSSAPIAuthentication=no 这样也可以避免询问。
[root@vultr ~]# ssh -o StrictHostKeyChecking=no 144.202.16.12