日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:269日期: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}

補充:用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.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('請求解析錯誤') 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}

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

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
天堂成人国产精品一区| 水蜜桃久久夜色精品一区的特点| 日本综合精品一区| 欧美激情99| 99久久亚洲精品| 亚洲tv在线| 吉吉日韩欧美| 亚洲欧美在线综合| 精品国产免费人成网站| 中文字幕日韩欧美精品高清在线| 免费亚洲一区| 亚洲免费在线| 中文字幕在线视频网站| 日韩中出av| 久久男女视频| 国产午夜一区| 亚洲欧美久久| 欧美日韩免费观看视频| 日本视频一区二区| 国产在线欧美| 九九99久久精品在免费线bt| 国产手机视频一区二区| 高清av一区| 日韩区欧美区| 激情综合网五月| 国产成人精品一区二区免费看京| 亚洲九九精品| 午夜日韩av| 涩涩av在线| 国产精品www.| 玖玖精品视频| 99成人在线视频| 成人午夜毛片| 国产亚洲字幕| 中文字幕日韩欧美精品高清在线| 99精品综合| a国产在线视频| 国产欧美日韩视频在线| 中文字幕一区二区三区在线视频| 欧美高清一区| 日本精品影院| 国产欧美一区二区三区精品酒店| 精品一区二区三区免费看| 亚洲aⅴ网站| 好看的av在线不卡观看| 久久夜夜操妹子| 粉嫩av一区二区三区四区五区 | 日韩三区在线| 精品淫伦v久久水蜜桃| 国产欧美一级| 国产日韩高清一区二区三区在线 | 麻豆精品91| 久久久久久久久99精品大| 伊人久久视频| 手机在线电影一区| 日韩一区亚洲二区| 成人欧美一区二区三区的电影| 久久亚洲黄色| 精品国产精品国产偷麻豆| 国产精品激情| 欧美久久一区二区三区| 69堂免费精品视频在线播放| 爽好多水快深点欧美视频| 午夜久久美女| 国产亚洲毛片| 免费看黄色91| 日本不卡高清| 国产精品美女午夜爽爽| 91成人精品在线| 欧美激情三区| 久久精品国产免费| 日韩国产在线| 国产精品99一区二区| 精品1区2区3区4区| 免费黄网站欧美| 青草av.久久免费一区| 日韩超碰人人爽人人做人人添| 婷婷综合一区| 欧美久久一区二区三区| 黄色网一区二区| 日本午夜大片a在线观看| 日韩在线观看不卡| 午夜亚洲精品| 日本不卡高清| 精品欠久久久中文字幕加勒比| 蜜臀久久久久久久| 欧美精品aa| 日韩av首页| 人人爽香蕉精品| 国产另类在线| 欧美男人天堂| 蜜臀av国产精品久久久久 | 欧美另类专区| 日韩中文字幕在线一区| 精品视频91| 国产99亚洲| 亚洲69av| 日韩一区三区| 日韩一区网站| 水蜜桃精品av一区二区| 婷婷精品进入| 国产日韩欧美在线播放不卡| 亚洲天堂免费电影| 麻豆精品91| 精品久久视频| 影音先锋国产精品| 国产精品v一区二区三区| 欧美亚洲国产激情| 日韩精品亚洲aⅴ在线影院| 亚洲精品福利电影| 免费久久99精品国产| 韩国一区二区三区视频| 久久亚洲国产精品一区二区| 久久精品国产亚洲aⅴ| 一区免费在线| 国产精品tv| 欧美日韩国产在线一区| 欧美精品导航| 精品91久久久久| 国产成人精品免费视| av不卡在线| 久久免费精品| 亚州av日韩av| 欧美精选一区二区三区| 91精品麻豆| 亚洲欧美日韩国产| 日韩国产网站| 国精品产品一区| 日韩精品国产欧美| 一级欧洲+日本+国产| 久久久久伊人| 日韩精品欧美成人高清一区二区| 亚洲福利专区| 麻豆成人综合网| 伊人久久一区| 欧美+亚洲+精品+三区| 国产一区精品福利| 国产精品伦一区二区| 日本欧洲一区二区| 99精品视频在线| 久久精品国产网站| 日韩av中文字幕一区二区三区| 在线日韩av| 毛片在线网站| 国产极品一区| 日韩高清一级| 免费精品视频| 欧美 日韩 国产精品免费观看| 国产成人精选| 麻豆免费精品视频| 欧美日韩亚洲三区| 日韩激情网站| 蜜桃av一区二区三区电影| 国模 一区 二区 三区| av在线资源| 国产精品精品国产一区二区| 国产精品亚洲欧美日韩一区在线| 亚洲精品高潮| 免费美女久久99| 免费在线观看成人| 久久国产福利| 免费在线观看视频一区| 亚洲一区黄色| 亚洲欧美激情诱惑| 黄色日韩在线| 久久不射网站| 久久不射中文字幕| 麻豆精品网站| 日韩专区欧美专区| 久久一二三区| 亚洲精品在线a| 午夜电影一区| 欧美一区二区三区免费看| 日韩精品导航| 欧美一区在线观看视频| 欧美日韩91| 国产精品分类| 精品国产一区二区三区av片| 精品美女在线视频| 三上亚洲一区二区| 日韩天堂在线| 亚洲性色视频| 亚洲欧美日本国产专区一区| 久热精品在线| 69堂精品视频在线播放| 久久精品国产999大香线蕉| 麻豆久久一区| 中文字幕在线免费观看视频| 久久久久国产一区二区| 国产一区日韩欧美| 一区二区国产在线| 国产精品主播在线观看| 精品国产一区二区三区噜噜噜| 日韩电影免费在线观看| 99精品在线| 亚洲另类视频| 欧美黄页在线免费观看| 日韩高清不卡| 蜜臀av国产精品久久久久| 国产精品1luya在线播放|