脚本基本原理

1、控制端免交互创建秘钥和公钥:

1 ssh-keygen -t rsa -f /root/.ssh/id_rsa -N ""

2、免交互发送公钥

1 sshpass -ppassword ssh-copy-id -i /root/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no user@172.25.0.21"

sshpass              # 非交互式SSH密码提供

-o StrictHostKeyChecking=no # 不提示,ssh将自动添加新的主机密钥用户已知主机文件。

更多参数可以参考man ssh_config

ssh-copy-id        # 本质上是调用ssh命令,进行远程拷贝公钥的一个脚本,其中值得关注的是脚本中的“shift”,它能够将传参的参数依次向前推进。

 1 which ssh-copy-id
2 /usr/bin/ssh-copy-id
  以下为shift在ssh-copy-id命令中使用的典型代码
3 if [ "-i" = "$1" ]; then
4 shift
5 # check if we have 2 parameters left, if so the first is the new ID file
6 if [ -n "$2" ]; then
7 if expr "$1" : ".*\.pub" > /dev/null ; then
8 ID_FILE="$1"
9 else
10 ID_FILE="$1.pub"
11 fi
12 shift # and this should leave $1 as the target name
13 fi
14 else
15 if [ x$SSH_AUTH_SOCK != x ] && ssh-add -L >/dev/null 2>&1; then
16 GET_ID="$GET_ID ssh-add -L"
17 fi
18 fi

以下为shift示例代码,能够加助理解shift将参数依次向前推进的含义

 1 cat shift_test.sh
2 #!/bin/bash
3 until [ $# -eq 0 ];do
4 echo $*
5 shift
6 done
7 bash shift_test.sh 1 2 3 4 5
8 1 2 3 4 5
9 2 3 4 5
10 3 4 5
11 4 5
12 5

ssh免交互分发公钥的脚本

脚本功能:

1、能够输入选项 -h/--hlep查看帮助

2、不输入参数进行默认分发

3、可以指定主机的IP或者可以被解析的主机名进行分发

4、提示输出友好

5、能够自动检测已经分发了的主机,分发过了的就不再重复分发

6、代码尽量简洁

7、指定多个主机进行批量分发

效果示例1:帮助

效果示例2:默认分发、指定一个主机分发

效果示例3:指定多个主机同时进行批量分发

源码如下:

  1 #!/bin/bash
2 # mzy 2019-09-22 Add Features
3 # another: 梅钟园 4 # contact QQ:359462962
5 export PATH=/bin:$PATH
6
7 # output command help manual
8 function output_help(){
9 echo -e "Usage :\n\n--help|-h\tget command help.\n\te.g:batchsent.sh --help\n\ncommand public key distribution:\n\t\e[40;32;1mbatchsent.sh [ip/hostname]\e[0;0;0m\n\nexample:\n\te.g:batchsent.sh 192.168.0.1\n\tor use default batchsent public key:\n\te.g:batchsent.sh\n\nexplanation:\n\t1.hostname needs to be able to be resolved IP address.\n\t2.Run this script need to have root privileges.\n\t3.The current system needs to be able to use yum install sshpass software."
10 }
11
12 # Check whether the IP address or host name of the obvious error
13 function check_ip_format(){
14 ip=$1
15 echo ${ip} |sed -r 's#([0-9]+).#\1#g' |test -n "`sed -n '/^[0-9][0-9]*$/p'`" >/dev/null 2>&1
16 if [ $? -eq 0 ];then
17 count=`echo ${ip}|sed -r 's#([0-9]+).#\1\n#g'|grep -v '^$' | wc -l`
18 if [ ${count} -eq 4 ];then
19 return 0
20 else
21 echo -e "\e[40;31;1merror\e[0;0;0m:this host(${ip}) ip---\e[40;31;1mThere are obvious errors\e[0;0;0m"
22 output_help
23 return 1
24 fi
25 else
26 ping -c 3 ${ip} >/dev/null 2>&1
27 if [ $? -eq 0 ];then
28 return 0
29 else
30 echo -e "\e[40;31;1merror\e[0;0;0m:this host(${ip}) name---\e[40;31;1mcan not be resolved\e[0;0;0m"
31 output_help
32 return 1
33 fi
34 fi
35 }
36
37 # Single IP or host public key distribution
38 function sent_pub_key(){
39 ip=$1
40 sshpass -prewqrewsdsds ssh "-o StrictHostKeyChecking=no" root@${ip} hostname >/dev/null 2>&1
41 if [ $? -eq 0 ];then
42 echo -e "${ip} \tpublic keys \e[40;34;1malready exist\e[0;0;0m,can be used normally."
43 else
44 ping -c 3 ${ip} >/dev/null 2>&1
45 if [ $? -eq 0 ];then
46 sshpass -ptemplate ssh-copy-id -i /root/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no root@${ip}" >/dev/null 2>&1
47 echo -e "${ip} \tpublic keys \e[40;32;1msent successfully\e[0;0;0m,can be used normally."
48 else
49 echo -e "${ip} \tthis host(${ip}) is \e[40;31;1mnot online\e[0;0;0m"
50 fi
51 fi
52 }
53
54 # define default host
55 function default_batch_sent_pub_key(){
56 for ip_addr in 172.16.0.{31,41,51,71,5,6,7,8,9};do
57 sent_pub_key ${ip_addr}
58 done
59 }
60
61 # default ip or host public key distribution
62 function batch_sent_pub_key(){
63 ip_addr=$1
64 sent_pub_key ${ip_addr}
65 }
66
67 # check the packages needed
68 function check_sshpass(){
69 if [ ! -f /usr/bin/sshpass ];then
70 yum install -y sshpass >/dev/null 2>&1
71 if [ $? -ne 0 ];then
72 echo -e "\e[40;31;1merror\e[0;0;0m:install sshpass failed,check to see if the current user has root privileges."
73 exit 1
74 fi
75 fi
76 }
77
78 # check -h or --help args
79 function check_help_args(){
80 args=$1
81 case ${args} in
82 "--help")
83 output_help
84 exit 1
85 ;;
86 "-h")
87 output_help
88 exit 1
89 ;;
90 esac
91 }
92
93 # The implementation of public key distribution by check_help_args function
94 # In this way the code is more complex, not recommended
95 function exec_batch_sent_by_check_help_args(){
96 check_help_args $1
97 if [ $# -eq 1 ];then
98 check_ip_format $1
99 if [ $? -eq 0 ];then
100 batch_sent_pub_key $1
101 fi
102 fi
103 }
104
105 # The implementation of public key distribution by if statment
106 # Such code simpler, recommended
107 function exec_batch_sent_by_if_statment(){
108 if [ $# -eq 1 ];then
109 if [ $1 == '--help' ] || [ $1 == '-h' ];then
110 output_help
111 else
112 check_ip_format $1
113 if [ $? -eq 0 ];then
114 batch_sent_pub_key $1
115 fi
116 fi
117 fi
118 }
119
120 # Check the generated keys
121 function check_the_generated_keys(){
122 if [ -f /root/.ssh/id_rsa -a -f /root/.ssh/id_rsa.pub ];then
123 return 0
124 else
125 ssh-keygen -t rsa -f /root/.ssh/id_rsa -N ""
126 if [ $? -eq 0 ];then
127 return 0
128 else
129 echo -e "\e[40;31;1merror\e[0;0;0m:install sshpass failed,check to see if the current user has root privileges."
130 return 1
131 fi
132 fi
133 }
134
135 # main
136 if [ $# -eq 0 ];then
137 check_sshpass
138 check_the_generated_keys
139 if [ $? -eq 0 ];then
140 default_batch_sent_pub_key
141 else
142 exit 1
143 fi
144 else
145 until [ $# -eq 0 ];do
146 check_sshpass
147 check_the_generated_keys
148 if [ $? -eq 0 ];then
149 exec_batch_sent_by_if_statment $1
150 else
151 exit 1
152 fi
153 shift
154 done
155 fi
 

shell编程-ssh免交互批量分发公钥脚本的更多相关文章

  1. ssh秘钥免交互批量分发脚本

    将以下内容保存为.sh文件后运行即可,需根据各自情况修改ip_up和ip_arr #!/bin/bash #脚本功能:ssh秘钥免交互批量分发 #制 作 人:罗钢 联系方式:278554547@qqc ...

  2. shell编程之免交互 (不要再让你的双手过度劳累了)

    shell编程之免交互 1.Here Document免交互 2.Expect免交互 3.免交互磁盘创建 1.Here Document免交互 概述: Here Document使用I/O重定向的方式 ...

  3. 8.shell编程之免交互

    shell编程之免交互 目录 shell编程之免交互 Here Document免交互 免交互定义 Here Document变量设定 多行的注释 expect expect 定义 expect基本命 ...

  4. shell编程之免交互

    目录: 一.Here Document 免交互 二.Expect 一.Here Document 免交互 使用I/O重定向的方式将命令列表提供给交互式程序或命令, 比如 ftp.cat 或 read ...

  5. expect--自动批量分发公钥脚本

    1.在使用之前,先安装epel源,yum install expect -y2.写分发脚本,后缀为exp #!/usr/bin/expect set host_ip [lindex $argv 0] ...

  6. Shell批量SSH免交互登录认证

    脚本实现功能:批量或单个SSH免交互登录认证 脚本应用场景:当部署集群时,大多数实现要配置好管理节点与从节点的SSH免交互登录,针对这样的情况,写了下面脚本,简化工作. 脚本支持系统:Ubuntu和C ...

  7. shell中expect免交互

    expect前言观察ssh登录的交互现象有些程序难以避免的需要交互.你该如何解决脚本与程序的交互问题?名词解释期待, 预期, 盼望, 预料,料想, 指望, 希望, 要求,想, 认为一.概述 我们通过S ...

  8. expect批量分发公钥

    sshkey.exp #!/usr/bin/expect# 由于是多台服务器,需要在shell脚本中循环调用该脚本 if { $argc != 2 } { send_user "usage: ...

  9. Xshell配置ssh免密码登录-密钥公钥(Public key)与私钥(Private Key)登录【已成功实例】

    本文转自https://blog.csdn.net/qjc_501165091/article/details/51278696 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口 ...

随机推荐

  1. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.14 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  2. 循序渐进BootstrapVue,开发公司门户网站(4)--- 使用b-carousel-slide组件实现图片轮播以及vue-awesome-swiper实现图片滑动展示

    在BootstrapVue组件库里面,提供了很多对Bootstrap同等类似的组件封装,其中图片轮播可以采用b-carousel-slide组件实现,而有一些小的图片,如客户/合作伙伴Logo或者友情 ...

  3. ES6学习笔记之字符串新增方法

    1.字符串的子串识别 传统上,Javascript 只有indexof 方法,用来确定一个字符串是否包含在另一个字符串中.如: //indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的 ...

  4. vue+element表格

    效果图 备注:前后端分离实现效果 接下来是代码环节 <template>   <div class="comprehensive-table-container" ...

  5. js笔记7

    1.作用域链 作用域:浏览器给js的一个生存环境(栈内存) 作用域链:js中的关键字var和function都可以提前声明和定义,提前声明和定义的放在我们的内存地址(堆内存)中.然后js从上到下逐行执 ...

  6. jquery动画(控制动画隐藏、显示时间轴)

    <!DOCTYPE html><html> <head>    <meta http-equiv="Content-type" conte ...

  7. excel替换函数substitute

    1.substitute(需要执行替换操作的单元格区域,旧文本,新文本,第N个旧内容) 例:substitute(A1,"a","b",2)    A1=aab ...

  8. excel VBA数组运用

    Sub a()Dim i人数 As Integer'定义变量Dim i考试成绩() As Integer'定义数组Dim i As Integer'定义变量i人数 = InputBox("输 ...

  9. kubernetes的存活探针和就绪探针

    1.存活探针 使用Kubernetes的一个主要好处是,可以给Kubernetes-个容器列表来由其保持容器在集群中的运行.可以通过让Kubernetes创建pod资源,为其选择一个工作节点并在该节点 ...

  10. 18.自动运维工具ansible

    1 Ansible 介绍和架构 1.1 Ansible介绍 ansible 的名称来自科幻小说<安德的游戏>中跨越时空的即时通信工具,使用它可以在相距数光年的 距离,远程实时控制前线的舰队 ...