zoukankan      html  css  js  c++  java
  • GoLang执行需要输入密码的命令

    需求

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

    分析

    • 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 main
    
    import (
    	"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")
    }
    
  • 相关阅读:
    前端百度地图开发使用总结
    换电脑后如何同步git本地仓库及分支
    vue mint-ui初次使用总结
    git学习入门总结
    深夜,当音乐响起,数据在MySQL中静静的疯狂计算
    且说Tomcat、Servlet、JSP和Spring
    国庆与中秋7天死磕Web的时光
    Android编程初涉,以控制摄像头为例
    谈现阶段如何形成可行的健康生活习惯方案
    说Java网络编程
  • 原文地址:https://www.cnblogs.com/mrylong/p/10763428.html
Copyright © 2011-2022 走看看