首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MHA搭建之ssh互信打通脚本

MHA搭建之ssh互信打通脚本

作者头像
AsiaYe
发布2020-09-27 20:17:58
1K0
发布2020-09-27 20:17:58
举报
文章被收录于专栏:DBA随笔DBA随笔DBA随笔

MHA搭建之ssh互信打通脚本

在MySQL搭建MHA高可用架构的时候,需要打通master、slave、以及mha manager之间的ssh互信,通常情况下,运维人员需要手动打通ssh互信,在自动化构建的过程中很不方便。如果可以使用自动化的脚本打通服务器之间的ssh互信,对自动化运维会有很大的帮助。

常见的方法是通过Expect来和服务器进行交互,expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。spawn的方法是expect环境里面的内部命令,通常用来打通Linux环境之间的互信。

这里分享一个这两天改过的脚本,来打通服务器之间的ssh互信关系,脚本的主要步骤分为如下几步:

1、使用跳板机在源端,利用ssh-keygen命令生成源端服务器的公钥和私钥

2、使用跳板机在目标端,利用ssh-keygen命令生成目标端服务器的公钥和私钥

3、使用跳板机将源端机器的公钥通过scp命令拷贝到目标端机器的/tmp文件夹下

4、使用跳板机在目标端的机器上将/tmp文件夹下源端的公钥推送到目标端的authorized_keys文件中,并修改.ssh文件夹属性为700,,修改authorized_keys文件的属性为600

按照上面的步骤,我们可以单向打通源端到目标端的ssh,借助shell脚本进行源端和目标端交换,就可以实现ssh的打通。

真实的shell脚本如下:

#!/bin/bash
# 输入参数需要遵循src_host dst_host src_username src_pass
src_host=$1src_username=$3
src_passwd=$4

dst_host=$2
dst_username=$3
dst_passwd=$4

ssh_port=$5

# 生成公钥,源端和目标端都生成
Keygen_src()
{
expect << EOF

spawn ssh -p $ssh_port  $src_username@$src_host ssh-keygen -t rsa
while 1 {

        expect {
                        "password:" {
                                        send "$src_passwd\n"
                        }
                        "yes/no*" {
                                        send "yes\n"
                        }
                        "Enter file in which to save the key*" {
                                        send "\n"
                        }
                        "Enter passphrase*" {
                                        send "\n"
                        }
                        "Enter same passphrase again:" {
                                        send "\n"
                                        }

                        "Overwrite (y/n)" {
                                        send "n\n"
                        }
                        eof {
                                   exit
                        }

        }
}


EOF
}




# 目标端秘钥生成
Keygen_dst()
{
expect << EOF
spawn ssh -p $ssh_port  $dst_username@$dst_host ssh-keygen -t rsa
while 1 {

        expect {
                        "password:" {
                                        send "$dst_passwd\n"
                        }
                        "yes/no*" {
                                        send "yes\n"
                        }
                        "Enter file in which to save the key*" {
                                        send "\n"
                        }
                        "Enter passphrase*" {
                                        send "\n"
                        }
                        "Enter same passphrase again:" {
                                        send "\n"
                                        }

                        "Overwrite (y/n)" {
                                        send "n\n"
                        }
                        eof {
                                   exit
                        }

        }
}


EOF
}
# 获取公钥,并拷贝到当前的/tmp目录里面
Get_pub()
{
expect << EOF

spawn scp -P $ssh_port $src_username@$src_host:~/.ssh/id_rsa.pub /tmp
expect {
             "password:" {
                            send "$src_passwd\n";exp_continue
                }
                "yes/no*" {
                            send "yes\n";exp_continue
                }   
                eof {
                                exit
                }
}
EOF
}

# 将源端公钥存入目标端的authorized_keys
Put_pub()
{
src_pub="$(cat /tmp/id_rsa.pub)"
expect << EOF
spawn ssh -p $ssh_port $dst_username@$dst_host "chmod 700 ~/.ssh;echo $src_pub >> ~/.ssh/authorized_keys;chmod 600 ~/.ssh/authorized_keys"
expect {
            "password:" {
                        send "$dst_passwd\n";exp_continue
             }
            "yes/no*" {
                        send "yes\n";exp_continue
             }   
            eof {
                        exit
             } 
}
EOF
}
Keygen_src
Keygen_dst
Get_pub
Put_pub

上述脚本中,常见的参数说明如下:

命令          作用
send         用于向进程发送字符串
expect       从进程接收字符串
spawn        启动新的进程
interact     允许用户交互

其中,send命令接收一个字符串参数,并将该参数发送到进程;
expect通常用来等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命令;
spawn命令用来启动新的进程,spawn后的send和expect命令都是和使用spawn打开的进程进行交互;
interact命令用的其实不是很多,一般情况下使用spawn、send和expect命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工交互;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档