/var/log/messages

debugging with sixth sense

Scp してみる

材料以下。

とりあえず

*.pem を使って云々、という方向です。とりあえずソースの置き場所確保。

1
$ mkdir -p $GOPATH/src/github.com/yamanetoshi

ハロワ作ってみます。

1
$ mkdir -p $GOPATH/src/github.com/yamanetoshi/hello

以下な hello/hello.go を作成。

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
     fmt.Printf("Hello, world.\n")
}

で、go install するのかな。

1
$ go install src/github.com/yamanetoshi/hello

で、実行。

1
2
$ $GOPATH/bin/hello
Hello, world.

成程。とりあえずコマンドラインから

  • コピィ元
  • コピィ先

を受け取って云々、なのですがディレクトリごとコピィってできるのか確認してみたくはあります。つうか $GOPATH/bin の中身が ELF なのってなにげに凄いな。

動くようにはなりましたが

ディレクトリごとコピィ、は無理らしい。とりあえず Github にアレしたコードが以下っす。

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
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 ができるのかどうか。別途試してみてメモを投入予定です。

Go

« godeb Docker »

Comments