go语言做一个远程控制达梦数据的工具

前言

工作需要,需要go语言的工具远程控制达梦数据库,在此记录一下过程

环境介绍

以下时需要准备的环境,编译器和达梦数据库的安装这里不再赘述

  1. 编译器:GoLand 2020.1 x64
  2. MSI: go1.15.6.windows-amd64.msi
  3. 数据库:DM8 达梦数据库企业版(安装在中标麒麟上)

准备工作

  1. 关闭数据库服务器的防火墙
  2. 关闭goland所在机器的防火墙
  3. 两台机器能够互相ping通
  4. 启动DM8服务器服务

话不多说,show code

package main
import (
	"database/sql"
	"fmt"
	"github.com/howeyc/gopass"
	"golang.org/x/crypto/ssh"
	"golang.org/x/crypto/ssh/terminal"
	"log"
	"net"
	"os"
	"time"
	"unsafe"
)

func main() {
	//连接数据库
	runAsTerminal("cd /home/dmdba/dmdbms/bin/; ./DmServiceDMSERVER start")
}


func runAsTerminal( cmd string)  {
	session, _ := ConnectSSH()
	defer session.Close()

	fd := int(os.Stdin.Fd())
	oldState, err := terminal.MakeRaw(fd)
	if err != nil {
		panic(err)
	}
	defer terminal.Restore(fd, oldState)

	// excute command
	session.Stdout = os.Stdout
	session.Stderr = os.Stderr
	session.Stdin = os.Stdin

	//解决无效句柄的问题
	fd = int(os.Stdout.Fd())

	termWidth, termHeight, err1 := terminal.GetSize(fd)
	if err1 != nil {
		panic(err1)
	}

	// Set up terminal modes
	modes := ssh.TerminalModes{
		ssh.ECHO:  1, // enable echoing
		ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
		ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
	}

	// Request pseudo terminal
	if err2 := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err2 != nil {
		log.Fatal(err2)
	}

	session.Run(cmd)
}

//连接远程机器
func ConnectSSH() (*ssh.Session, error) {

	var input,input1, password string

	fmt.Print("请输入远程服务器的ip: ")
	fmt.Scanf("%s\n",&input)
	host := input


	fmt.Print("请输入远程服务器的用户名: ")
	fmt.Scanf("%s\n",&input1)
	user := input1

	fmt.Print("请输入远程服务器的密码: ")
	passwd, err2 := gopass.GetPasswd()

	port := 22
	if err2 != nil{
		fmt.Printf("%s", err2)
	}else{
		password = bytes2str(passwd)
	}
	var (
		auth  []ssh.AuthMethod
		addr  string
		clientConfig *ssh.ClientConfig
		client *ssh.Client
		session *ssh.Session
		err  error
	)
	// get auth method
	auth = make([]ssh.AuthMethod, 0)
	auth = append(auth, ssh.Password(password))

	clientConfig = &ssh.ClientConfig{
		User:    user,
		Auth:    []ssh.AuthMethod{
			ssh.Password(password),
		},
		Timeout: 30 * time.Second,
		HostKeyCallback:func(hostname string, remote net.Addr, key ssh.PublicKey) error {
			return nil
		},
	}

	// connet to ssh
	addr = fmt.Sprintf("%s:%d", host, port)

	if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
		return nil, err
	}

	// create session
	if session, err = client.NewSession(); err != nil {
		return nil, err
	}

	return session, nil
}

func bytes2str(b []byte) string {
	return *(*string)(unsafe.Pointer(&b))
}

看看效果

可以启动达梦数据库
可以远程启动达梦数据库!!!

也可以远程交互

runAsTerminal("cd /home/dmdba/dmdbms/bin/; ./disql sysdba/dameng123")

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值