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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了免交互方式批量分发公钥脚本相关的知识,希望对你有一定的参考价值。


 

作者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 [email protected]


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 "[email protected] -o StrictHostKeyChecking=no"

    -o StrictHostKeyChecking=no #忽略回复yes的交互(避免第一次交互出现 公钥检查)

 

  PS:1. 因ssh-coopy-id脚本中的配置(shift),所以[email protected]变为第一个参数$1

      2. 这里还需要解参数,需要用引号引起来,使引号内的所有内容成为一个整体(参数)

2)需要密码信息

 解决sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub "[email protected] -o    StrictHostKeyChecking=no"

     sshpass -p123456 #指定密码为123456,忽略交互


分析:查看ssh-copy-id这个命令的配置文件(可分析出以下结果)

▲为什么发布过去的公钥信息是600的权限:umask 077

$1 :命令行后面的第一个参数(如sh kai.sh hostnamehostname就是第一个参数),

    但是在ssh-coyp-id命令中,因这个命令脚本中出现了2shift,所以第三个参数才 是第一个。

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)'"


以下是上面脚本其中一段命令的解释:

1exec sh -c                        --- 在脚本中临时设置环境变量信息

2cd                                    --- 切换到当前用户家目录

3umask 077                       --- 设置临时的umask

4test -d .ssh || mkdir .ssh    --- 判断当前用户家目录是否存在.ssh目录,如果不存在就进行 创建

5cat >> .ssh/authorized_keys && ...省略...  

   --- 远程登录到相应主机上, 将公钥信息保存到远程主机相应用户家目录中   的.ssh/authorized_keys,并将authorized_keys权限设置为6006 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.$#     #统计参数的数量

执行结果:

[[email protected] 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 [email protected]$"

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被管理端软件

 

以上是关于免交互方式批量分发公钥脚本的主要内容,如果未能解决你的问题,请参考以下文章

免密码交互方式+ansible批量管理服务介绍

批量实现ssh免交互认证

Linux使用ssh公钥实现免批量分发管理服务器

ssh密钥分发之二:使用sshpass配合ssh-kopy-id编写脚本批量分发密钥:

ssh实现多级免密码验证企业分发管理

ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs 功能