脚本基本原理
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 : --help|-h get command help. e.g:batchsent.sh --help command public key distribution: e[40;32;1mbatchsent.sh [ip/hostname]e[0;0;0m example: e.g:batchsent.sh 192.168.0.1 or use default batchsent public key: e.g:batchsent.sh explanation: 1.hostname needs to be able to be resolved IP address. 2.Run this script need to have root privileges. 3.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 #g'|grep -v '^$' | wc -l` 18 if [ ${count} -eq 4 ];then 19 return 0 20 else 21 echo -e "e[40;31;1merrore[0;0;0m:this host(${ip}) ip---e[40;31;1mThere are obvious errorse[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;1merrore[0;0;0m:this host(${ip}) name---e[40;31;1mcan not be resolvede[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} public keys e[40;34;1malready existe[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} public keys e[40;32;1msent successfullye[0;0;0m,can be used normally." 48 else 49 echo -e "${ip} this host(${ip}) is e[40;31;1mnot onlinee[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;1merrore[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;1merrore[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