文档章节

使用GO语言灵活批量ssh登录服务器执行操作

jiangmitiao
 jiangmitiao
发布于 2016/09/30 16:46
字数 667
阅读 1122
收藏 24

go语言是一门新兴语言,能够在很多地方发挥总用。初学go语言,做了这么一个小工具,也算是练练手了。

 

这个小程序实现的功能是从用户指定的文件中读取相关配置,然后根据用户指令执行相关操作。

 

代码如下:

package main

import (
	"fmt"
	"golang.org/x/crypto/ssh"
	"os"
	"io"
	"bufio"
	"encoding/csv"
	"strings"
	"container/list"
)

var (
	num int
)

func main() {
	if len(os.Args) == 1{
		fmt.Println("请输入文件名参数")
		return
	}
	list := listNode(os.Args[1])
	fmt.Println("请选择执行的语句")
	fmt.Scanln(&num)
	if num <= list.Len(){
		fmt.Println("您选择的是 ", num)
		ssh_to_do(list,num)
	}else {
		fmt.Println("您输入有误! num:",num)
	}


}

func ssh_to_do(list *list.List, num int) {
	if num != 0 {
		i := 1
		for node := list.Front(); node != nil; node = node.Next() {
			if i == num {
				switch value := node.Value.(type) {
				case BatchNode:
					SSH_do(value.User, value.Password, value.Ip_port, value.Cmd)
				}
			}
			i++
		}
	} else {
		for node := list.Front(); node != nil; node = node.Next() {

			switch value := node.Value.(type) {
			case BatchNode:
				SSH_do(value.User, value.Password, value.Ip_port, value.Cmd)
			}
		}
	}
}

func listNode(fileName string) *list.List {
	list := readNode(fileName)
	fmt.Printf("共计 %d 条数据\n", list.Len())
	i := 1
	for node := list.Front(); node != nil; node = node.Next() {
		switch value := node.Value.(type) {
		case BatchNode:
			fmt.Println(i, "  ", value.String())
		}
		i++
	}
	return list
}

func SSH_do(user, password, ip_port string, cmd string) {
	PassWd := []ssh.AuthMethod{ssh.Password(password)}
	Conf := ssh.ClientConfig{User: user, Auth: PassWd}
	Client, _ := ssh.Dial("tcp", ip_port, &Conf)
	defer Client.Close()
	for {
		command := cmd
		if session, err := Client.NewSession(); err == nil {
			defer session.Close()
			session.Stdout = os.Stdout
			session.Stderr = os.Stderr
			session.Run(command)
			break
		}
	}
}

type BatchNode struct {
	User     string
	Password string
	Ip_port  string
	Cmd      string
}

func (batchNode *BatchNode) String() string {
	return "ssh " + batchNode.User + "@" + batchNode.Ip_port + "  with password: " + batchNode.Password + "  and run: " + batchNode.Cmd
}

func readNode(fileName string) *list.List {
	inputFile, err := os.Open(fileName)
	if err != nil {
		fmt.Printf("在打开文件的时候出现错误\n文件存在吗?\n有权限吗?\n")
		return list.New()
	}
	defer inputFile.Close()

	batchNodeList := list.New()

	inputReader := bufio.NewReader(inputFile)
	for {
		inputString, err := inputReader.ReadString('\n')
		r := csv.NewReader(strings.NewReader(string(inputString)))
		for {
			record, err := r.Read()
			if err == io.EOF {
				break
			}
			if err != nil {
				fmt.Println("error !!! ", err)
				continue
			}
			batchNode := BatchNode{record[0], record[1], record[2], record[3]}
			batchNodeList.PushBack(batchNode)
		}
		if err == io.EOF {
			break
		}
	}
	return batchNodeList
}

 

我的文件内容是:

gavin,xxxx,192.168.1.128:22,echo ok1 >>a.data
gavin,xxxx,192.168.1.128:22,echo ok2 >>a.data
gavin,xxxx,192.168.1.128:22,echo ok3 >>a.data
gavin,xxxx,192.168.1.128:22,echo ok4 >>a.data

小程序限制使用csv格式的文件内容,这种格式也方便被excel处理

运行的结果如下:
共计 4 条数据
1    ssh gavin@192.168.1.128:22  with password: root  and run: echo ok1 >>a.data
2    ssh gavin@192.168.1.128:22  with password: root  and run: echo ok2 >>a.data
3    ssh gavin@192.168.1.128:22  with password: root  and run: echo ok3 >>a.data
4    ssh gavin@192.168.1.128:22  with password: root  and run: echo ok4 >>a.data
请选择执行的语句
1
您选择的是  1

 

 

去线上查看:

 

如果输入的是0,则执行所有配置项。也就是说如果有固定执行的任务,可以很方便地批量去操控了。

 

更多文章:http://blog.gavinzh.com

© 著作权归作者所有

共有 人打赏支持
jiangmitiao

jiangmitiao

粉丝 17
博文 48
码字总数 44413
作品 1
朝阳
程序员
私信 提问
加载中

评论(2)

gloomyzerg
gloomyzerg
之前也造过这个轮子,后来还是转投ansible
sdvdxl
sdvdxl
有pssh这个命令
运维自动化管理服务器-CheungSSH

CheungSSH 是一款中国人自主研发的Linux运维自动化管理服务器软件,后端使用 Python 语言+Django 的 Web 框架,前端使用 Bootstrap+Javascript+jQuery 框架开发,通信协议采用 Linux 系统自带...

张其川
2015/06/10
40.2K
21
Windows 上的 SSH?使用 PowerShell Remoting 远程管理 Windows 服务器

作者:陈计节 个人博客:https://blog.jijiechen.com/post/powershell-remoting/ 在 Linux/Unix 世界里 SSH 是个好东西,SSH 是 Secure Shell 的缩写,用它可以很容易连接到指定的服务器,并...

.NET西安社区
07/25
0
0
使用PSSH批量管理Linux

前言 《Ubuntu系统批量自动安装》一文中,配置好了PXE服务器,也通过它安装了几台机器。每个机器都重新配置好了IP,已经可以远程访问了。现在新的问题来了,每个机器的主机名都相同,需要修改...

VoidKing
05/24
0
0
CheungSSH国产中文自动化运维堡垒机3.0

CheungSSHWeb3.0 前言 虽然不优秀,但请给予支持和理解 在当今互联网的发展大势下,云计算和大数据已经成为主导。在两大趋势下,企业的服务器数量日益增多,如何有效的管理众多的服务器,已经...

ttttdsads
2017/06/27
0
0
企业实战脚本案例3:批量管理自动化运维100台小规模服务器

批量管理自动化运维100台小规模服务器 目录 1.脚本背景介绍 2.脚本技术需求分析 2.1 SSH免登陆认证 2.2 Expect实现key分发 2.2 PSSH家族命令详解 3.脚本功能及实现过程 3.1 脚本运行环境介绍...

心的哲学
07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 懒床是对冬天最起码的尊重

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念 :分享daniwellP/桃音モモ的单曲《Nyan Cat》 《Nyan Cat》- daniwellP/桃音モモ 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪...

小小编辑
今天
27
2
码云项目100,水一发

简单回顾一下: 早期构想最多的,是希望能将PHP一些类和编码分区做得更细,所以很多尝试。但不得不说,PHP的功能过于单一,是的,也许写C/C++扩展,可以解决问题,那我为什么不用C#或者Golan...

曾建凯
今天
4
0
Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部