gitee.com/h79/goutils@v1.22.10/common/ssh/sftp.go (about) 1 package ssh 2 3 import ( 4 "errors" 5 "fmt" 6 "github.com/pkg/sftp" 7 "io" 8 "os" 9 "time" 10 ) 11 12 type Sftp struct { 13 session *Session 14 } 15 16 func NewSftp(session *Session) *Sftp { 17 return &Sftp{session: session} 18 } 19 20 func (sf *Sftp) Exec(id int, localFilePath string, remoteFilePath string) *Result { 21 22 result := &Result{ 23 Id: id, 24 Host: sf.session.Host, 25 LocalPath: localFilePath, 26 RemotePath: remoteFilePath, 27 } 28 start := time.Now() 29 result.StartTime = start 30 31 if err := sf.session.Connect(); err != nil { 32 result.Error = err 33 return result 34 } 35 36 var fileSize int64 37 if s, err := os.Stat(localFilePath); err != nil { 38 result.Error = err 39 return result 40 41 } else { 42 fileSize = s.Size() 43 } 44 srcFile, err := os.Open(localFilePath) 45 if err != nil { 46 result.Error = err 47 return result 48 } 49 50 defer srcFile.Close() 51 52 sftpClient, err := sftp.NewClient(sf.session.Client) 53 if err != nil { 54 result.Error = err 55 return result 56 } 57 defer sftpClient.Close() 58 59 dstFile, err := sftpClient.Create(remoteFilePath) 60 if err != nil { 61 result.Error = err 62 return result 63 } 64 defer dstFile.Close() 65 n, err := io.Copy(dstFile, io.LimitReader(srcFile, fileSize)) 66 if err != nil { 67 result.Error = err 68 return result 69 } 70 if n != fileSize { 71 result.Error = errors.New(fmt.Sprintf("copy: expected %v bytes, got %d", fileSize, n)) 72 return result 73 } 74 end := time.Now() 75 result.EndTime = end 76 return result 77 }