Go言語でサーバのバックアップの仕組みを作ろう。ファイルの更新編

先日から勉強を兼ねて書いているSambaのサーバからLANの他のパソコンにファイルをコピーするプログラムだけど、

書いている時に気がついたけど、

Go言語でSSHでSambaサーバに接続できたとしても、

ローカルマシンの様にWalkは使えないんじゃね?って。


端末からリモートアクセスしたら、

コマンドかシェルスクリプトしか使えないんじゃないか?

ということで、バックアップの仕組みは軌道修正。


Sambaサーバで夜のうちにディレクトリをまとめてZipファイルとしておき、

他のパソコンが起動した時に自動でSambaサーバのZipファイルをダウンロードする

ということにしよう。


となると、

バックアップ用のマシンで行いたいことは、

起動したら、SSHで接続して、コマンドでZIpファイルをダウンロードかな。


ということで、

Go言語でSSHで接続して、コマンドを実行するというコードを書いてみよう。




Go言語でSSHの接続をするために、sshパッケージを利用することにした。

※go get〜は省略

ssh - GoDoc


とりあえず、

練習がてらリモートアクセスして、ホームディレクトリに空のファイルを生成するコマンドを実行してみる。


package main

import (
	"log"

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

func main() {
	ip := "***.***.***.***"  //サーバのアドレス
	port := "22"  //ポート番号は文字列で指定
	user := "saito"  //ユーザ名
	pass := "***********"  //パスワード

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

	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")
}

リモートアクセスした直後に空のファイル(empty.txt)を作成して、

速攻で接続を切るというコードが書けたわけで、

このコードを実行してみて、サーバを確認してみると


saito@***.***.***.***:/home$ tree saito
saito
└── empty.txt

0 directories, 1 file

ホームディレクトリ直下に0バイトのempty.txtが生成されていた。


これでコマンドが実行できることはわかった。

これを元に作戦会議だ。