成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_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国内精品久久久久久久
久久免费国产| 久国产精品韩国三级视频| 午夜精品久久久久久久99水蜜桃| 欧美日韩亚洲在线| 久久久久97国产精华液好用吗| 在线中文字幕不卡| 亚洲精品福利视频网站| 激情久久久久| 国产精品伦理一区二区| 国产一区欧美| 亚洲蜜臀av乱码久久精品蜜桃| 欧美三级黄美女| 亚洲综合久久久久| 欧美三级中文字| 亚洲高清在线精品| 亚洲专区在线| 亚洲国产精品久久艾草纯爱| 伊人婷婷久久| 国产精品国产a级| 国产一区视频在线观看免费| 久久免费视频一区| 99久久精品国产导航| 久久综合中文字幕| 97se亚洲国产综合自在线| 精品99久久久久久| 91香蕉视频在线| 丝袜诱惑制服诱惑色一区在线观看| 欧美一区二区在线| 国产视频不卡一区| 狠狠综合久久| 亚洲综合免费观看高清完整版在线 | 99riav一区二区三区| 日韩欧美专区在线| 不卡免费追剧大全电视剧网站| 欧美xxxxxxxxx| 99久久婷婷国产| 国产精品美女www爽爽爽| 亚洲高清在线播放| 视频一区二区不卡| 欧美精品丝袜中出| 成人黄色软件下载| 国产精品青草久久| 午夜在线精品| 青草国产精品久久久久久| 欧美日韩在线精品一区二区三区激情| 国产精品自拍毛片| 久久久久久久久久看片| 亚洲亚洲精品三区日韩精品在线视频| 亚洲免费观看高清在线观看| 鲁大师成人一区二区三区| 激情文学综合插| 国产日韩欧美综合在线| 妖精视频成人观看www| 日产国产欧美视频一区精品| 欧美精品乱人伦久久久久久| 成人sese在线| 亚洲婷婷在线视频| 色猫猫国产区一区二在线视频| 日本欧美一区二区在线观看| 日韩欧美国产一二三区| 狠狠综合久久av一区二区老牛| 亚洲精品国产高清久久伦理二区| 久久精品五月| 国产激情一区二区三区桃花岛亚洲| 国产人久久人人人人爽| 香蕉亚洲视频| 国产精品一卡二| 国产精品久久一卡二卡| 久久精品一二三区| 成人一区二区视频| 欧美日韩在线不卡| 欧美一区二区三区久久精品| 洋洋av久久久久久久一区| 欧美日韩国产高清一区二区| 99国产精品国产精品久久| 一区二区三区**美女毛片| 精品视频在线免费观看| 99re视频这里只有精品| 亚洲综合丁香婷婷六月香| 在线观看91av| 黄色成人在线网站| 免费成人在线影院| 国产亚洲欧美中文| 老色鬼久久亚洲一区二区| 成人在线一区二区三区| 亚洲主播在线播放| 欧美变态口味重另类| 国产精品乱子乱xxxx| 顶级嫩模精品视频在线看| 亚洲另类春色国产| 日韩一卡二卡三卡国产欧美| 亚洲精品在线二区| 久久99久久精品| 亚洲欧洲国产专区| 欧美日韩成人一区| 狠狠久久婷婷| 国产在线国偷精品免费看| 综合欧美亚洲日本| 欧美另类videos死尸| 亚洲黄色精品| 成人在线综合网| 亚洲综合av网| 国产清纯美女被跳蛋高潮一区二区久久w | 亚洲一区日韩精品中文字幕| 6080亚洲精品一区二区| 亚洲深夜激情| 色综合咪咪久久| 欧美久久婷婷综合色| 欧美激情aⅴ一区二区三区| 免费观看91视频大全| 国产欧美一区二区精品秋霞影院| 色偷偷久久一区二区三区| 欧美日韩1区| 久久精品国产亚洲a| 欧美日韩国产首页| 黄色av日韩| 国产不卡视频一区二区三区| 亚洲综合男人的天堂| 久久综合资源网| 欧美三级中文字| 国产日韩在线一区二区三区| 99国产精品视频免费观看| 老司机免费视频一区二区三区| 亚洲欧洲日韩一区二区三区| 精品奇米国产一区二区三区| 91国产成人在线| 99在线|亚洲一区二区| 女人香蕉久久**毛片精品| 国模套图日韩精品一区二区| 亚洲一区av在线| 国产精品久久久久婷婷| 精品久久五月天| 欧美日韩一区不卡| 亚洲一区二区三区精品视频| 欧美精品1区| 成人av在线一区二区三区| 激情久久五月天| 三级不卡在线观看| 亚洲激情图片qvod| 国产亚洲精品福利| 日韩精品一区二| 制服丝袜亚洲精品中文字幕| 色美美综合视频| 亚洲一区二区三区精品动漫 | 国产成人精品一区二区三区四区| 亚洲3atv精品一区二区三区| 国产精品国产自产拍高清av| 欧美成人伊人久久综合网| 欧美日本一区二区| 欧美性受xxxx| 狼狼综合久久久久综合网| 亚洲综合社区| aa成人免费视频| 亚洲茄子视频| 在线观看亚洲| 在线精品亚洲| 亚洲国产精品一区| 亚洲婷婷免费| 激情亚洲网站| 在线观看成人av| 欧美日韩一区在线观看视频| 91麻豆高清视频| 欧美国产视频在线观看| 99综合影院在线| 不卡的av在线| 成人app在线| 成人一区二区三区在线观看| 国产毛片一区二区| 国产一区二区三区在线观看免费视频| 免费观看久久久4p| 麻豆精品一区二区av白丝在线| 麻豆免费精品视频| 极品尤物av久久免费看| 久久99国产精品久久| 精品一区二区三区香蕉蜜桃| 蜜桃一区二区三区在线观看| 久久精品国产亚洲aⅴ| 狠狠色丁香久久婷婷综| 国产综合久久久久影院| 国产精品一区二区果冻传媒| 国产乱理伦片在线观看夜一区| 国产精品123| 99视频热这里只有精品免费| 91玉足脚交白嫩脚丫在线播放| 91免费视频网| 狠狠综合久久| 国产一区二区精品| 久久精品国产清高在天天线| 欧洲视频一区二区| 91精品欧美综合在线观看最新| 欧美一级日韩免费不卡| 精品福利一区二区三区免费视频| 久久久99久久| 亚洲色图制服丝袜| 午夜精品国产更新| 精彩视频一区二区三区| 成人ar影院免费观看视频| 国产精品a级| 国产日韩欧美一区二区| 色狠狠一区二区|