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
  • 相关阅读:
    Codeforces 1485C Floor and Mod (枚举)
    CodeForces 1195D Submarine in the Rybinsk Sea (算贡献)
    CodeForces 1195C Basketball Exercise (线性DP)
    2021年初寒假训练第24场 B. 庆功会(搜索)
    任务分配(dp)
    开发工具的异常现象
    Telink MESH SDK 如何使用PWM
    Telink BLE MESH PWM波的小结
    [LeetCode] 1586. Binary Search Tree Iterator II
    [LeetCode] 1288. Remove Covered Intervals
  • 原文地址:https://www.cnblogs.com/operationhome/p/9172895.html
Copyright © 2011-2022 走看看