github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgSsh/TransferFiles.go (about) 1 package kmgSsh 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "os" 9 "path" 10 11 "code.google.com/p/go.crypto/ssh" 12 "github.com/bronze1man/kmg/archive/kmgTar" 13 "github.com/bronze1man/kmg/kmgCmd" 14 ) 15 16 //transfer a directory to remote host,with single tcp and tar.gz format 17 //Stdout will be ignore. 18 //Stderr will treat as an error from remote command 19 func CopyDirectory(client *ssh.Client, selfPath string, remotePath string) (err error) { 20 session, err := client.NewSession() 21 if err != nil { 22 return fmt.Errorf("[CopyDirectory]Failed to create session: %s", err.Error()) 23 } 24 defer session.Close() 25 w, err := session.StdinPipe() 26 if err != nil { 27 return 28 } 29 defer w.Close() 30 errBuf := &bytes.Buffer{} 31 session.Stderr = errBuf 32 escapedRemotePath := kmgCmd.BashEscape(remotePath) 33 err = session.Start(fmt.Sprintf("mkdir -p %s;tar -xz -C %s", escapedRemotePath, escapedRemotePath)) 34 if err != nil { 35 return fmt.Errorf("[CopyDirectory] Failed to Run: %s", err.Error()) 36 } 37 err = kmgTar.PackageDirectoryTarGz(selfPath, w) 38 if err != nil { 39 return 40 } 41 err = w.Close() 42 if err != nil { 43 return 44 } 45 err = session.Wait() 46 if err != nil { 47 return fmt.Errorf("[CopyDirectory] session.Wait() err:%s", err.Error()) 48 } 49 if errBuf.Len() != 0 { 50 return fmt.Errorf("[CopyDirectory] remote: %s", string(errBuf.Bytes())) 51 } 52 return nil 53 } 54 55 //transfer a file to remote host,with single tcp and gz format 56 //Stdout will be ignore. 57 //Stderr will treat as an error from remote command 58 //TODO test 59 func CopyFile(client *ssh.Client, selfPath string, remotePath string) (err error) { 60 session, err := client.NewSession() 61 if err != nil { 62 return fmt.Errorf("[CopyFile]Failed to create session: %s", err.Error()) 63 } 64 defer session.Close() 65 w, err := session.StdinPipe() 66 if err != nil { 67 return 68 } 69 defer w.Close() 70 errReader, err := session.StderrPipe() 71 if err != nil { 72 return 73 } 74 escapedRemotePath := kmgCmd.BashEscape(remotePath) 75 escapedRemoteDir := kmgCmd.BashEscape(path.Dir(remotePath)) 76 err = session.Start(fmt.Sprintf("mkdir -p %s;cat > %s", escapedRemoteDir, escapedRemotePath)) 77 if err != nil { 78 return fmt.Errorf("[CopyFile] Failed to Start: %s", err.Error()) 79 } 80 f, err := os.Open(selfPath) 81 if err != nil { 82 return 83 } 84 defer f.Close() 85 //gzipW := gzip.NewWriter(w) 86 //defer gzipW.Close() 87 _, err = io.Copy(w, f) 88 if err != nil { 89 return fmt.Errorf("[CopyFile] io.Copy: %s", err) 90 } 91 //err = gzipW.Close() 92 //if err!=nil{ 93 // return 94 //} 95 err = w.Close() 96 if err != nil { 97 return 98 } 99 errBytes, err := ioutil.ReadAll(errReader) 100 if err != nil { 101 return 102 } 103 if len(errBytes) != 0 { 104 return fmt.Errorf("[CopyFile] remote: %s", string(errBytes)) 105 } 106 err = session.Wait() 107 if err != nil { 108 return fmt.Errorf("[CopyFile] session.Wait() err:%s", err.Error()) 109 } 110 return nil 111 }