安装github.com/pkg/sftp

我们之前介绍了,golang如何通过ssh连接服务器执行命令,下面我们来如何上传文件,上传文件同样需要之前的ssh,但是除此之外还需要一个模块,直接使用go get github.com/pkg/sftp 安装即可

使用

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/pkg/sftp"
  5. "golang.org/x/crypto/ssh"
  6. "io"
  7. "log"
  8. "net"
  9. "os"
  10. "time"
  11. )
  12. //连接的配置
  13. type ClientConfig struct {
  14. Host string //ip
  15. Port int64 // 端口
  16. Username string //用户名
  17. Password string //密码
  18. sshClient *ssh.Client //ssh client
  19. sftpClient *sftp.Client //sftp client
  20. LastResult string //最近一次运行的结果
  21. }
  22. func (cliConf *ClientConfig) createClient(host string, port int64, username, password string) {
  23. var (
  24. sshClient *ssh.Client
  25. sftpClient *sftp.Client
  26. err error
  27. )
  28. cliConf.Host = host
  29. cliConf.Port = port
  30. cliConf.Username = username
  31. cliConf.Password = password
  32. cliConf.Port = port
  33. config := ssh.ClientConfig{
  34. User: cliConf.Username,
  35. Auth: []ssh.AuthMethod{ssh.Password(password)},
  36. HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
  37. return nil
  38. },
  39. Timeout: 10 * time.Second,
  40. }
  41. addr := fmt.Sprintf("%s:%d", cliConf.Host, cliConf.Port)
  42. if sshClient, err = ssh.Dial("tcp", addr, &config); err != nil {
  43. log.Fatalln("error occurred:", err)
  44. }
  45. cliConf.sshClient = sshClient
  46. //此时获取了sshClient,下面使用sshClient构建sftpClient
  47. if sftpClient, err = sftp.NewClient(sshClient); err != nil {
  48. log.Fatalln("error occurred:", err)
  49. }
  50. cliConf.sftpClient = sftpClient
  51. }
  52. func (cliConf *ClientConfig) RunShell(shell string) string {
  53. var (
  54. session *ssh.Session
  55. err error
  56. )
  57. //获取session,这个session是用来远程执行操作的
  58. if session, err = cliConf.sshClient.NewSession(); err != nil {
  59. log.Fatalln("error occurred:", err)
  60. }
  61. //执行shell
  62. if output, err := session.CombinedOutput(shell); err != nil {
  63. fmt.Println(shell)
  64. log.Fatalln("error occurred:", err)
  65. } else {
  66. cliConf.LastResult = string(output)
  67. }
  68. return cliConf.LastResult
  69. }
  70. func (cliConf *ClientConfig) Upload(srcPath, dstPath string){
  71. srcFile, _ := os.Open(srcPath) //本地
  72. dstFile, _ := cliConf.sftpClient.Create(dstPath) //远程
  73. defer func() {
  74. _ = srcFile.Close()
  75. _ = dstFile.Close()
  76. }()
  77. buf := make([]byte, 1024)
  78. for {
  79. n, err := srcFile.Read(buf)
  80. if err != nil {
  81. if err != io.EOF {
  82. log.Fatalln("error occurred:",err)
  83. } else {
  84. break
  85. }
  86. }
  87. _, _ = dstFile.Write(buf[: n])
  88. }
  89. fmt.Println(cliConf.RunShell(fmt.Sprintf("ls %s", dstPath)))
  90. }
  91. func (cliConf *ClientConfig) Download(srcPath, dstPath string){
  92. srcFile, _ := cliConf.sftpClient.Open(srcPath) //远程
  93. dstFile, _ := os.Create(dstPath) //本地
  94. defer func() {
  95. _ = srcFile.Close()
  96. _ = dstFile.Close()
  97. }()
  98. if _, err := srcFile.WriteTo(dstFile); err != nil {
  99. log.Fatalln("error occurred", err)
  100. }
  101. fmt.Println("文件下载完毕")
  102. }
  103. func main() {
  104. cliConf := new(ClientConfig)
  105. cliConf.createClient("xx.xx.xx.xx", 22, "root", "xxxxxx")
  106. //本地文件上传到服务器
  107. cliConf.Upload(`D:\go\haha.go`, `/root/haha.go`) // /root/haha.go
  108. //从服务器中下载文件
  109. cliConf.Download(`/root/1.py`, `D:\go\1.py`) //文件下载完毕
  110. }

golang使用sftp连接服务器远程上传、下载文件的更多相关文章

  1. ubuntu SSH 连接、远程上传下载文件

    安装 SSH(Secure Shell) 服务以提供远程管理服务 sudo apt-get install ssh SSH 远程登入 Ubuntu 机 ssh username@192.168.0.1 ...

  2. 【ARM-LInux开发】利用scp 远程上传下载文件/文件夹

    利用scp 远程上传下载文件/文件夹 scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o s ...

  3. python中使用paramiko模块并实现远程连接服务器执行上传下载

    paramiko模块 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系 ...

  4. 利用scp 远程上传下载文件/文件夹和ssh远程执行命令

    利用scp传输文件 1.从服务器下载文件scp username@servername:/path/filename /tmp/local_destination例如scp codinglog@192 ...

  5. linux利用scp远程上传下载文件/文件夹

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度. 当你服务 ...

  6. Mac iTerm2使用rz、sz从远程上传下载文件

    使用 brew install lrzsz .如果安装遇到错误的话,使用以下方法: 在mac终端下运行: brew install lrzsz (安装教程:http://brew.sh/index_z ...

  7. 利用scp 远程上传下载文件/文件夹

    scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port ...

  8. 使用scp命令,远程上传下载文件/文件夹

    1.从服务器下载文件 scp username@servername:/path/filename /local/path例如: scp ubuntu@117.50.20.56:/ygf/data/d ...

  9. paramiko远程连接linux服务器进行上传下载文件

    花了不少时间来研究paramiko中sftpclient的文件传输,一顿操作猛如虎,最后就一直卡在了路径报错问题,疯狂查阅资料借鉴大佬们的心得,还是搞不好,睡了个午觉醒来,仔细一看原来是指定路径的文件 ...

随机推荐

  1. php判断进程是否存在

    //计划任务定时检测master进程是否存在,不存在则启动,以root用户运行 public function checkMaster() { $cmd = 'ps axu|grep "Uc ...

  2. IE和火狐的css兼容性问题

     CSS对浏览器器的兼容性具有很高的价值,通常情况下IE和Firefox存在很大的解析差异,这里介绍一下兼容要点. 1.DOCTYPE 影响 CSS 处理 2.FF: div 设置 margin-le ...

  3. Caché到MySQL数据同步方法!

    随着医疗行业信息化的发展,积累了大量的业务数据,如何挖掘这些数据,实现数据的可视化被提上日程,医院中通常有许多的信息化系统,使用的又都是不同厂商的数据库产品,如何统一汇聚数据,实现数据互通也是一个大问 ...

  4. vue项目使用keep-alive的作用

    在vue项目中,难免会有列表页面或者搜索结果列表页面,点击某个结果之后,返回回来时,如果不对结果页面进行缓存,那么返回列表页面的时候会回到初始状态,但是我们想要的结果是返回时这个页面还是之前搜索的结果 ...

  5. 【POJ - 3268 】Silver Cow Party (最短路 Dijkstra算法)

    Silver Cow Party Descriptions 给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x, ...

  6. 安装新版redis4.0.6

    看看新版本有那些特性提升,测试用!先安装 网址:https://redis.io/download 获取:wget http://download.redis.io/releases/redis-4. ...

  7. 最新 阿里java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.阿里等10家互联网公司的校招Offer,因为某些自身原因最终选择了阿里.6.7月主要是做系统复习.项目复盘.LeetCode ...

  8. [学习笔记] Blender 模型编辑-挤出

    按TAB键进入模型编辑模式,再次按TAB键退出编辑模式. 或者在菜单按 Modeling 也会进入编辑模式. 进入编辑模式之后,会显示如下额外的工具栏: 下面分别对应点.线.面三种选择方式:选择了两个 ...

  9. 乐字节Java编程之方法、调用、重载、递归

    一.概述 方法是指人们在实践过程中为达到一定目的和效果所采取的办法.手段和解决方案. 所谓方法,就是解决一类问题的代码的有序组合,是一个功能模块.编程语言中的方法是组合在一起来执行操作语句的集合.例如 ...

  10. java模拟from表单提交,上传图片

    /** * java上传表单,有图片 * @param urlStr 上传地址 * @param textMap 表单参数 * @param fileMap 文件参数 key:文件名称 value:文 ...