脚本基本原理

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. 【SQLite】教程03-SQLite语法

    注释: sqlite>.help -- 这是一个简单的注释 SQLite ANALYZE 语句: 收集有关表和索引的统计信息,并将收集的信息存储在数据库的内部表中 ANALYZE; or ANA ...

  2. Java设计模式(5:设计模式的分类及工厂模式详解)

    一.设计模式的分类 总的来说,设计模式可以分为三大类:创建型模式.结构型模式.行为型模式,具体如下图: 二.工厂模式 工厂模式分为简单工厂模式.工厂方法模式和抽象工厂模式.其中简单工厂模式并不属于23 ...

  3. docker入门详解

    这可能是最为详细的Docker总结 Docker是什么? 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企 ...

  4. NOIP模拟测试16「Drink·blue·weed」

    话说这次考试 Drink 非常棒的一道卡常练习题,适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar,输入getchar 在这个题快了7000豪 2. ...

  5. React 并发功能体验-前端的并发模式已经到来。

    React 是一个开源 JavaScript 库,开发人员使用它来创建基于 Web 和移动的应用程序,并且支持构建交互式用户界面和 UI 组件.React 是由 Facebook 软件工程师 Jord ...

  6. 基于Istio构建微服务安全加固平台的探索

    简介 An open platform to connect, secure, control and observe services. Istio 是一个由谷歌.IBM 与Lyft共同开发的开源项 ...

  7. centos 关闭SELINUX并重启系统

    关闭SELINUX [root@bogon ~]# vim /etc/sysconfig/selinux  ... SELINUX=disabled ... 执行过程: 重启系统 [root@bogo ...

  8. AcWing 201. 可见的点

    在一个平面直角坐标系的第一象限内,如果一个点(x,y)与原点(0,0)的连线中没有通过其他任何点,则称该点在原点处是可见的. 编写一个程序,计算给0<x,y<=n定整数N的情况下,满足的可 ...

  9. 【重学Java】可变参数

    可变参数 可变参数[应用] 可变参数介绍 可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了 方法的参数类型已经确定,个数不确定,我们可以使用可变参数 可变参数定义格式 修饰符 ...

  10. Software Architecture软件架构(方法、模式与框架)纵横谈

    Software Architecture软件架构是啥 随着软件行业的发展,软件的规模越来越大,"Software Architecture软件架构"这个名词开始频繁出现.&quo ...