9-20 1 views
SFTP客户端初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
import ( "MySQLExport/tools/tools" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" "io" "log" "os" "time" ) type SFTP struct { Host string User string PassWord string Target string SSHChn *ssh.Client SFTPChn *sftp.Client } // ClientInit 初始化SFTP连接 func (s *SFTP) ClientInit() { var err error sshConfig := &ssh.ClientConfig{ User: s.User, Auth: []ssh.AuthMethod{ ssh.Password(s.PassWord), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), ClientVersion: "", Timeout: 10 * time.Second, } // 建立连接 s.SSHChn, err = ssh.Dial("tcp", s.Host, sshConfig) if err != nil { log.Fatalln(err.Error()) } // 创建SFTP客户端 s.SFTPChn, err = sftp.NewClient(s.SSHChn) if err != nil { log.Fatal(err) } } // Close 关闭连接 func (s *SFTP) Close() { s.SSHChn.Close() s.SFTPChn.Close() log.Printf("[%v] SFTP connection closed", s.Host) } // NewSFTP 创建一个新的SFTP客户端 func NewSFTP(host, user, password, dest string) *SFTP { s := &SFTP{ Host: host, User: user, PassWord: password, Target: dest, } s.ClientInit() return s } |
文件上传
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
func (s *SFTP) FileUpload(src, fileName string) { var err error //// 获取当前目录 //cwd, err := s.SFTPChn.Getwd() //if err != nil { // log.Fatal(err) //} remoteTargetDir := s.Target // 判断远程目录是否需要按日期生成 remoteTargetDir = tools.ConvertDateSymbolToString(remoteTargetDir) // 不存在则创建,存在则不做动作 err = s.SFTPChn.MkdirAll(remoteTargetDir) if err != nil { log.Fatalf("%v: %v", remoteTargetDir, err) } // 上传文件到远程目录 remoteFilePath := remoteTargetDir + "/" + fileName log.Printf("[%v]\tStaring uploading...", src) // Create方法,如果远程文件存在,则替换,不存在则创建 remoteFile, err := s.SFTPChn.Create(remoteFilePath) if err != nil { log.Fatalln(err) } defer remoteFile.Close() // 获取本地文件对象 localFilePath := src localFile, err := os.Open(localFilePath) if err != nil { log.Fatal(err) } defer localFile.Close() // 将本地文件对象拷贝到远程 n, err := io.Copy(remoteFile, localFile) if err != nil { log.Fatalln(err.Error()) } // 获取本地文件大小 localFileInfo, err := os.Stat(localFilePath) if err != nil { log.Fatalln(err.Error()) } log.Printf("[%v(%v) ---> %s(%v)] : Files upload success!!!", localFilePath, tools.FormatFileSize(localFileInfo.Size()), remoteFilePath, tools.FormatFileSize(n)) } |
测试执行
1 2 3 4 5 6 7 8 |
// 创建SFTP连接 sftpClient := model.NewSFTP(host, user, password, dest) // 关闭链接 defer sftpClient.Close() // 上传文件 sftpClient.FileUpload(f, fileName) |
如果想赏钱,可以用微信扫描下面的二维码,一来能刺激我写博客的欲望,二来好维护云主机的费用; 另外再次标注博客原地址 itnotebooks.com 感谢!
