ansible 真的太慢了,而且依赖对端python环境,对于交换机,分流等基于ssh连接的网络设备就没办法了。用的最多的是批量执行命令和下发文件,
我们就借鉴ansible的执行方式,先准备yaml格式hosts ,文件名我是写死了,所以要先创建文件roomname.yaml
例子:

groups:- roomname: idgoup1ip:- 192.168.1.201 root 123456- 192.168.1.30 root 123456- roomname: idgroup2ip:- 192.2.1.134 admin admin123- 192.2.1.135 admin admin123

直接上代码。

package mainimport ("flag""fmt""io/ioutil""log""net""os""path""strconv""strings""sync""time""github.com/pkg/sftp""golang.org/x/crypto/ssh""gopkg.in/yaml.v2"
)var ipAddrs chan string = make(chan string)
var wg sync.WaitGrouptype HostInfo struct {Roomname string   `yaml:"roomname"`IpList   []string `yaml:"ip"`
}type Group struct {List []*HostInfo `yaml:"groups"`
}func OpencfgFile() {databytes, err := ioutil.ReadFile("roomname.yaml")if err != nil {log.Fatal(err)}g := new(Group)if err = yaml.Unmarshal(databytes, &g); err != nil {log.Fatal(err)}for _, hostinfo := range g.List {if os.Args[1] == "all" {for _, i := range hostinfo.IpList {ipAddrs <- hostinfo.Roomname + " " + i}} else if hostinfo.Roomname == os.Args[1] {for _, i := range hostinfo.IpList {ipAddrs <- hostinfo.Roomname + " " + i}}}close(ipAddrs)
}func Opsee() {for s := range ipAddrs {wg.Add(1)str1 := strings.Split(s, " ")room := &str1[0]ip := &str1[1]user := &str1[2]passwd := &str1[3]comm := os.Args[2]if os.Args[2] == "scp" {go SftpRun(*room, *user, *passwd, *ip)} else {go Runshell(*room, *user, *passwd, *ip, comm)}}wg.Wait()if len(ipAddrs) == 0 {fmt.Println("End of channel data reading")}
}func sshSession(user, password, host string, port int) (sshSession *ssh.Session, err error) {sshClient, err := connector(user, password, host, port)if err != nil {//fmt.Println(room + "." + ip)//fmt.Println("连接失败", err)return}if sshSession, err = sshClient.NewSession(); err != nil {fmt.Println("创建客户端失败", err)return}return
}func connector(user, password, host string, port int) (sshClient *ssh.Client, err error) {auth := make([]ssh.AuthMethod, 0)auth = append(auth, ssh.Password(password))clientConfig := &ssh.ClientConfig{User:    user,Auth:    auth,Timeout: 1 * time.Second,HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {return nil},}addr := host + ":" + strconv.Itoa(port)sshClient, err = ssh.Dial("tcp", addr, clientConfig)if err != nil {//fmt.Println("连接ssh失败", err)return}return
}
func sftpconnect(user, password, host string, port int) (*sftp.Client, error) {var (auth         []ssh.AuthMethodaddr         stringclientConfig *ssh.ClientConfigsshClient    *ssh.ClientsftpClient   *sftp.Clienterr          error)auth = make([]ssh.AuthMethod, 0)auth = append(auth, ssh.Password(password))clientConfig = &ssh.ClientConfig{User:    user,Auth:    auth,Timeout: 30 * time.Second,HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {return nil},}addr = fmt.Sprintf("%s:%d", host, port)if sshClient, err = ssh.Dial("tcp", addr, clientConfig); err != nil {return nil, err}if sftpClient, err = sftp.NewClient(sshClient); err != nil {return nil, err}return sftpClient, nil
}
func SftpRun(room, user, passwd, ip string) {defer wg.Done()var (sftpClient *sftp.Client)sftpClient, _ = sftpconnect(user, passwd, ip, 22)defer sftpClient.Close()localFilePath := os.Args[3]remoteDir := os.Args[4]srcFile, err := os.Open(localFilePath)if err != nil {log.Fatal(err)}defer srcFile.Close()var remoteFileName = path.Base(localFilePath)dstFile, err := sftpClient.Create(path.Join(remoteDir, remoteFileName))if err != nil {log.Fatal(err)}defer dstFile.Close()buf := make([]byte, 1024)for {n, _ := srcFile.Read(buf)if n == 0 {break}dstFile.Write(buf[0:n])}fmt.Println(room + "." + ip + "\n" + "copy file  finished!")
}
func Runshell(room, user, passwd, ip, comm string) {defer wg.Done()session, err := sshSession(user, passwd, ip, 22)if err != nil {log.Printf(room+"."+ip+"\n"+"result:", err)return}buf, _ := session.CombinedOutput(comm)fmt.Println(room + "." + ip + "\n" + "result:" + string(buf))defer session.Close()}
func main() {flag.Parse()if flag.NArg() == 2 && os.Args[2] != "scp" {go OpencfgFile()Opsee()} else if flag.NArg() == 4 && os.Args[2] == "scp" {go OpencfgFile()Opsee()} else {fmt.Println("本go 只有两个功能,批量执行命令和scp下发文件" + "\n" + "正确执行方式,1:hosts组,2:执行的命令;" + "\n" + "例如 ./gosh all \"date\";" + "\n" + "如果下发文件,1:hosts组,2:scp 3:本地文件路径,4:远端目录;" + "\n" + "例如 ./gosh all scp \"/tmp/test.log\" \"/tmp\"")return}}

执行方式

效果:


如果机器连通性没问题的话,基本上是秒出结果的了。
很多类似的程序,都是在重复造轮子。
轮子千千万万,适合自己的轮子才是好的轮子。
这里有编译好的包
https://gitee.com/djyou32/gosh

Go 版批量执行命令工具相关推荐

  1. 基于pam实现的批量执行命令工具-Cyberark

    无2fa版本: #!/usr/bin/python # -*- coding: UTF-8 -*- #换了一种方式登录 #每天早上九点到晚上十点执行,每半小时一次,每次20台,大概4天-5天可以执行完 ...

  2. pssh远程批量执行命令

    Pssh pssh是python写的可以并发在多台机器上批量执行命令的工具,它的用法可以媲美ansible的一些简单用法,执行起来速度比ansible快它支持文件并行复制,远程命令执行,杀掉远程主机上 ...

  3. Scp远程批量执行命令

    一次拷贝多个文件或者目录 # scp root@192.168.9.142:/usr/local/src/cp_dir/*.php /usr/local/src/ //拷贝多个文件 # scp -r ...

  4. pssh批量执行命令

    Pssh pssh是python写的可以并发在多台机器上批量执行命令的工具,它的用法可以媲美ansible的一些简单用法,执行起来速度比ansible快它支持文件并行复制,远程命令执行,杀掉远程主机上 ...

  5. Spark-shell 脚本批量执行命令,命令行批量执行命令

    spark-shell 执行脚本,批量执行命令 #!/bin/bashsource /etc/profileexec spark-shell --name spark-sql-test --execu ...

  6. Python 实现远程服务器(ssh)批量执行命令

    paramiko 远程控制介绍 Python paramiko是一个相当好用的远程登录模块,采用ssh协议,可以实现linux服务器的ssh远程登录.首先来看一个简单的例子 import parami ...

  7. linux批量执行命令脚本,2.3-命令批量执行脚本

    命令批量执行脚本,同样需要两个脚本来实现:1 exe.expect 2 exe.sh 3 ip.list    IP列表 cat exe.expect #!/usr/bin/expect set ho ...

  8. python批量运行cmd_python 之多主机批量执行命令

    当我们有很多台linux服务器的时候,而每台服务器都需要做同一个操作,比如很多节点的集群环境下,要更改一个配置文件,哪怕只是一行,在传统情况下,也需要每台去单独操作. 最近也是有这样的需求,需要操作的 ...

  9. expect批量执行命令

    在跳板机上执行脚本,登录到远程机器分区格式化挂载命令 #/bin/bash passwd='engine' /usr/bin/expect << EOF set time 40 spawn ...

最新文章

  1. form表单只提交数据而不进行页面跳转的解决方案
  2. COM线程模型的行为
  3. hadoop java操作hdfs
  4. keep 虚拟路线修改器_keep儿童版下载-keep儿童模式6.124.0手机版下载
  5. docsify神奇的文档网站生成工具
  6. 移除集合效率高还是add高_java集合详解
  7. 2008年小结,我想,我就从这里开始
  8. 如何确定C语言中数组的大小?
  9. 二层交换机的安全方案与实施
  10. wamp 出现 The requested URL / was not found on this server
  11. 电脑主机箱前置耳机没声音(window7)
  12. win2008服务器系统玩红警,win8系统玩红警2共和国卡死的解决办法
  13. 基于DNN的IMDB电影数据集文本分类
  14. 团队任务:第二次冲刺-第三组梦之队
  15. simplescalar自动安装
  16. iphone11屏比例_iPhone每一代的屏幕尺寸比例是多少
  17. 使用python的requests模块实现百思不得其姐抓取(多线程版)
  18. 红米note3android版本,小米-红米note3-LOS-安卓9.0.0-稳定版Stable3.0-来去电归属-农历等-本地化增强适配...
  19. Dubbo+zookeeper
  20. 实验1 蓝桥ROS1机器人入门 适用kinetic/melodic/noetic

热门文章

  1. 建立任务,OSTaskCreate()源码解析
  2. 微信小程序——时间安卓、苹果获取时间戳表现不一致
  3. 录录(高清录屏) - Video321 从下载到安装使用
  4. [日推荐]『五车书馆』教你快速提升逼格!
  5. C语言程序周期接收虚拟串口发送的数据
  6. 9实用PHP函数和功能
  7. Computer:成功教你如何使用一招—就能找回以前的密码(曾经保存的密码但当前显示为******号的密码)
  8. Python多线程爬取表情包,1秒下载五十张表情包
  9. [基本功]Adaboost简介
  10. 数据结构之静态顺序表(含游戏菜单)