zoukankan      html  css  js  c++  java
  • 批量配置SSH互信脚本

    Ps: 关于SSH密钥验证

    .ssh下一般来说有4个文件id_rsa,id_rsa.pub,authorized_keys,known_hosts
    其作用分别为:
    • 私钥,ssh-keygen生成的私钥,与公钥成对
    • 公钥,ssh-keygen生成的共钥,与私钥成对
    • authorized_keys,存储已有的公钥,每当有客户端来访问服务器,服务器都会在此文件中找到对应客户端user的的公钥,与其出示的私钥进行验证,如果成功那么允许那个用户登录。
    • known_hosts,每次新访问一个服务器,都会把这个新服务器发来公钥记入此文件(建立SSH连接前server会把公钥发给客户端),其作用是在二次访问此server时证明此server不是什么伪造的server而是你以前访问过的那个server(如果server IP变动或者重装了ssh,公钥是会变的)。
    为了实现互信访问authorized_keys和known_hosts都要匹配好,其中authorized_keys用于用户验证,而known_hosts用于服务器验证。
    因此为了能够实现两服务器之间的互信,可以在一个服务器上生成一个公私钥对儿,然后将公钥存到authorized_keys中,之后将.ssh文件夹拷贝到另一服务器,最后使用ssh互访一次即可(为了更新knowhosts)。

    在大规模自动化部署时我们常常需要配置好服务器的SSH互信,以便自动化脚本可以免密登录远程服务器,常规的手动配置SSH互信步骤如下:

    • 使用ssh-keygen生成本地ssh key(mha01),生成的文件如下:

        

    • cp .ssh/id_rsa.pub .ssh/authorized_keys
    • 将.ssh内容全部拷贝至远程服务器mha02,在正式拷贝之前会把远程服务器加到.ssh/known_hosts文件中然后再拷贝。
    每次向新服务器拷贝都会更新.ssh/known_hosts,全部拷贝完毕后在mha1上就可以免密登录所有服务器了。
     
    根据以上思想编写的批量配置脚本为:
    #!/usr/bin/expect
    #此脚本需配合ip.list文件使用,ip.list文件存储所有服务器IP,包含本地服务器。
    #此脚本需要和ip.list一起放置在用户~/目录下才能执行。
    set passwd xxx --设置服务器密码变量,需要所有服务器上要配置ssh互信的用户的密码全部一致。
    spawn ssh-keygen  
    expect {
    		"id_rsa" {send "
    ";exp_continue}  
    		"Overwrite" {send "y
    ";exp_continue}    
    		"phrase" {send "
    ";exp_continue}    
    		"again" {send "
    ";exp_continue}  
    		}
    #需要注意的是路径不能以~开头,因此要么写成绝对路径要么写成相对路径,绝对不能用~/来表示家目录。但是如果是$ip:~/却可以,奇坑无比。
    spawn cp .ssh/id_rsa.pub .ssh/authorized_keys --这可也可以写成spawn cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
    set hosts [open ip.list r]
    while { [gets $hosts ip]>=0} {
    	spawn scp -r .ssh/ $ip:~/  --这里也可以写成spawn scp -r /root/.ssh/ $ip:/root/ 
    	expect {
    		"yes/no" {send "yes
    ";exp_continue}  
    	        "password:" {send "$passwd
    ";exp_continue}  
           		}  
    }  
    close $hosts
    假设有mha01-mha99 99台服务器,那么配置完毕后mha01可以免密登录其他98台服务器,但是mha02只能免密登录mha01和mha02,mha03只能免密登录前3台服务器,以此类推mha99和mha01一样可以免密登陆全部服务器,如果想要01-99之间的服务器也能像01和99一样,可以把脚本的第二部分再次执行一遍,这样相当于把包含全部hosts的known_hosts文件的.ssh目录传输到所有服务器节点。
    补充说明:
    ssh还有一个名为ssh-copy-id的命令,也可以使用此命令实现key的拷贝,使用此命令无需以上繁琐的判断,这里懒的进行修改了,只提一下待有需要再说。
     
  • 相关阅读:
    MyBatis 3源码分析
    Java动态代理
    HashMap原理分析(JDK1.7.x之前)
    JQuery datepicker 用法
    百度一键分享功能
    JQuery BlockUI插件
    AJAX参数详解
    ECharts图标库
    KeCode对照表(键盘按键的获取)
    常见浏览器兼容问题
  • 原文地址:https://www.cnblogs.com/leohahah/p/8477066.html
Copyright © 2011-2022 走看看