MHA搭建之ssh互信打通脚本
时间:2022-07-25
本文章向大家介绍MHA搭建之ssh互信打通脚本,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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_passwdn"
}
"yes/no*" {
send "yesn"
}
"Enter file in which to save the key*" {
send "n"
}
"Enter passphrase*" {
send "n"
}
"Enter same passphrase again:" {
send "n"
}
"Overwrite (y/n)" {
send "nn"
}
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_passwdn"
}
"yes/no*" {
send "yesn"
}
"Enter file in which to save the key*" {
send "n"
}
"Enter passphrase*" {
send "n"
}
"Enter same passphrase again:" {
send "n"
}
"Overwrite (y/n)" {
send "nn"
}
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_passwdn";exp_continue
}
"yes/no*" {
send "yesn";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_passwdn";exp_continue
}
"yes/no*" {
send "yesn";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命令主要用于退出自动化,进入人工交互;
- 独家 | 手把手教你用Python 3创建用于机器学习开发的Linux虚拟机(附安装教程、代码)
- TSQL--临时表和表变量
- 微软开源 C++ REST SDK
- 使用Autofac在ASP.NET Web API上实现依赖注入
- Universal-Image-Loader完全解析--从源代码分析Universal-Image-Loader中的线程池
- 我是怎样爬下6万共享单车数据并进行分析的(附代码)
- 数据库压缩备份提高备份效率
- 教你用TensorFlow和自编码器模型生成手写数字(附代码)
- 开源OCR引擎Tesseract
- 数据仓库中如何使用索引
- PowerBI 引入时间智能
- 列存储索引1:初识列存储索引
- 通过案例来学习TCP的MSS、MTU
- webview和js交互
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 技术篇-音频mp3格式转wav格式,高保真
- Python3 模块
- Python 微信机器人-向好友发送名片、转发名片
- iOS多线程:GCD使用介绍
- 适用于各语言的二分查找算法,你get到了嘛?
- Theme preview
- “抽象类”到底抽不抽象?实例对比一看便知!
- C#索引器的实现、索引器和属性的异同对比,这些技能你get到了嘛?
- 我竟然用它搞懂了王者荣耀的技能释放机制!【C#委托】
- 使用docker-compose 搭建 lnmp
- Java接口也有坑?不容忽视!
- 值得练手的JavaGUI项目——色彩调节器的实现【附完整源码】
- 自定义短标签
- Python简单又好玩的项目推荐!【持续更新】
- 使用 JsDelivr作为CDN 加速服务