4

I got the code for create a file on remote host:

config := &ssh.ClientConfig{
    User:            "xx",
    HostKeyCallback: nil,
    Auth: []ssh.AuthMethod{
        ssh.Password("xx"),
    },
}

config.SetDefaults()
sshConn, err := ssh.Dial("tcp", "192.xx.1.xx:22", config)
if err != nil {
    panic(err)
}
defer sshConn.Close()

client, err := sftp.NewClient(sshConn)
if err != nil {
    panic(err)
}
defer client.Close()

file, err := client.Create("/www/hello9.txt")
if err != nil {
    panic(err)
}
defer file.Close()

if _, err := file.Write([]byte("Hello world")); err != nil {
    log.Fatal(err)
}

But is needed to copy a file from remote host to local host. How can I achieve this using the golang tools github.com/pkg/sftp and golang.org/x/crypto/ssh only?

IamNaN
  • 6,654
  • 5
  • 31
  • 47
Bera
  • 1,272
  • 4
  • 23
  • 49

1 Answers1

13

You can do it using the Open(path string) and WriteTo(w io.Writer) methods from the sftp package (and of course you need an os.File or something similar to write to).

client, err := ssh.Dial("tcp", "192.x.x.x:22", sshConfig)
if err != nil {
    panic("Failed to dial: " + err.Error())
}
fmt.Println("Successfully connected to ssh server.")

// open an SFTP session over an existing ssh connection.
sftp, err := sftp.NewClient(client)
if err != nil {
    log.Fatal(err)
}
defer sftp.Close()

srcPath := "/tmp/"
dstPath := "C:/temp/"
filename := "test.txt"

// Open the source file
srcFile, err := sftp.Open(srcPath + filename)
if err != nil {
    log.Fatal(err)
}
defer srcFile.Close()

// Create the destination file
dstFile, err := os.Create(dstPath + filename)
if err != nil {
    log.Fatal(err)
}
defer dstFile.Close()

// Copy the file
srcFile.WriteTo(dstFile)
IamNaN
  • 6,654
  • 5
  • 31
  • 47
  • I think that should be `dstFile, err := sftp.Create(dstPath + filename)` – John Rork Sep 07 '16 at 19:47
  • Also ```srcFile, err := sftp.Open(srcPath + filename)``` should be ```srcFile, err := os.Open(srcPath + filename)``` – anuradha Jan 15 '19 at 02:33
  • 1
    This is writing empty file – Sreenath Feb 05 '20 at 05:04
  • I just want to point out that the behavior of the nil HostKeyCallback has changed, so the config needs to change as well. https://stackoverflow.com/questions/44269142/golang-ssh-getting-must-specify-hoskeycallback-error-despite-setting-it-to-n – Keith E. Truesdell Feb 15 '22 at 15:38