美文网首页
shell批量免密

shell批量免密

作者: 阿栋oxo | 来源:发表于2019-11-24 14:13 被阅读0次

    背景:批量做免密操作,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用于模拟人机交互行为的程序。

    • Expect中最关键的四个命令:
      spawn:启动需要交互的进程,只有spawn 执行的命令结果才会被expect 捕捉到
      send:发送字符串给spawn 启动的那个进程,用于模仿“人"向进程发出linux命令用
      expect:从进程中捕获关键字
      interact:用于将交互双方由expect脚本和机器内核改为——>字符终端和机器内核(即为正常人和机器交
    • 其他命令
      expect eof: 结束expect匹配互的模式

    单线程

    #!/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命令操作文件描述符

    相关文章

      网友评论

          本文标题:shell批量免密

          本文链接:https://www.haomeiwen.com/subject/wuchwctx.html