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  }