shell批量免密

2019-11-24  本文已影响0人  阿栋oxo

背景:批量做免密操作,114台主机10分钟才跑完,主机在国外
前提条件:
使用ssh-keygen生成密钥

ssh-keygen -q -f ~/.ssh/zabbix001 -b 2048 -t rsa -N '' -C 用于aws云主机的
-q:静默输入
-f:指定用来保存密钥的文件名
-b:指定密钥长度
-t:指定要创建的密钥类型
-C:添加注释

expect是单独的一种脚本语言工具。expect不是/bin/sh,也不是/bin/bash,它是Linux用于模拟人机交互行为的程序。

单线程

#!/bin/bash
username=pchuant
passwd=123456
for ip in `cat hosts`
do
/usr/bin/expect << EOF
spawn ssh-copy-id $username@$ip
expect {
    # 如果有yes或no关键字
    "(yes/no)?" {  
        # 则输入yes
          send "yes\r"
        # 输入完yes后如果输出结果有password关键字,
        expect  "password:" 
        # 则输入密码
          send "$passwd\r"
    }
    # 如果上次输出结果有password,则输入密码
    "password:" {send "$passwd\r"}
}
expect eof
EOF
done  

多线程(不太行)

#!/bin/bash
#Concurrency is 10
user=juzix
passwd=123456
[ -e /tmp/fd1 ] || mkfifo /tmp/fd1     #创建有名管道
exec 3<>/tmp/fd1                       #创建文件描述符,以可读可写的方式关联管道文件,这时候文件描述符3就有了有名管道文件的所有特性
rm -rf /tmp/fd1                        #关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了
for((i=1;i<=10;i++))
do
    echo >&3                       #$3代表引用文件描述符3,这条命令代表往管道里面放入一个“令牌”
done

#for ip in `cat hosts`
for ip in {1..40}
do
read -u3
{
/usr/bin/expect << EOF
spawn ssh-copy-id ${user}@10.1.1.${ip}
expect {
    "(yes/no)?" {
    send "yes\r"
    expect  "password:" {send "${passwd}\r"}
    }
    "password:" {send "${passwd}\r"}
}
expect eof
EOF
echo >&3
}&
done
wait
exec 3<&-                              #关闭文件描述符的读
exec 3>&-                              #关闭文件描述符的写

参考文章

多线程执行for循环shell脚本
exec命令操作文件描述符

上一篇下一篇

猜你喜欢

热点阅读