サーバーにあるwordpressのDBをバックアップしようと思い、sshを調べた。
ファイルの転送に手軽な方法がなかったため標準出力をファイルへ書き出すことに。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
package main import ( "io/ioutil" "log" "os" "golang.org/x/crypto/ssh" ) func main() { host := "" port := "" user := "" backupQuery := "mysqldumpする" downloadQuery := "catする" buf, err := ioutil.ReadFile("id_rsa.pem") //openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem if err != nil { log.Print(err) return } key, err := ssh.ParsePrivateKey(buf) if err != nil { log.Print(err) return } config := &ssh.ClientConfig{ User: user, Auth: []ssh.AuthMethod{ ssh.PublicKeys(key), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), } conn, err := ssh.Dial("tcp", host+":"+port, config) if err != nil { log.Print(err) return } defer conn.Close() backupSession, err := conn.NewSession() if err != nil { log.Print(err) return } remoteCmd(backupQuery, backupSession) downloadSession, err := conn.NewSession() if err != nil { log.Print(err) return } remoteCmd(downloadQuery, downloadSession) log.Print("done") } func remoteCmd(query string, session *ssh.Session) { defer session.Close() //リモートの標準出力をローカルの標準出力へ //session.Stdout = os.Stdout f, _ := os.Create("test.sql") session.Stdout = f session.Stderr = os.Stderr /* RunはWait付き。StartはWait無し 出力はsessionのStdio,Stderr sessionに付きコマンドは1度 */ if err := session.Run(query); err != nil { log.Print(err) return } } |