材料以下。
とりあえず
*.pem を使って云々、という方向です。とりあえずソースの置き場所確保。
$ mkdir -p $GOPATH/src/github.com/yamanetoshi
ハロワ作ってみます。
$ mkdir -p $GOPATH/src/github.com/yamanetoshi/hello
以下な hello/hello.go を作成。
package main
import "fmt"
func main() {
fmt.Printf("Hello, world.\n")
}
で、go install
するのかな。
$ go install src/github.com/yamanetoshi/hello
で、実行。
$ $GOPATH/bin/hello
Hello, world.
成程。とりあえずコマンドラインから
- 鍵
- コピィ元
- コピィ先
を受け取って云々、なのですがディレクトリごとコピィってできるのか確認してみたくはあります。つうか $GOPATH/bin の中身が ELF なのってなにげに凄いな。
動くようにはなりましたが
ディレクトリごとコピィ、は無理らしい。とりあえず Github にアレしたコードが以下っす。
package main
import (
"fmt"
"flag"
"io/ioutil"
"log"
"strings"
"golang.org/x/crypto/ssh"
"github.com/tmc/scp"
)
func split_connection_str(conn string) (user, host, path string, err error) {
if strings.Index(conn, "@") < 0 {
return "", "", "", fmt.Errorf("no @")
}
if strings.Index(conn, ":") < 0 {
return "", "", "", fmt.Errorf("no :")
}
return conn[:strings.Index(conn, "@")],
conn[strings.Index(conn, "@")+1:strings.Index(conn, ":")],
conn[strings.Index(conn, ":")+1:],
nil
}
func main() {
flag.Parse()
// fmt.Println("arg num : ", len(flag.Args()))
// fmt.Println("arg #1 : ", flag.Args()[0])
args := flag.Args()
user, host, path, err := split_connection_str(args[2])
pemBytes, err := ioutil.ReadFile(args[0])
if err != nil {
log.Fatal(err)
}
signer, err := ssh.ParsePrivateKey(pemBytes)
if err != nil {
log.Fatalf("parse key failed:%v", err)
}
config := &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
}
conn, err := ssh.Dial("tcp", host + ":22", config)
if err != nil {
log.Fatalf("dial failed:%v", err)
}
defer conn.Close()
session, err := conn.NewSession()
if err != nil {
log.Fatalf("session failed:%v", err)
}
defer session.Close()
err = scp.CopyPath(args[1], path, session)
}
以下だと
-r な scp ができるのかどうか。別途試してみてメモを投入予定です。