婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang 通過ssh代理連接mysql的操作

golang 通過ssh代理連接mysql的操作

熱門標簽:杭州人工智能電銷機器人費用 江蘇呼叫中心外呼系統有效果嗎 400開頭電話怎樣申請 利用地圖標注位置 貴州電話智能外呼系統 官渡電銷外呼管理系統怎么收費 赤峰電銷 地圖區域圖標注后導出 谷歌美發店地圖標注

我就廢話不多說了,大家還是直接看代碼吧~

package main
import (
	"bytes"
	"context"
	"database/sql"
	"errors"
	"fmt"
	"github.com/go-sql-driver/mysql"
	"golang.org/x/crypto/ssh"
	"io"
	"io/ioutil"
	"net"
	"os"
)
type ViaSSHDialer struct {
	client *ssh.Client
	_ *context.Context
}
 
func (self *ViaSSHDialer) Dial(context context.Context,addr string) (net.Conn, error) {
	return self.client.Dial("tcp", addr)
}
type remoteScriptType byte
type remoteShellType byte
 
const (
	cmdLine remoteScriptType = iota
	rawScript
	scriptFile 
	interactiveShell remoteShellType = iota
	nonInteractiveShell
)
 
type Client struct {
	client *ssh.Client
}
func main() {
	client, err := DialWithPasswd("ip:port", "user", "password")
	if err != nil {
		panic(err)
	}
	out, err := client.Cmd("ls -l").Output()
	if err != nil {
		panic(err)
	}
	fmt.Println(string(out))
	// Now we register the ViaSSHDialer with the ssh connection as a parameter
	mysql.RegisterDialContext("mysql+tcp", (ViaSSHDialer{client.client,nil}).Dial)
	//mysql.RegisterDial("mysql+tcp", (ViaSSHDialer{client.client}).Dial)
	if db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@mysql+tcp(%s)/%s","Aiqitest", "uf6amk146d2aoemi7", "139.196.174.234:3306", "Aiqitest"));
	err == nil {
		fmt.Printf("Successfully connected to the db\n")
		if rows, err := db.Query("SELECT id, name FROM table ORDER BY id"); err == nil {
			for rows.Next() {
				var id int64
				var name string
				rows.Scan(id, name)
				fmt.Printf("ID: %d Name: %s\n", id, name)
			}
			rows.Close()
		} else {
			fmt.Printf("Failure: %s", err.Error())
		}
 
		db.Close()
}
	}
 
// DialWithPasswd starts a client connection to the given SSH server with passwd authmethod.
func DialWithPasswd(addr, user, passwd string) (*Client, error) {
	config := ssh.ClientConfig{
		User: user,
		Auth: []ssh.AuthMethod{
			ssh.Password(passwd),
		},
		HostKeyCallback: ssh.HostKeyCallback(func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }),
	}
 
	return Dial("tcp", addr, config)
}
 
// DialWithKey starts a client connection to the given SSH server with key authmethod.
func DialWithKey(addr, user, keyfile string) (*Client, error) {
	key, err := ioutil.ReadFile(keyfile)
	if err != nil {
		return nil, err
	}
 
	signer, err := ssh.ParsePrivateKey(key)
	if err != nil {
		return nil, err
	}
 
	config := ssh.ClientConfig{
		User: user,
		Auth: []ssh.AuthMethod{
			ssh.PublicKeys(signer),
		},
		HostKeyCallback: ssh.HostKeyCallback(func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }),
	}
 
	return Dial("tcp", addr, config)
}
 
// DialWithKeyWithPassphrase same as DialWithKey but with a passphrase to decrypt the private key
func DialWithKeyWithPassphrase(addr, user, keyfile string, passphrase string) (*Client, error) {
	key, err := ioutil.ReadFile(keyfile)
	if err != nil {
		return nil, err
	}
 
	signer, err := ssh.ParsePrivateKeyWithPassphrase(key, []byte(passphrase))
	if err != nil {
		return nil, err
	}
 
	config := ssh.ClientConfig{
		User: user,
		Auth: []ssh.AuthMethod{
			ssh.PublicKeys(signer),
		},
		HostKeyCallback: ssh.HostKeyCallback(func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }),
	} 
	return Dial("tcp", addr, config)
}
 
// Dial starts a client connection to the given SSH server.
// This is wrap the ssh.Dial
func Dial(network, addr string, config *ssh.ClientConfig) (*Client, error) {
	client, err := ssh.Dial(network, addr, config)
	if err != nil {
		return nil, err
	}
	return Client{
		client: client,
	}, nil
}
 
func (c *Client) Close() error {
	return c.client.Close()
}
 
// Cmd create a command on client
func (c *Client) Cmd(cmd string) *remoteScript {
	return remoteScript{
		_type: cmdLine,
		client: c.client,
		script: bytes.NewBufferString(cmd + "\n"),
	}
}
 
// Script
func (c *Client) Script(script string) *remoteScript {
	return remoteScript{
		_type: rawScript,
		client: c.client,
		script: bytes.NewBufferString(script + "\n"),
	}
}
 
// ScriptFile
func (c *Client) ScriptFile(fname string) *remoteScript {
	return remoteScript{
		_type:   scriptFile,
		client:   c.client,
		scriptFile: fname,
	}
}
 
type remoteScript struct {
	client   *ssh.Client
	_type   remoteScriptType
	script   *bytes.Buffer
	scriptFile string
	err    error
 
	stdout io.Writer
	stderr io.Writer
}
 
// Run
func (rs *remoteScript) Run() error {
	if rs.err != nil {
		fmt.Println(rs.err)
		return rs.err
	}
 
	if rs._type == cmdLine {
		return rs.runCmds()
	} else if rs._type == rawScript {
		return rs.runScript()
	} else if rs._type == scriptFile {
		return rs.runScriptFile()
	} else {
		return errors.New("Not supported remoteScript type")
	}
}
 
func (rs *remoteScript) Output() ([]byte, error) {
	if rs.stdout != nil {
		return nil, errors.New("Stdout already set")
	}
	var out bytes.Buffer
	rs.stdout = out
	err := rs.Run()
	return out.Bytes(), err
}
 
func (rs *remoteScript) SmartOutput() ([]byte, error) {
	if rs.stdout != nil {
		return nil, errors.New("Stdout already set")
	}
	if rs.stderr != nil {
		return nil, errors.New("Stderr already set")
	}
 
	var (
		stdout bytes.Buffer
		stderr bytes.Buffer
	)
	rs.stdout = stdout
	rs.stderr = stderr
	err := rs.Run()
	if err != nil {
		return stderr.Bytes(), err
	}
	return stdout.Bytes(), err
}
 
func (rs *remoteScript) Cmd(cmd string) *remoteScript {
	_, err := rs.script.WriteString(cmd + "\n")
	if err != nil {
		rs.err = err
	}
	return rs
}
 
func (rs *remoteScript) SetStdio(stdout, stderr io.Writer) *remoteScript {
	rs.stdout = stdout
	rs.stderr = stderr
	return rs
}
 
func (rs *remoteScript) runCmd(cmd string) error {
	session, err := rs.client.NewSession()
	if err != nil {
		return err
	}
	defer session.Close()
 
	session.Stdout = rs.stdout
	session.Stderr = rs.stderr
 
	if err := session.Run(cmd); err != nil {
		return err
	}
	return nil
}
 
func (rs *remoteScript) runCmds() error {
	for {
		statment, err := rs.script.ReadString('\n')
		if err == io.EOF {
			break
		}
		if err != nil {
			return err
		}
 
		if err := rs.runCmd(statment); err != nil {
			return err
		}
	}
 
	return nil
}
 
func (rs *remoteScript) runScript() error {
	session, err := rs.client.NewSession()
	if err != nil {
		return err
	}
 
	session.Stdin = rs.script
	session.Stdout = rs.stdout
	session.Stderr = rs.stderr 
	if err := session.Shell(); err != nil {
		return err
	}
	if err := session.Wait(); err != nil {
		return err
	}
 
	return nil
}
 
func (rs *remoteScript) runScriptFile() error {
	var buffer bytes.Buffer
	file, err := os.Open(rs.scriptFile)
	if err != nil {
		return err
	}
	_, err = io.Copy(buffer, file)
	if err != nil {
		return err
	}
 
	rs.script = buffer
	return rs.runScript()
}
 
type remoteShell struct {
	client     *ssh.Client
	requestPty   bool
	terminalConfig *TerminalConfig
 
	stdin io.Reader
	stdout io.Writer
	stderr io.Writer
}
 
type TerminalConfig struct {
	Term  string
	Hight int
	Weight int
	Modes ssh.TerminalModes
}
 
// Terminal create a interactive shell on client.
func (c *Client) Terminal(config *TerminalConfig) *remoteShell {
	return remoteShell{
		client:     c.client,
		terminalConfig: config,
		requestPty:   true,
	}
}
 
// Shell create a noninteractive shell on client.
func (c *Client) Shell() *remoteShell {
	return remoteShell{
		client:   c.client,
		requestPty: false,
	}
}
 
func (rs *remoteShell) SetStdio(stdin io.Reader, stdout, stderr io.Writer) *remoteShell {
	rs.stdin = stdin
	rs.stdout = stdout
	rs.stderr = stderr
	return rs
}
 
// Start start a remote shell on client
func (rs *remoteShell) Start() error {
	session, err := rs.client.NewSession()
	if err != nil {
		return err
	}
	defer session.Close()
 
	if rs.stdin == nil {
		session.Stdin = os.Stdin
	} else {
		session.Stdin = rs.stdin
	}
	if rs.stdout == nil {
		session.Stdout = os.Stdout
	} else {
		session.Stdout = rs.stdout
	}
	if rs.stderr == nil {
		session.Stderr = os.Stderr
	} else {
		session.Stderr = rs.stderr
	}
 
	if rs.requestPty {
		tc := rs.terminalConfig
		if tc == nil {
			tc = TerminalConfig{
				Term:  "xterm",
				Hight: 40,
				Weight: 80,
			}
		}
		if err := session.RequestPty(tc.Term, tc.Hight, tc.Weight, tc.Modes); err != nil {
			return err
		}
	}
 
	if err := session.Shell(); err != nil {
		return err
	}
 
	if err := session.Wait(); err != nil {
		return err
	} 
	return nil
}

補充:用golang寫socks5代理服務器2-ssh遠程代理

上次用golang來實現本地socks5代理,然而使用代理當然是為了和諧上網,所以這次來介紹用ssh來實現遠程代理,用到官方ssh包

golang.org/x/crypto/ssh

用golang連接ssh并不難

讀取密鑰,設置配置,連接服務器就ok了(不建議用用戶名+密碼方式連接ssh)

 b, err := ioutil.ReadFile("/home/myml/.ssh/id_rsa")
 if err != nil {
 log.Println(err)
 return
 }
 pKey, err := ssh.ParsePrivateKey(b)
 if err != nil {
 log.Println(err)
 return
 }
 config := ssh.ClientConfig{
 User: "userName",
 Auth: []ssh.AuthMethod{
  ssh.PublicKeys(pKey),
 },
 }
 client, err = ssh.Dial("tcp", "Host:22", config)
 if err != nil {
 log.Println(err)
 return
 }
 log.Println("連接服務器成功")
 defer client.Close()

這樣你就得到了一個client,它有個Dial()函數用來創建socket連接,這個是在服務器上創建的,也就可以突破網絡限制了,加上上次的sock5代理,把net.Dial改為client.Dial,就能讓服務器來代理訪問了

 server, err := client.Dial("tcp", addr)
 if err != nil {
 log.Println(err)
 return
 }
 conn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
 go io.Copy(server, conn)
 io.Copy(conn, server)

下面是能成功運行并進行遠程代理的代碼(在Chrome和proxychains測試),ssh服務器和配置信息要修改為自己的

// socks5ProxyProxy project main.go
package main 
import (
 "bytes"
 "encoding/binary"
 "fmt"
 "io"
 "io/ioutil"
 "log"
 "net" 
 "golang.org/x/crypto/ssh"
)
 
func socks5Proxy(conn net.Conn) {
 defer conn.Close()
 
 var b [1024]byte 
 n, err := conn.Read(b[:])
 if err != nil {
 log.Println(err)
 return
 }
 log.Printf("% x", b[:n]) 
 conn.Write([]byte{0x05, 0x00})
 
 n, err = conn.Read(b[:])
 if err != nil {
 log.Println(err)
 return
 }
 log.Printf("% x", b[:n])
 
 var addr string
 switch b[3] {
 case 0x01:
 sip := sockIP{}
 if err := binary.Read(bytes.NewReader(b[4:n]), binary.BigEndian, sip); err != nil {
  log.Println("請求解析錯誤")
  return
 }
 addr = sip.toAddr()
 case 0x03:
 host := string(b[5 : n-2])
 var port uint16
 err = binary.Read(bytes.NewReader(b[n-2:n]), binary.BigEndian, port)
 if err != nil {
  log.Println(err)
  return
 }
 addr = fmt.Sprintf("%s:%d", host, port)
 }
 
 server, err := client.Dial("tcp", addr)
 if err != nil {
 log.Println(err)
 return
 }
 conn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
 go io.Copy(server, conn)
 io.Copy(conn, server)
}
 
type sockIP struct {
 A, B, C, D byte
 PORT    uint16
}
 
func (ip sockIP) toAddr() string {
 return fmt.Sprintf("%d.%d.%d.%d:%d", ip.A, ip.B, ip.C, ip.D, ip.PORT)
}
 
func socks5ProxyStart() {
 log.SetFlags(log.Ltime | log.Lshortfile)
 
 server, err := net.Listen("tcp", ":8080")
 if err != nil {
 log.Panic(err)
 }
 defer server.Close()
 log.Println("開始接受連接")
 for {
 client, err := server.Accept()
 if err != nil {
  log.Println(err)
  return
 }
 log.Println("一個新連接")
 go socks5Proxy(client)
 }
}
 
var client *ssh.Client 
func main() {
 b, err := ioutil.ReadFile("/home/myml/.ssh/id_rsa")
 if err != nil {
 log.Println(err)
 return
 }
 pKey, err := ssh.ParsePrivateKey(b)
 if err != nil {
 log.Println(err)
 return
 }
 config := ssh.ClientConfig{
 User: "user",
 Auth: []ssh.AuthMethod{
  ssh.PublicKeys(pKey),
 },
 }
 client, err = ssh.Dial("tcp", "host:22", config)
 if err != nil {
 log.Println(err)
 return
 }
 log.Println("連接服務器成功")
 defer client.Close()
 client.Dial()
 socks5ProxyStart()
 return
}
 

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang中連接mysql數據庫
  • Golang操作MySql數據庫的完整步驟記錄
  • golang實現mysql數據庫事務的提交與回滾

標簽:武漢 鷹潭 松原 宜春 河池 保定 泰安 黔西

巨人網絡通訊聲明:本文標題《golang 通過ssh代理連接mysql的操作》,本文關鍵詞  golang,通過,ssh,代理,連接,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang 通過ssh代理連接mysql的操作》相關的同類信息!
  • 本頁收集關于golang 通過ssh代理連接mysql的操作的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久亚洲二区三区| 福利一区在线观看| 亚洲精品日韩综合观看成人91| 国产欧美日本一区视频| 久久久不卡网国产精品一区| 久久综合色婷婷| 国产欧美视频一区二区| 国产精品美女久久久久久2018| 国产精品欧美综合在线| 亚洲久草在线视频| 午夜视频一区在线观看| 日本美女一区二区三区| 麻豆精品一二三| 国产综合色在线| youjizz国产精品| 欧美午夜不卡视频| 日韩欧美国产午夜精品| 久久久精品欧美丰满| 中文字幕亚洲一区二区va在线| 国产丶欧美丶日本不卡视频| 国产麻豆精品视频| 99九九99九九九视频精品| 欧美午夜一区二区三区 | 日韩二区三区四区| 紧缚捆绑精品一区二区| av成人老司机| 91精品婷婷国产综合久久性色 | 日韩三级在线免费观看| 精品嫩草影院久久| 日韩毛片精品高清免费| 视频在线观看一区二区三区| 国产一区在线观看麻豆| 在线观看视频一区| 欧美成人激情免费网| 亚洲精品视频在线观看免费| 蜜乳av一区二区| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美日韩日日夜夜| 国产精品欧美一区喷水| 蜜臀91精品一区二区三区| 不卡的av在线播放| 日韩欧美精品在线视频| 中文字幕综合网| 国产酒店精品激情| 欧美亚洲一区三区| 国产精品高潮久久久久无| 蜜桃精品视频在线| 欧美性三三影院| 中文字幕一区日韩精品欧美| 国产在线一区二区| 欧美一区二区三区思思人| 亚洲精品综合在线| 成人a免费在线看| 久久先锋资源网| 免费高清不卡av| 欧美日韩精品福利| 亚洲一卡二卡三卡四卡| 成人av资源在线| 久久精品人人爽人人爽| 麻豆一区二区在线| 欧美一区二区在线看| 午夜私人影院久久久久| 欧美视频自拍偷拍| 亚洲国产cao| 欧美视频一区在线| 亚洲第一成人在线| 色噜噜夜夜夜综合网| 亚洲精品视频在线观看免费| 99riav久久精品riav| 国产精品成人一区二区三区夜夜夜| 国产黑丝在线一区二区三区| wwwwxxxxx欧美| 国产盗摄一区二区| 国产精品久久久久三级| 9l国产精品久久久久麻豆| 中文字幕不卡一区| av在线不卡观看免费观看| 中文字幕一区二区三| 91麻豆自制传媒国产之光| 国产精品第一页第二页第三页| 成人av第一页| 一区二区三区丝袜| 欧美色国产精品| 三级影片在线观看欧美日韩一区二区| 欧美日韩在线播放三区| 日韩av中文在线观看| 2023国产精品| 99国产精品99久久久久久| 一区二区三区在线视频免费观看| 精品视频一区二区不卡| 蜜臀久久99精品久久久久宅男| 久久午夜羞羞影院免费观看| 国产电影一区二区三区| 一区二区三区精品在线观看| 欧美一区二区视频在线观看 | 国产精品女同一区二区三区| 97久久超碰精品国产| 亚洲18女电影在线观看| 精品国产伦一区二区三区观看方式| 福利91精品一区二区三区| 亚洲精品网站在线观看| 日韩午夜在线影院| 99精品视频一区二区三区| 天堂蜜桃一区二区三区 | 555夜色666亚洲国产免| 久久99精品国产麻豆婷婷洗澡| 国产精品美女久久久久久久网站| 欧美日韩你懂的| 国产精品99久久久久| 亚洲电影视频在线| 久久久精品影视| 欧美日韩不卡在线| 国产黄色成人av| 丝袜美腿成人在线| 国产精品的网站| 久久亚区不卡日本| 欧美欧美欧美欧美| 不卡av在线网| 精品午夜一区二区三区在线观看 | 国产午夜精品一区二区三区嫩草| 91浏览器在线视频| 国产精品一二三四五| 三级成人在线视频| 亚洲欧美色一区| 欧美韩国日本综合| 欧美一级片在线观看| 在线观看视频一区二区欧美日韩| 丰满放荡岳乱妇91ww| 蜜桃在线一区二区三区| 五月婷婷激情综合网| 亚洲男同1069视频| 中文字幕中文在线不卡住| 久久美女高清视频| 日韩视频一区二区三区在线播放| 91黄视频在线观看| 成人av在线播放网址| 国产成人自拍在线| 国产在线精品一区二区三区不卡| 男男gaygay亚洲| 日韩在线一二三区| 日韩国产在线一| 亚洲国产欧美在线| 亚洲一区二区三区美女| 亚洲品质自拍视频| 亚洲免费成人av| 亚洲国产精品久久不卡毛片| 一区二区成人在线| 亚洲精品欧美综合四区| 亚洲精品视频在线观看免费| 亚洲女性喷水在线观看一区| 亚洲精品综合在线| 一区二区三区四区视频精品免费| 亚洲欧美国产高清| 亚洲成精国产精品女| 日产国产欧美视频一区精品| 天堂久久一区二区三区| 美女视频网站黄色亚洲| 国内成人免费视频| 国产v综合v亚洲欧| 不卡的av网站| 欧美日韩一区二区不卡| 69av一区二区三区| 久久夜色精品国产噜噜av| 日本一区二区三区久久久久久久久不| 中文字幕免费不卡| 亚洲欧洲成人自拍| 午夜精品久久久久久久| 美女国产一区二区| av在线不卡网| 欧美一区二区视频观看视频| 精品99久久久久久| 综合中文字幕亚洲| 五月天一区二区三区| 国产九色sp调教91| 欧美体内she精高潮| 欧美va亚洲va| 亚洲三级在线免费| 免费人成精品欧美精品 | 国产福利视频一区二区三区| 91麻豆成人久久精品二区三区| 91超碰这里只有精品国产| 久久久久久久国产精品影院| 亚洲女子a中天字幕| 久久99精品国产.久久久久久| av在线播放一区二区三区| 欧美一区二区网站| 亚洲码国产岛国毛片在线| 久久精品免费观看| 91亚洲永久精品| 精品日产卡一卡二卡麻豆| 亚洲欧美偷拍三级| 国产成人午夜视频| 欧美另类videos死尸| 国产精品久久久久久妇女6080| 婷婷国产v国产偷v亚洲高清| 99精品久久只有精品| 久久日韩粉嫩一区二区三区| 丝袜亚洲另类欧美| www.av精品| 欧美激情在线一区二区三区|