今天就跟大家聊聊有关怎么在golang中利用ssh代理连接mysql,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
package 主要 import ( “bytes" “context" “数据库/sql" “errors" “fmt" “;github.com/go-sql-driver/mysql" “;golang.org/x/crypto/ssh" “无力偿贷; “io/ioutil" “net" “os" ) type ViaSSHDialer struct { client * ssh.Client _ * context.Context } , func (self * ViaSSHDialer),刻度盘(context context.Context addr 字符串),(net.Conn,错误),{ return self.client.Dial (“tcp",, addr) } type remoteScriptType 字节 type remoteShellType 字节 , const ( cmdLine remoteScriptType =极微小 rawScript scriptFile interactiveShell remoteShellType =极微小 nonInteractiveShell ) , type Client struct { client * ssh.Client } func main (), { 客户,,err :=, DialWithPasswd (“ip: port",,“user",,“password") if err !=, nil { 恐慌(err) } ,,err :=, client.Cmd (“ls -l") .Output () if err !=, nil { 恐慌(err) } fmt.Println (string ())//,你register 我方表示歉意,ViaSSHDialer with 从而ssh connection as a 参数 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 用,db \ n") if 行,err :=, db.Query (“SELECT id, name 得到table ORDER BY id");, err ==, nil { for rows.Next (), { var id int64 var name 字符串 rows.Scan(和id,,,名字) fmt.Printf (“ID: % d 名称:,% s \ n",, ID,名称) } rows.Close () },{else fmt.Printf(“失败:% s",, err.Error ()) } , db.Close () } } ,//,DialWithPasswd starts a client connection 用,given SSH server with passwd authmethod。 func DialWithPasswd (addr,用户,passwd 字符串),(*客户,,错误),{ config :=,, ssh.ClientConfig { 用户:用户, 身份验证:[]ssh.AuthMethod { ssh.Password(密码), }, HostKeyCallback: ssh.HostKeyCallback (func(字符串,hostname remote net.Addr,, key ssh.PublicKey), error {, return nil }), } , return 刻度盘(addr,“tcp",,配置) } ,//,DialWithKey starts a client connection 用,given SSH server with key authmethod。 func DialWithKey (addr,用户,keyfile 字符串),(*客户,,错误),{ 键,,err :=, ioutil.ReadFile(密钥文件) if err !=, nil { return nil,犯错 } , 签名者,err :=, ssh.ParsePrivateKey(关键) if err !=, nil { return nil,犯错 } , config :=,, ssh.ClientConfig { 用户:用户, 身份验证:[]ssh.AuthMethod { ssh.PublicKeys(签名者), }, HostKeyCallback: ssh.HostKeyCallback (func(字符串,hostname remote net.Addr,, key ssh.PublicKey), error {, return nil }), } , return 刻度盘(addr,“tcp",,配置) } ,//,DialWithKeyWithPassphrase same as DialWithKey but with a passphrase 用decrypt 从而private 关键 func DialWithKeyWithPassphrase (addr,用户,keyfile 字符串,passphrase 字符串),(*客户,,错误),{ 键,,err :=, ioutil.ReadFile(密钥文件) if err !=, nil { return nil,犯错 } , 签名者,err :=, ssh.ParsePrivateKeyWithPassphrase(钥匙,,[]字节(密码)) if err !=, nil { return nil,犯错 } , config :=,, ssh.ClientConfig { 用户:用户, 身份验证:[]ssh.AuthMethod { ssh.PublicKeys(签名者), }, HostKeyCallback: ssh.HostKeyCallback (func(字符串,hostname remote net.Addr,, key ssh.PublicKey), error {, return nil }), }, return 刻度盘(addr,“tcp",,配置) } ,//,Dial starts a client connection 用,given SSH 服务器。//,却;能够is wrap 从而ssh.Dial null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null