zoukankan      html  css  js  c++  java
  • 批量实现多台服务器之间ssh无密码登录的相互信任

    所有文件的github位置:https://github.com/tobewithyou1996/ssh-batch-believe.git  便于下载,直接复制容易有编码问题。

    思路:将所有主机的公钥文件都收集到一台主机,最后将包含所有主机的公钥文件添加到每一台主机。

    主要文件有  believe.sh  ,sshcopy.exp ,sshkeygen.exp,hosts文件

    1. believe.sh文件

    #!/bin/bash
    #检查本地是否有密钥文件,没有则添加。
    ./sshkeygen.exp
    #循环取出ip和密码
    for i in $(cat ./hosts )
    do
        #取出ip和密码
        IP=$(echo "${i}" |awk -F":" '{print $1}')
        PW=$(echo "${i}" |awk -F":" '{print $2}')
        #将本地的公钥复制到远程主机
        ./sshcopy.exp $IP  $PW
        #将脚本sshkeygen.exp复制到远程主机
        scp -p ./sshkeygen.exp   $IP:/root/
        #远程主机安装expect
        ssh root@$IP "yum install expect -y "
        #远程主机创建密钥文件
        ssh root@$IP "/root/sshkeygen.exp&"
        #将远程主机的公钥添加到本地authorized_keys文件
        ssh root@$IP "cat ~/.ssh/*.pub" >>./authorized_keys
    done
    #将本地的公钥复制到远程主机
    for i in $(cat ./hosts)
    do
         IP=$(echo "${i}" |awk -F":" '{print $1}')
       #将本地主机的公钥文件添加到authorized_keys文件
         cat ~/.ssh/*.pub >>./authorized_keys
    scp ./authorized_keys $IP:~/.ssh/authorized_keys done

    2. sshcopy.exp

    #!/usr/bin/expect -d  
    set ip [lindex $argv 0]
    set pw [lindex $argv 1]
    set timeout 60
    spawn ssh-copy-id $ip
    expect {
    #"*yes/no" {send "yes
    "; exp_continue} 
    #如果上面这行注释了,我们需要在/etc/ssh/ssh_config 将# StrictHostKeyChecking ask 修改为 StrictHostKeyChecking no。 "password:" {send "$pw "} } expect eof

    3. sshkeygen.exp

    #!/usr/bin/expect -d
    set timeout 90
    spawn ssh-keygen
    expect {
    ".ssh/id_rsa" {send "
    ";exp_continue}
    "Overwrite (y/n)?" exit
    "Enter passphrase" {send "
    ";exp_continue}
    "Enter same passphrase again:" {send "
    "}
    }
    expect eof

    4. hosts文件

    149.28.244.75:*p8V1xGV{7)%sQdV!
    149.28.245.101:K(1q@jsHvM@dUVZtk

    注意事项:believe.sh ,sshcopy.exp ,sshkeygen.exp 三个文件都要具有可执行权限。 sshcopy.exp文件的第七行需要注意,根据自己的情况进行是否注释。 这里的expect脚本都开启了调试参数,可不开启

    这里还有些问题没有解决就是当我们第一次去远程登陆主机的时候还是要询问我们是否连接远程主机,

    解决办法:

    1. 在所有的主机上面,我们需要在/etc/ssh/ssh_config 将# StrictHostKeyChecking ask 修改为 StrictHostKeyChecking no。

    2.将一台包含所有主机的known_hosts文件的文件上传到所有的主机上。

    3.或者在使用ssh时加上-o GSSAPIAuthentication=no  这样也可以避免询问。

    [root@vultr ~]# ssh -o StrictHostKeyChecking=no 144.202.16.12
  • 相关阅读:
    jQuery的标签选择器$('p')、类选择器$('.myClass')、id选择器$('#myId')
    jQuery Validate验证框架与 jQuery ajaxSubmit的联合使用
    23种设计模式(一) 单例模式
    java 常见的几种运行时异常RuntimeException
    Servlet 生命周期、工作原理
    throw与throws的区别
    Apache Shiro java安全框架
    web.xml 中<context-param>与<init-param>的区别与作用
    web.xml 中CharacterEncodingFilter类的学习
    web.xml中的contextConfigLocation在spring中的作用
  • 原文地址:https://www.cnblogs.com/operationhome/p/9172895.html
Copyright © 2011-2022 走看看