Go言語でサーバのバックアップの仕組みを作ろう。SSH編

前回、Go言語でSSHでリモートアクセスするコードを書いた。


とは言っても、

パスワード形式だけだと使えないサーバが多いだろうから

認証鍵によるアクセスのコードも調べてみる。


package main

import (
	"log"

	"golang.org/x/crypto/ssh"
)

func main() {
	ip := "***.***.***.***"  //サーバのアドレス
	port := "22"  //ポート番号は文字列で指定
	user := "saito"  //ユーザ名
	//パスワードは削除
	
	buf, err := ioutil.ReadFile("/認証鍵を格納しているディレクトリのパス/id_rsa.pem")
        if err != nil {
	        panic(err)
	}
        key, err := ssh.ParsePrivateKey(buf)
	if err != nil {
                panic(err)
        }

	config := &ssh.ClientConfig{
	        User: user,
	        Auth: []ssh.AuthMethod{
		        ssh.PublicKeys(key),
	        },
        }

	conn, err := ssh.Dial("tcp", ip+":"+port, config)
	if err != nil {
		log.Println(err)
	}
	defer conn.Close()

	session, err := conn.NewSession()
	if err != nil {
		log.Println(err)
	}
	defer session.Close()

	//空のファイルを作成する
	session.Run("echo -n > empty.txt")
}

認証鍵のパスを指定してReadFileで読み込む。

読み込んだバッファをパースして、公開鍵としてセットする。


ここで注意すべき点は、

自身のマシンに入っている秘密鍵はid_rsaからid_rsa.pemにしておく必要があるので、

端末で下記のコマンドを実行する。


id_rsaのディレクトリに移動して、

openssl rsa -in id_rsa -outform pem >id_rsa.pem

を実行。


ここまで出来たらパスワード認証と同じ要領で、TCPでDialして接続する。


このコードでとりあえず、

指定のサーバに空のファイルはできました。


さてさて、

この後、どうするかな…?