package SftpUtil import ( "fmt" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" "io/ioutil" "log" "os" "path" "path/filepath" "time" ) func Connect(user, password, host string, port int) (*sftp.Client, error) { var ( auth []ssh.AuthMethod addr string clientConfig *ssh.ClientConfig sshClient *ssh.Client sftpClient *sftp.Client err error ) // get auth method auth = make([]ssh.AuthMethod, 0) auth = append(auth, ssh.Password(password)) clientConfig = &ssh.ClientConfig{ User: user, Auth: auth, Timeout: 30 * time.Second, HostKeyCallback: ssh.InsecureIgnoreHostKey(), //ssh.FixedHostKey(hostKey), } // connet to ssh addr = fmt.Sprintf("%s:%d", host, port) if sshClient, err = ssh.Dial("tcp", addr, clientConfig); err != nil { return nil, err } // create sftp client if sftpClient, err = sftp.NewClient(sshClient); err != nil { return nil, err } return sftpClient, nil } func UploadFile(sftpClient *sftp.Client, localFilePath string, remotePath string) { srcFile, err := os.Open(localFilePath) if err != nil { fmt.Println("os.Open error : ", localFilePath) log.Fatal(err) } defer srcFile.Close() //golang中path.Base(pathString)函数,pathString的值必须为 linux 风格的路径,即 "/" 才能够正常的获取最后的路径段的值。 localFilePath = filepath.ToSlash(localFilePath) var remoteFileName = path.Base(localFilePath) dstFile, err := sftpClient.Create(path.Join(remotePath, remoteFileName)) if err != nil { fmt.Println("sftpClient.Create error : ", path.Join(remotePath, remoteFileName)) log.Fatal(err) } defer dstFile.Close() ff, err := ioutil.ReadAll(srcFile) if err != nil { fmt.Println("ReadAll error : ", localFilePath) log.Fatal(err) } dstFile.Write(ff) fmt.Println(localFilePath + " copy file to remote server finished!") } func UploadDirectory(sftpClient *sftp.Client, localPath string, remotePath string) { localFiles, err := ioutil.ReadDir(localPath) if err != nil { log.Fatal("read dir list fail ", err) } for _, backupDir := range localFiles { localFilePath := path.Join(localPath, backupDir.Name()) remoteFilePath := path.Join(remotePath, backupDir.Name()) if backupDir.IsDir() { sftpClient.Mkdir(remoteFilePath) UploadDirectory(sftpClient, localFilePath, remoteFilePath) } else { UploadFile(sftpClient, path.Join(localPath, backupDir.Name()), remotePath) } } fmt.Println(localPath + " copy directory to remote server finished!") }