Golang中的SCP示例

时间:2014-04-13 14:25:04

标签: ssh go scp

我花了3个小时在Go上搜索SCP实施工作

我找不到任何有效的文件或例子。

这个要点不起作用。这是错误的,但在一些答案中列为工作代码。 https://gist.github.com/jedy/3357393

3 个答案:

答案 0 :(得分:1)

我没有尝试过使用它,但在godoc上搜索SCP让我scp-gohttp://godoc.org/github.com/laher/scp-go/scp

答案 1 :(得分:0)

你可以用一个简单的 https://github.com/tmc/scp

使用scp将本地文件复制到远程计算机的代码片段在

之下
package main

import (
    "io/ioutil"
    "net"

    "github.com/tmc/scp"
    "golang.org/x/crypto/ssh"
)

func getKeyFile() (key ssh.Signer, err error) {
    //usr, _ := user.Current()
    file := "Path to your key file(.pem)"
    buf, err := ioutil.ReadFile(file)
    if err != nil {
        return
    }
    key, err = ssh.ParsePrivateKey(buf)
    if err != nil {
        return
    }
    return
}

func main() {
    key, err := getKeyFile()
    if err != nil {
        panic(err)
    }

    // Define the Client Config as :
    config := &ssh.ClientConfig{
        User: "root",
        Auth: []ssh.AuthMethod{
            ssh.PublicKeys(key),
        },
        HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
            return nil
        },
    }
    client, err := ssh.Dial("tcp", "<remote ip>:22", config)
    if err != nil {
        panic("Failed to dial: " + err.Error())
    }

    session, err := client.NewSession()
    if err != nil {
        panic("Failed to create session: " + err.Error())
    }
    err = scp.CopyPath("local file path", "remote path", session)
    if err != nil {
        panic("Failed to Copy: " + err.Error())
    }
    defer session.Close() 

希望它有所帮助。

答案 2 :(得分:0)

这里是最先进的SCP client implementation

除了常规的CRUD操作外,它还支持批量上传,符号链接和修改时间保存。


    var config *ssh.ClientConfig
    //load config ...

    timeoutMS := 15000
    service, err := scp.NewStorager("127.0.0.1:22", timeoutMS, config)
    if err != nil {
        log.Fatal(err)
    }
    ctx := context.Background()
    location := "/tmp/myfile"
    err = service.Upload(ctx,  location, 0644, []byte("somedata"))
    if err != nil {
        log.Fatal(err)
    }
    reader, err := service.Download(ctx,  location)
    if err != nil {
        log.Fatal(err)
    }