Golang copy remote file to local folder using sftp golang library

huangapple go评论82阅读模式
英文:

Golang copy remote file to local folder using sftp golang library

问题

我得到了在远程主机上创建文件的代码:

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

但是现在需要将文件从远程主机复制到本地主机。我该如何只使用 github.com/pkg/sftpgolang.org/x/crypto/ssh 这两个 Golang 工具来实现这个功能?

英文:

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?

答案1

得分: 13

你可以使用sftp包中的Open(path string)WriteTo(w io.Writer)方法来实现(当然你需要一个os.File或类似的对象来写入)。

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

// 在现有的ssh连接上打开一个SFTP会话。
sftp, err := sftp.NewClient(client)
if err != nil {
    log.Fatal(err)
}
defer sftp.Close()

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

// 打开源文件
srcFile, err := sftp.Open(srcPath + filename)
if err != nil {
    log.Fatal(err)
}
defer srcFile.Close()

// 创建目标文件
dstFile, err := os.Create(dstPath + filename)
if err != nil {
    log.Fatal(err)
}
defer dstFile.Close()

// 复制文件
srcFile.WriteTo(dstFile)
英文:

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)

huangapple
  • 本文由 发表于 2016年4月22日 14:03:59
  • 转载请务必保留本文链接:https://go.coder-hub.com/36786068.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定