博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GoLang执行需要输入密码的命令
阅读量:5160 次
发布时间:2019-06-13

本文共 1657 字,大约阅读时间需要 5 分钟。

需求

  • 同步一组视频到其他节点
  • 限制带宽,防止占用过多带宽对访问造成影响

分析

  • Linux命令scprsync满足需求
  • 使用以上命令都需要输入服务器密码,这里给出2个方案
    • 对各个节点做免密
    • 使用gexpect

免密(推荐)

  • 实例演示服务器用户名为root,IP为192.168.1.208

本地生成公私钥

ssh-keygen (一路回车默认即可)

以上命令会在~/.ssh下创建两个密钥

  • id_rsa (私钥)
  • id_rsa.pub (公钥)

上传公钥

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.208

以上命令会在服务器的~/.ssh/authorized_keys文件中写入客户端的公钥

### 执行命令同步

前两步已经实现了服务端对客户端的免密,通过ssh root@192.168.1.208进行测试。然后就可以使用os/exec调用系统命令来进行同步,具体代码如下

func main() {   args := []string{       "-avz", "--delete",       "--timeout=60", "--bwlimit=3000",       "/home/wsl/video/",       "root@192.168.1.208:/root/wsl/video/",   }   cmd := exec.Command("rsync", args...)   var stdOut, stdErr bytes.Buffer   cmd.Stderr = &stdErr   cmd.Stdout = &stdOut   err := cmd.Run()   if err != nil {       log.Fatalf("Got error:%s, msg:%s", err, stdErr.String())   }   fmt.Println("success:", stdOut.String())}

使用gexpect

  • gexpect : https://github.com/ThomasRooney/gexpect
package mainimport (    "fmt"    "log"    "time"    "github.com/ThomasRooney/gexpect")func main() {    cmd := "rsync -avz -e 'ssh -p 22' --delete --timeout=60 --bwlimit=3000 /home/video root@192.168.1.208:/root/"    pwd := "yourpassword"        child, err := gexpect.Spawn(cmd)    if err != nil {        log.Fatal("Spawn cmd error ", err)    }    if err := child.ExpectTimeout("password: ", 10*time.Second); err != nil {        log.Fatal("Expect timieout error ", err)    }    if err := child.SendLine(pwd); err != nil {        log.Fatal("SendLine password error ", err)    }    if err := child.Wait(); err != nil {        log.Fatal("Wait error: ", err)    }    fmt.Println("Success")}

转载于:https://www.cnblogs.com/mrylong/p/10763428.html

你可能感兴趣的文章
五种常用的图片格式及其是否有数据压缩的总结
查看>>
【miscellaneous】华为智能视频监控系统设计解决方案
查看>>
netstat实现原理
查看>>
寻找完美平方数
查看>>
初学反编译-.-
查看>>
防御式编程
查看>>
单线程并发的server端
查看>>
View可以设置tag携带数据
查看>>
individual reading task ---12061183 叶露婷
查看>>
delphi的消息对话框
查看>>
java:Apache Shiro 权限管理
查看>>
38.输出1到最大的N位数[Print 1 to max number of N bits]
查看>>
ZOJ - 2165 Red and Black
查看>>
objective c的注释规范
查看>>
FreeNas安装配置使用
查看>>
机器学习中的F1-score
查看>>
百度编辑器造成无用图片解决方案
查看>>
编译安装php5.5.38
查看>>
常用查找数据结构及算法(Python实现)
查看>>
Scrapy框架-CrawlSpider
查看>>