shell编程-ssh免交互批量分发公钥脚本
脚本基本原理
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免交互批量分发公钥脚本的更多相关文章
- ssh秘钥免交互批量分发脚本
将以下内容保存为.sh文件后运行即可,需根据各自情况修改ip_up和ip_arr #!/bin/bash #脚本功能:ssh秘钥免交互批量分发 #制 作 人:罗钢 联系方式:278554547@qqc ...
- shell编程之免交互 (不要再让你的双手过度劳累了)
shell编程之免交互 1.Here Document免交互 2.Expect免交互 3.免交互磁盘创建 1.Here Document免交互 概述: Here Document使用I/O重定向的方式 ...
- 8.shell编程之免交互
shell编程之免交互 目录 shell编程之免交互 Here Document免交互 免交互定义 Here Document变量设定 多行的注释 expect expect 定义 expect基本命 ...
- shell编程之免交互
目录: 一.Here Document 免交互 二.Expect 一.Here Document 免交互 使用I/O重定向的方式将命令列表提供给交互式程序或命令, 比如 ftp.cat 或 read ...
- expect--自动批量分发公钥脚本
1.在使用之前,先安装epel源,yum install expect -y2.写分发脚本,后缀为exp #!/usr/bin/expect set host_ip [lindex $argv 0] ...
- Shell批量SSH免交互登录认证
脚本实现功能:批量或单个SSH免交互登录认证 脚本应用场景:当部署集群时,大多数实现要配置好管理节点与从节点的SSH免交互登录,针对这样的情况,写了下面脚本,简化工作. 脚本支持系统:Ubuntu和C ...
- shell中expect免交互
expect前言观察ssh登录的交互现象有些程序难以避免的需要交互.你该如何解决脚本与程序的交互问题?名词解释期待, 预期, 盼望, 预料,料想, 指望, 希望, 要求,想, 认为一.概述 我们通过S ...
- expect批量分发公钥
sshkey.exp #!/usr/bin/expect# 由于是多台服务器,需要在shell脚本中循环调用该脚本 if { $argc != 2 } { send_user "usage: ...
- Xshell配置ssh免密码登录-密钥公钥(Public key)与私钥(Private Key)登录【已成功实例】
本文转自https://blog.csdn.net/qjc_501165091/article/details/51278696 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口 ...
随机推荐
- QT Dialog模态与非模态
模态 // 创建对话框窗口 TestDialog* dlg = new TestDialog(this); // 阻塞程序的运行 dlg->exec(); 这样的话,当运行对话窗口的时候,会阻塞 ...
- Nginx虚拟主机流量状态模块(nginx-module-vts)使用说明文档(四)
装完NG,为了拿到各种状态指标,就要对NG做监控. Github 2.3k的开源项目nginx-module-vts没准真是你需求的. 链接数,qps,1xx.2xx,.3xx.4xx.5xx的响应数 ...
- MySQL索引简介(转)
一.为什么用索引例:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname='css',如果要拿这条数据的话需要写的sql是 SELECT * FROM award WHERE ni ...
- 搞清楚Spring事件机制后:Spring的源码看起来简单多了
本文主讲Spring的事件机制,意图说清楚: 什么是观察者模式? 自己实现事件驱动编程,对标Spring的事件机制 彻底搞懂Spring中的事件机制,从而让大家 本文内容较长,代码干货较多,建议收藏后 ...
- 【codeforces841A】Generous Kefa
原题 A. Generous Kefatime limit per test:2 secondsmemory limit per test:256 megabytes input:standard i ...
- Linux中使用QT读取并显示温度传感器数值
环境: Ubuntu 16.04 64 bit QT5.13.1/QT5.12 原理 对于Linux来说一切都是文件,温度传感器也是个文件,如果要获取某个温度传感器的数值,可以读取相应的文件,Linu ...
- Java并发之Semaphore源码解析(一)
Semaphore 前情提要:在学习本章前,需要先了解笔者先前讲解过的ReentrantLock源码解析,ReentrantLock源码解析里介绍的方法有很多是本章的铺垫.下面,我们进入本章正题Sem ...
- Redis的事务不是原子性的
1.事务的四大特性 原子性(Atomicity):化学中的原子指不可再分的基本微粒,数据库中原子性强调事务是一个不可分割的整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某个环节. ...
- 试着给VuePress添加渐进式Web应用(PWA)支持,基于vuepress/plugin-pwa,点亮离线访问
背景 有时候,我们也希望VuePress构建的文档中心能支持离线访问,这时候我们需要给他添加渐进式Web应用(PWA,Progressive Web App)的支持,根据官方文档指引,我们可以借助插件 ...
- 27、myslq更改为不自动提交
27.1.说明: 默认情况下, MySQL启用自动提交模式(变量autocommit为ON).这意味着, 只要你执行DML操作的语句, MySQL会立即隐式提交事务(Implicit Commit). ...