2016-04-22 17 views
1

ich den Code bekam für eine Datei auf dem Remote-Host erstellen:Golang kopieren Remote-Datei zu lokalen Ordnern mit SFTP golang Bibliothek

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

aber benötigt wird, um eine Datei von Remote-Host lokalen Host zu kopieren. Wie kann ich dies mit den Golang-Tools github.com/pkg/sftp und golang.org/x/crypto/ssh erreichen?

Antwort

5

Sie können es mit den Open(path string) und WriteTo(w io.Writer) Methoden aus dem SFTP-Paket (und natürlich benötigen Sie eine os.File oder etwas ähnliches zu schreiben).

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) 
+0

Ich denke, das sollte sein 'dstFile, err: = sftp.Create (dstPath + Dateiname)' –