脚本基本原理

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. 菜鸟刷题路:剑指 Offer 05. 替换空格

    剑指 Offer 05. 替换空格 class Solution { public String replaceSpace(String s) { StringBuilder str = new St ...

  2. 【Azure 应用服务】Azure Web App的服务(基于Windows 操作系统部署)在被安全漏洞扫描时发现了TCP timestamps漏洞

    问题背景 什么是TCP timestamps(TCP 时间戳)? The remote host implements TCP Timestamps, as defined by RFC1323 (h ...

  3. 查找文件与cron计划任务

    查找文件 • 根据预设的条件递归查找对应的文件 find [目录] [条件1] [-a|-o] [条件2] ... -type  类型(f文件.d目录.l快捷方式) -name  "文档名称 ...

  4. 你有一份经典SQL语句大全,请注意查收

    一.基础部分 1.创建数据库 CREATE DATABASE dbname 2.删除数据库 DROP DATABASE dbname 3.创建新表 CREATE TABLE tabname(col1 ...

  5. VisualEffectGraph概述

    Visual Effect Graph 由来: Visual Effect Graph 是2018.3 以后版本,出的新的粒子特效技术.它是用显卡渲染特效,区别于传统的Patical system 的 ...

  6. Lin语法(Linq对数据库操作)

    一.Linq语句的应用: var queryAllCustomers = from cust in customers   group cust by cust.City into custGroup ...

  7. ceph-csi源码分析(5)-rbd driver-nodeserver分析(上)

    更多 ceph-csi 其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(5)-rbd driver-nodeserver分析(上) 当c ...

  8. C#调用JAVA(二)调用方法

    上期我们创建了jar包并放到了unity中,那么我们继续 如果您还没有看上一期请先看上一期,这是链接 C#调用JAVA(一)制作jar包 - 执著GodShadow - 博客园 (cnblogs.co ...

  9. kafka高性能吞吐原因

    1. 简单回顾 Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时, ...

  10. flex中Button事件中的e.target

    关于flex中的Button事件中的e.target. 今天想在事件中调用模块中的对象通过e.target获取单击的这个Button对象,但是可能是使用var btn:Button = e.targe ...