您的位置:首页 > 其它

免交互方式批量分发公钥脚本

2018-01-31 16:55 399 查看
作者Georgekai归档:学习笔记2018/1/30

1.1 SSH

1.1.1 部署好基于ssh秘钥的方式进行管理

1. 创建秘钥对
ssh-keygen -t rsa
2. 分发公钥
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41

1.1.2 实现批量部署ssh+key环境时遇到的问题

1. 创建秘钥对时需要进行交互,输入回车
1)需要确认私钥保存路径
解决:ssh-keygen -t rsa -f /root/.ssh/id_rsa
-f filename #指定私钥文件保存的路径
2)需要确认私钥密码信息
解决:ssh-keygen -t rsa -f /root/.ssh.id_rsa -P "" #指定密码为空
-N new_passphrase #指定一个新的密码
-P passphrase #指定一个旧的密码
2. 分发公钥时,需要输入yes和密码信息
1)需要输入yes信息
解决:ssh-copy-id -i /root/.ssh/id_rsa.pub "root@172.16.1.41 -o StrictHostKeyChecking=no"
-o StrictHostKeyChecking=no #忽略回复yes的交互(避免第一次交互出现 公钥检查)

PS:1. 因ssh-coopy-id脚本中的配置(shift),所以root@172.16.1.41变为第一个参数$1
2. 这里还需要解参数,需要用引号引起来,使引号内的所有内容成为一个整体(参数)
2)需要密码信息
解决:sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub "root@172.16.1.41 -o StrictHostKeyChecking=no"
sshpass -p123456 #指定密码为123456,忽略交互

分析:查看ssh-copy-id这个命令的配置文件(可分析出以下结果)
▲为什么发布过去的公钥信息是600的权限:umask 077
▲$1 :命令行后面的第一个参数(如sh kai.sh hostname,hostname就是第一个参数),
但是在ssh-coyp-id命令中,因这个命令脚本中出现了2次shift,所以第三个参数才 是第一个。
▲shift:一个shift可以理解为忽略在命令行中的第一个参数(2个就是忽略第1个和第2个)
vim /usr/bin/ssh-copy-id
ssh $1 "exec sh -c 'cd; umask 077; test -d .ssh || mkdir .ssh ;
cat >> .ssh/authorized_keys &&
(test -x /sbin/restorecon && /sbin/restorecon .ssh .ssh/authorized_keys >/dev/null 2>&1 || true)'"

以下是上面脚本其中一段命令的解释:
1)exec sh -c --- 在脚本中临时设置环境变量信息
2)cd --- 切换到当前用户家目录
3)umask 077 --- 设置临时的umask值
4)test -d .ssh || mkdir .ssh --- 判断当前用户家目录是否存在.ssh目录,如果不存在就进行 创建
5)cat >> .ssh/authorized_keys && ...省略...
--- 远程登录到相应主机上, 将公钥信息保存到远程主机相应用户家目录中 的.ssh/authorized_keys,并将authorized_keys权限设置为600(6 6 6-0 7 7=6 -1 -1, 文件结果有奇数位,所以奇数位+1)
2) 如果对方端口改为52113,不在是22
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub "172.16.1.7 -p52113"
-p52113 #指定对端端口号为52113

脚本中shift的作用:
脚本内容
#!/bin/bash
until [ $# -eq 0 ]
do
echo $*
shift
done
PS:1.$* #把所有参数都显示出来
2.$# #统计参数的数量
执行结果:
[root@m01 scripts]# sh shift_test.sh 1 2 3 4 5 6
1 2 3 4 5 6
2 3 4 5 6
3 4 5 6
4 5 6
5 6
6

1.1.3 编写免交互的方式 批量分发公钥脚本

#!/bin/bash
#避免.ssh下已有公钥信息,下次在创建时,会提示是否覆盖
\rm /root/.ssh/id_rsa* -f
#免交互创建秘钥对
ssh-keygen -t rsa -f /root/.ssh/id_rsa -P "" &>/dev/null #将后面输出的没用的信息,追加到空
#免交互分发公钥
for ip in 7 31 41
do
sshpass -p123456 ssh-coyp-id -i /roo/.ssh/id_rsa.pud "-o StrictHostKeyChecking=no root@172.16.1.$"
done

1.1.4 编写批量管理脚本

vim 777.txt
#!/bin/bash
# fenfa
for ip in 7 31 41
do
echo =====================172.16.1.$ip host info==========================
ssh 172.16.1.$ip $1 #$1 表示第一个参数
echo ""
done
#执行脚本时后面不加参数的话,会先连接到172.16.1.7,在连接到31,然后从31在连接到41

执行脚本测试(后面加一个参数)

sh 777.txt "hostname" #批量查看每个主机的主机名
sh 777.txt "free -m" #批量查看每个主机的内存信息
sh 777.txt "uptime" #批量查看每个主机的负载信息
sh 777.txt "yum install libselinux-python -y" #批量安装ansible被管理端软件

小伙伴们可以关注我的微信公众号:linux运维菜鸟之旅


关注“中国电信天津网厅”公众号,首次绑定可免费领2G流量,为你的学习提供流量!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ssh key
相关文章推荐