• 批量实现多台服务器之间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
  • 相关阅读:
    小知识积累C++使用tinyxml解析Xml内存泄漏问题
    C/C++心得从内存开始
    C/C++心得理解指针
    C/C++心得面向对象
    对于语言的理解
    Lua脚本认知小结
    从敏捷开发到小团队SVN
    如何制作网页小动画?——gif or png
    华为数据之道_简读
    Python_读取文件替换字符
  • 原文地址:https://www.cnblogs.com/operationhome/p/9172895.html
Copyright © 2020-2023  润新知