成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:219日期:2023-10-24 15:56:55

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

package mainimport ('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 bytetype remoteShellType byte const (cmdLine remoteScriptType = iotarawScriptscriptFile interactiveShell remoteShellType = iotanonInteractiveShell) 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 parametermysql.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 dbn')if rows, err := db.Query('SELECT id, name FROM table ORDER BY id'); err == nil {for rows.Next() {var id int64var name stringrows.Scan(&id, &name)fmt.Printf('ID: %d Name: %sn', 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 keyfunc 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.Dialfunc 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 clientfunc (c *Client) Cmd(cmd string) *remoteScript {return &remoteScript{_type: cmdLine,client: c.client,script: bytes.NewBufferString(cmd + 'n'),}} // Scriptfunc (c *Client) Script(script string) *remoteScript {return &remoteScript{_type: rawScript,client: c.client,script: bytes.NewBufferString(script + 'n'),}} // ScriptFilefunc (c *Client) ScriptFile(fname string) *remoteScript {return &remoteScript{_type: scriptFile,client: c.client,scriptFile: fname,}} type remoteScript struct {client *ssh.Client_type remoteScriptTypescript *bytes.BufferscriptFile stringerr error stdout io.Writerstderr io.Writer} // Runfunc (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.Bufferrs.stdout = &outerr := 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.Bufferstderr bytes.Buffer)rs.stdout = &stdoutrs.stderr = &stderrerr := 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 = stdoutrs.stderr = stderrreturn rs} func (rs *remoteScript) runCmd(cmd string) error {session, err := rs.client.NewSession()if err != nil {return err}defer session.Close() session.Stdout = rs.stdoutsession.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.scriptsession.Stdout = rs.stdoutsession.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.Bufferfile, err := os.Open(rs.scriptFile)if err != nil {return err}_, err = io.Copy(&buffer, file)if err != nil {return err} rs.script = &bufferreturn rs.runScript()} type remoteShell struct {client *ssh.ClientrequestPty boolterminalConfig *TerminalConfig stdin io.Readerstdout io.Writerstderr io.Writer} type TerminalConfig struct {Term stringHight intWeight intModes 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 = stdinrs.stdout = stdoutrs.stderr = stderrreturn rs} // Start start a remote shell on clientfunc (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.terminalConfigif 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}

補(bǔ)充:用golang寫socks5代理服務(wù)器2-ssh遠(yuǎn)程代理

上次用golang來實(shí)現(xiàn)本地socks5代理,然而使用代理當(dāng)然是為了和諧上網(wǎng),所以這次來介紹用ssh來實(shí)現(xiàn)遠(yuǎn)程代理,用到官方ssh包

golang.org/x/crypto/ssh

用golang連接ssh并不難

讀取密鑰,設(shè)置配置,連接服務(wù)器就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('連接服務(wù)器成功') defer client.Close()

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

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)

下面是能成功運(yùn)行并進(jìn)行遠(yuǎn)程代理的代碼(在Chrome和proxychains測(cè)試),ssh服務(wù)器和配置信息要修改為自己的

// socks5ProxyProxy project main.gopackage 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('請(qǐng)求解析錯(cuò)誤') 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('一個(gè)新連接') 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('連接服務(wù)器成功') defer client.Close() client.Dial() socks5ProxyStart() return}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
小嫩嫩精品导航| 成人精品视频.| 国产成人在线电影| 在线看一区二区| 日本91福利区| 91久久人澡人人添人人爽欧美| 亚洲图片欧美视频| 亚洲伊人网站| 亚洲一区二区三区影院| 亚洲国产免费看| ...中文天堂在线一区| 91免费看视频| 国产色产综合色产在线视频| 欧美在线视频二区| 久久精品一区二区三区不卡| 91丨porny丨国产| 国产欧美精品一区二区三区四区 | 99在线精品免费视频九九视| 国产精品久久久久久久浪潮网站 | 国模套图日韩精品一区二区 | aa日韩免费精品视频一| 亚洲欧美日本韩国| av不卡在线| 亚洲一区二区三区四区不卡| 免费欧美在线| 日韩精品午夜视频| 欧美性大战久久久久久久| 久久国产精品99久久久久久老狼| 欧美精品久久一区| 成人在线视频一区二区| 精品精品欲导航| 色综合天天做天天爱| 国产精品网站导航| 一区二区精品国产| 午夜精品久久久久久久99樱桃| 色老头久久综合| 国产一区二区三区蝌蚪| 日韩欧美中文一区二区| 欧美 日韩 国产 一区| 亚洲人亚洲人成电影网站色| 亚洲影音先锋| 久久99久久精品欧美| 日韩精品一区在线观看| 欧美精品一级| 亚洲综合色网站| 欧美在线视频日韩| 成人免费av网站| 成人免费在线播放视频| 亚洲一区二区三区欧美| 蜜桃av噜噜一区二区三区小说| 欧美一区午夜视频在线观看| 你懂的国产精品| 亚洲精品成人a在线观看| 在线看国产一区二区| 成人久久18免费网站麻豆| 成人欧美一区二区三区小说| 日本乱人伦一区| 成人精品小蝌蚪| 亚洲人成在线播放网站岛国| 欧美写真视频网站| www.66久久| 亚洲综合色婷婷| 在线91免费看| 国内在线观看一区二区三区| 日本欧美久久久久免费播放网| 欧美大片日本大片免费观看| 亚洲韩日在线| 九九**精品视频免费播放| 久久综合久久综合亚洲| 亚洲每日更新| 精品一区二区三区影院在线午夜 | 久久久久久久久久久99999| 99国产精品视频免费观看一公开| 热久久免费视频| 久久亚洲一区二区三区明星换脸| 国产精品亚洲欧美| 国产成a人亚洲精品| 亚洲视频网在线直播| 欧美日韩国产乱码电影| 亚洲无线视频| 久久精品国产一区二区三 | 欧美日韩免费视频| 欧美日本二区| 美女尤物国产一区| 亚洲国产精品v| 色美美综合视频| 午夜精品一区二区三区四区| 日韩vs国产vs欧美| 国产亚洲精久久久久久| 久久久久一区二区三区| 成人免费视频播放| 亚洲国产美女搞黄色| 2014亚洲片线观看视频免费| 国产亚洲一区在线| www.在线成人| 婷婷成人激情在线网| 久久女同精品一区二区| 久久精品主播| 欧美激情无毛| 狠狠色2019综合网| 一区二区在线观看不卡| 精品免费日韩av| 91久久国产最好的精华液| 亚洲午夜精品福利| 国产99久久久精品| 偷拍一区二区三区四区| 亚洲国产精品精华液ab| 7777精品伊人久久久大香线蕉超级流畅| 日韩亚洲欧美精品| av在线不卡免费看| 久久97超碰国产精品超碰| 亚洲裸体在线观看| 2021中文字幕一区亚洲| 欧美日韩亚洲国产综合| 国产视频一区三区| 欧美一区二区三区在线播放| 国内精品在线播放| 香蕉成人伊视频在线观看| 国产精品日产欧美久久久久| 日韩一区二区免费视频| 欧洲精品在线观看| 国产日产精品一区二区三区四区的观看方式| 成人国产精品免费观看视频| 日本色综合中文字幕| 亚洲精品成人少妇| 日本一区二区三区电影| 日韩一区二区在线看| 在线免费观看日本一区| 国产精品毛片va一区二区三区| 欧美精品成人| 成人手机电影网| 精品亚洲欧美一区| 日日夜夜免费精品| 一个色在线综合| 国产精品三级电影| 久久婷婷色综合| 欧美一区二区三区婷婷月色| 欧美性猛片xxxx免费看久爱| 另类激情亚洲| 日韩午夜电影| 国户精品久久久久久久久久久不卡| 成人动漫一区二区| 国产精品一级片| 精品一区二区三区的国产在线播放 | 粉嫩绯色av一区二区在线观看 | 欧美日韩影院| av电影天堂一区二区在线观看| 久久99国产精品久久| 天天爽夜夜爽夜夜爽精品视频| 樱桃国产成人精品视频| 综合久久久久久| 中文字幕一区二区三区四区不卡 | 欧美精品久久久久久久多人混战| 一本到三区不卡视频| 麻豆亚洲精品| 国产毛片一区| 国产精品亚洲综合久久| 一区二区三区精品视频在线观看| 国产主播一区| 亚洲午夜精品一区二区| 午夜精品影院| 欧美日本二区| 色综合视频在线观看| 96av麻豆蜜桃一区二区| 99久久综合国产精品| 99久久精品久久久久久清纯| 99久久亚洲一区二区三区青草| 成人avav影音| 成人av在线资源网| 99久久99久久精品国产片果冻| 99re8在线精品视频免费播放| 99免费精品视频| 欧美激情1区2区| 欧美大片专区| 国产字幕视频一区二区| 亚洲大胆在线| 99精品免费网| 国产精品视频福利| 另类av一区二区| 91久久精品午夜一区二区| 欧美亚洲另类激情小说| 欧美精品在线观看播放| 欧美一区二区三区播放老司机 | 亚洲男同性视频| 亚洲一区二区三区影院| 亚洲chinese男男1069| 日本亚洲免费观看| 久久99精品久久久久婷婷| 国产高清无密码一区二区三区| 成人激情文学综合网| 午夜视频精品| 99riav国产精品| 久久资源在线| 欧美视频中文字幕| 欧美一区二区三级| 久久精品水蜜桃av综合天堂| 国产精品亲子伦对白| 一区二区三区四区精品在线视频| 香蕉久久夜色精品国产使用方法 | k8久久久一区二区三区 |