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 [email protected]

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

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

func main() {
   args := []string{
       "-avz", "--delete",
       "--timeout=60", "--bwlimit=3000",
       "/home/wsl/video/",
       "[email protected]:/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 [email protected]:/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

时间: 2024-10-20 21:23:36

GoLang执行需要输入密码的命令的相关文章

golang执行Linux和Windows命令

1. 可接收变参命令 package main import ( "fmt" "os" "os/exec" "strings" ) func main(){ sliceFunc(os.Args[1:]...) } func sliceFunc(cmd... string){ fmt.Println(cmd) if len(cmd) == 0 { fmt.Printf("Usage: %s args...\n"

C#中,一个cmd命令窗口执行多条dos命令(有修改,加入执行等待)

原文章标题:C# 程序一个cmd命令窗口执行多条dos命令 原文章地址:http://www.cnblogs.com/visibleisfalse/p/3578886.html 以下代码有修改,标出的红色代码,表示执行一条dos命令后,等待执行完成. public void DoDos(string comd1, string comd2, string comd3) { Process p = new Process();//创建进程对象 try { p.StartInfo.FileName

ubuntu将命令写在一个文件里,执行文件,source命令

source命令也称为“点命令”,也就是一个点符号(.).source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录.用法: source filename 或 . filename source命令除了上述的用途之外,还有一个另外一个用途.在对编译系统核心时常常需要输入一长串的命令,如:make mrpropermake menuconfigmake depmake cleanmake bzImage…………如果把这些命令做成一个文件,让它自动顺序执行,对于需要多次

shell脚本介绍,shell脚本结构和执行方式,date命令的用法,shell脚本中的变量简介

笔记内容: 20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量 笔记日期:2017-11-21 20.1 shell脚本介绍 Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令

20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量

- 20.1 shell脚本介绍 - 20.2 shell脚本结构和执行 - 20.3 date命令用法 - 20.4 shell脚本中的变量 # 20.1 Shell脚本介绍 -  shell是一种脚本语言  关注aming_linux  blog.lishiming.net -  可以使用逻辑判断.循环等语法 -  可以自定义函数 -  shell是系统命令的集合 -  shell脚本可以实现自动化运维,能大大增加我们的运维效率 # 20.2 Shell脚本结构和执行 - 开头需要加#!/b

20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.

20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量 原文地址:http://blog.51cto.com/12058686/2104654

运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】

一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffmpeg的时候已经写了一部分Java的命令控制功能了,有些代码就拿过来改改用了(其实是为了偷懒qaq) 二.实现功能 1.进程管理 只支持本程序启动的进程管理,本程序主要功能是定时执行某些脚本或者系统命令,当然命令行和脚本是很自由的,更多用法请自行探索 2.定时命令.任务 3.重复定时命令.任务 4.

在服务器中连接docker,执行容器里面的命令

1.首先让容器运行,执行 docker run [镜像地址] 2.列出目前正在运行的容器 执行命令:docker ps 3.执行进入终端命令: docker exec -it 2658c3c585f1 bash 此时已经进入容器终端了,接下来执行相应的Linux命令就可以了 注意:执行 docker exec -it 2658c3c585f1 bash时应该是执行运行容器的id,不是容器的url 原文地址:https://www.cnblogs.com/gramblog/p/11252115.h

awk中可以使用system来执行复杂的shell命令

在awk中可以直接执行shell命令. [plain] view plain copy [email protected]:~$ touch a [email protected]:~$ touch b [email protected]:~$ cat a.txt a b [email protected]:~$ awk '{cmd="rm "$0;system(cmd)}' a.txt [email protected]:~$ ls a.txt      dd