婷婷综合国产,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精品国产美女浴室洗澡无遮挡| 不卡一区在线观看| 国产精品成人免费在线| 亚洲国产成人高清精品| 亚洲综合免费观看高清完整版在线| 欧美性一二三区| 欧美综合天天夜夜久久| 欧美羞羞免费网站| 3d动漫精品啪啪一区二区竹菊 | 欧美无乱码久久久免费午夜一区| 99视频在线精品| 欧美丰满美乳xxx高潮www| 91精品国产欧美一区二区成人| 26uuu精品一区二区| 亚洲免费观看在线观看| 日韩成人午夜精品| 成人丝袜高跟foot| 91精品国产欧美日韩| 国产亚洲1区2区3区| 亚洲精品自拍动漫在线| 国产很黄免费观看久久| 欧美日本不卡视频| 在线免费av一区| 精品国内二区三区| 久久影音资源网| 美国十次综合导航| 精品国产露脸精彩对白| 国产真实精品久久二三区| 久久蜜臀中文字幕| 免费高清视频精品| 欧美日本在线播放| 国产成人亚洲精品狼色在线| 美国欧美日韩国产在线播放| 国产精品私人影院| 亚洲国产裸拍裸体视频在线观看乱了 | 久久久久综合网| 亚洲一区在线视频观看| 国产麻豆精品在线观看| 日韩你懂的电影在线观看| 中文字幕亚洲一区二区va在线| 蜜桃av一区二区三区电影| 欧美中文字幕久久| 亚洲色图一区二区三区| 97国产一区二区| 欧美高清在线一区二区| 精品一二线国产| 欧美精品乱人伦久久久久久| 亚洲欧美日韩中文播放| 成人一道本在线| 18成人在线观看| 成人午夜视频网站| 欧美国产日产图区| 成人在线一区二区三区| 成人欧美一区二区三区1314| 91麻豆免费在线观看| 中文字幕综合网| voyeur盗摄精品| 亚洲高清在线精品| 26uuu欧美日本| 美国十次综合导航| 国产精品欧美久久久久一区二区| 成人理论电影网| 亚洲精品国产精品乱码不99| 欧美午夜精品一区二区三区| 狠狠狠色丁香婷婷综合久久五月| 国产精品传媒视频| 日本韩国一区二区| 国产精品99久久久久| 久久99蜜桃精品| 国产一区二区剧情av在线| 亚洲天堂免费在线观看视频| 国产在线精品一区在线观看麻豆| 日韩精品一级二级 | 亚洲欧美日韩人成在线播放| 国产日韩高清在线| 国产视频视频一区| 久久久777精品电影网影网| 欧美特级限制片免费在线观看| 成人av资源在线| av电影在线不卡| 欧美一级片在线观看| 精品成人a区在线观看| 午夜精品久久久久久久久久| 亚洲女爱视频在线| 久久9热精品视频| 国产精品888| 在线一区二区观看| 欧美va亚洲va香蕉在线| 精品国产91乱码一区二区三区| 精品三级在线观看| 国产欧美日韩中文久久| 中文字幕欧美一区| 午夜精品久久久久久久 | 国产东北露脸精品视频| 精品日韩在线观看| 激情国产一区二区| 欧美高清一级片在线| 中文av一区二区| 免费欧美在线视频| 丰满岳乱妇一区二区三区| 欧美日韩电影在线| 亚洲激情在线激情| 国内精品国产三级国产a久久| 色成人在线视频| 久88久久88久久久| 欧美成人欧美edvon| 一区二区三区免费观看| 欧美日韩电影在线| 成人欧美一区二区三区黑人麻豆| 国产69精品一区二区亚洲孕妇| 日韩视频一区二区三区在线播放| 美女视频黄久久| 国产精品丝袜一区| 亚洲另类色综合网站| 欧美老肥妇做.爰bbww| av电影天堂一区二区在线观看| 蜜臀a∨国产成人精品| 日韩有码一区二区三区| 日韩精品一二三四| 狠狠色丁香久久婷婷综合_中 | 日韩一级大片在线观看| 亚洲男帅同性gay1069| 久久91精品国产91久久小草| 欧美日韩日日摸| 久久99久久久欧美国产| 中文字幕+乱码+中文字幕一区| 国产激情偷乱视频一区二区三区| 亚洲人成伊人成综合网小说| 欧美日韩国产影片| 国产精品99精品久久免费| 亚洲青青青在线视频| 欧美一区二区三区免费| 粉嫩av一区二区三区| 亚洲国产一区二区a毛片| 久久久久99精品一区| 色妹子一区二区| 激情五月婷婷综合网| 国产精品中文字幕日韩精品| 亚洲精品国久久99热| 国产亚洲欧美日韩在线一区| 欧美午夜精品理论片a级按摩| 韩国欧美国产1区| 亚洲图片你懂的| 欧美成人一区二区三区在线观看| 91在线码无精品| 蜜桃av噜噜一区| 午夜影视日本亚洲欧洲精品| 日本一区二区三区在线不卡| 欧美人妖巨大在线| av日韩在线网站| 国产成人精品一区二区三区四区| 亚洲男人的天堂av| 国产亚洲一二三区| 日韩一区二区三区视频| 日本丶国产丶欧美色综合| 成人性生交大合| 精品影视av免费| 天天综合天天做天天综合| 91香蕉视频污在线| 国产成人一区二区精品非洲| 蜜臀av一区二区在线观看| 亚洲第四色夜色| 亚洲成人av中文| 亚洲午夜一区二区三区| 亚洲欧美日韩国产手机在线| 国产人成亚洲第一网站在线播放| 欧美一区二区在线免费观看| 在线欧美日韩国产| 91免费精品国自产拍在线不卡| 成人毛片在线观看| 成人丝袜18视频在线观看| 国产精品久久久久aaaa| 久久综合九色欧美综合狠狠| 精品成人在线观看| 91麻豆精品国产综合久久久久久| 99久免费精品视频在线观看| 国产精品一二三在| 国产成人免费在线观看不卡| 国产成人精品三级| 成人性生交大片免费看中文| 成人爱爱电影网址| 91麻豆6部合集magnet| 91福利在线观看| 在线精品视频一区二区| 欧美三级三级三级爽爽爽| 欧美肥妇bbw| 欧美一区午夜视频在线观看| 99久久99久久精品国产片果冻 | 日本一区二区不卡视频| 亚洲一区二区三区影院| 有码一区二区三区| 中文av一区二区| 精品欧美乱码久久久久久1区2区| 国产不卡视频在线观看| 奇米色777欧美一区二区| 一区二区在线看| 一区二区高清在线| 亚洲成人在线观看视频| 中文字幕亚洲一区二区va在线| 国产精品免费视频一区|