go语言使用sftp包上传文件和文件夹到远程服务器
2017-12-07 15:25
671 查看
使用go语言的第三方包:github.com/pkg/sftp和golang.org/x/crypto/ssh实现文件和文件夹传输。
1、创建connect方法:
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 }
2、上传文件
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() 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!") }
3、上传文件夹
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!") }
4、上传测试
func DoBackup(host string, port int, userName string, password string, localPath string, remotePath string) { var ( err error sftpClient *sftp.Client ) start := time.Now() sftpClient, err = connect(userName, password, host, port) if err != nil { log.Fatal(err) } defer sftpClient.Close() _, errStat := sftpClient.Stat(remotePath) if errStat != nil { log.Fatal(remotePath + " remote path not exists!") } backupDirs, err := ioutil.ReadDir(localPath) if err != nil { log.Fatal(localPath + " local path not exists!") }
uploadDirectory(sftpClient, localPath, remotePath)
elapsed := time.Since(start)
fmt.Println("elapsed time : ", elapsed)}
相关文章推荐
- 本地windows机器和远程Linux服务器之间文件传输 -- Xshell 使用sftp 上传下载文件
- CentOS7 下使用sftp客户端上传文件到特定文件夹,外层其他文件夹不可访问,不可远程ssh登录
- Linux中使用scp命令进行文件上传至远程服务器
- 利用nodejs监控文件变化并使用sftp上传到服务器
- 在Java中使用pscp命令上传单个或者多个文件(文件夹)到远程Linux服务器
- sublime Text SFTP使用密钥远程登录Linux 上传文件
- 使用java进行sftp上传文件到服务器
- java使用Linux命令scp从远程服务器上传下载文件
- 在 Sublime Text 中使用 SFTP 插件快速编辑远程服务器文件
- 如何在Linux中使用sFTP上传或下载文件与文件夹
- 在SecureCRT上,使用命令行从远程服务器上传或者下载文件
- 利用nodejs监控文件变化并使用sftp上传到服务器
- 使用TortoiseGit上传本地文件到远程服务器
- Java使用SFTP连接服务器上传、下载文件
- [sublime Text2] 使用 SFTP 插件快速编辑远程服务器文件
- ubuntu使用ssh远程登录服务器及上传本地文件到服务器
- 在 Sublime 中使用 SFTP 插件快速编辑远程服务器文件
- 使用SFTP上传文件到服务器的简单使用
- 在 Sublime Text 2 中使用 SFTP 插件快速编辑远程服务器文件
- 远程服务器登录以及使用scp、sftp传输文件