摘要: 在工作中时常需要登录服务器做一系列操作,每次输入ssh xxx总是很麻烦。这时候为什么不考虑写一个通用的小脚本呢?

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,则执行所有配置项。也就是说如果有固定执行的任务,可以很方便地批量去操控了。

https://my.oschina.net/jiangmitiao/blog/753883

使用GO语言灵活批量ssh登录服务器执行操作的更多相关文章

  1. [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)

    转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...

  2. 批量ssh登录,获取操作系统、CPU、内存、硬盘信息<shell>

    说明:该脚本读取machine.txt文件中的机器名,然后批量ssh登录,获取每台机器的操作系统,CPU,内存,硬盘等信息. 使用方法:将文件保存为sh,chmod +x filename 为该sh文 ...

  3. ssh登录服务器提示错误no hostkey alg

    ssh登录服务器提示错误no hostkey alg ssh root@192.168.1.100 -vvv 提示失败: no hostkey alg 登录到192.168.1.100服务器 rm - ...

  4. centos linux ip地址无法连接数据库,ssh登录服务器时必须使用22端口

    问题一:连接数据库时直接使用ip地址无法连接,必须使用ssh方式才能连接? 问题二:ssh登录服务器时必须使用22端口,在/etc/ssh/sshd_config中添加了10086端口,防火墙中已开启 ...

  5. Mac 无密码 SSH 登录服务器

    Mac 无密码 SSH 登录服务器,只需要简单三步,不再需要记住账号密码,快速进入服务器 第一步,生成密钥对 在当前用户下创建.ssh目录 mkdir ~/.ssh 使用命令ssh-keygen生成密 ...

  6. 秘钥登录服务器执行shell脚本

    做自动化的时候,有时候避免不了要和服务器有互动,刚巧碰上一个项目,需要执行命令才能完成本次测试. 昨天遇到的是秘钥形式的,只有秘钥和用户名,百度找了许久也没有思路,(能账号密码登录服务器的还简单些), ...

  7. 【转】使用shell登录远程服务器执行多条命令,ssh登录之后执行脚本文件

    原文:https://blog.csdn.net/qq_36622490/article/details/100773589 这个需求主要是我在jenkins中pipeline的代码里,需要使用she ...

  8. linux下ssh远程登录服务器入门操作

    使用用户名密码登录 在命令行中输入命令: ssh username@ip_address -p port 之后系统会提示输入密码,输入后即可登录 如果不添加-p选项,则默认是22端口 还可以使用-l选 ...

  9. git用户限制ssh登录服务器

    服务器额外的防范措施: 搭建git服务器后通常会建立一个git账户,其它人共用这个账户来克隆或推送数据到git仓库中,通常也只需要这个功能,但是如果不加限制,那么其它人可以通过这个git账户登录到主机 ...

随机推荐

  1. verilog 数组参数

    verilog 支持定义数组参数,这样工程很大时,例化模块时可以使代码更简洁:详见实例 module dma_controller #( parameter integer C0_MAX_MIG_BL ...

  2. C#的类型、变量和值

    大学学了C#,工作也是使用C#,虽然在日常的开发中没什么大的问题,但个人觉得在C#的理解还不是很清晰,所以决定花一定的时间来理一理学过的知识,顺便革新下脑袋里的知识,因为坑爹的学校在教.net的时候, ...

  3. 解读Spring Ioc容器设计图

    在Spring Ioc容器的设计中,有俩个主要的容器系列:一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能:另外一个是ApplicationContext应用上下 ...

  4. Android测试分析3

    一个基本的测试用例-- 如果是在eclipse中开发,那么需要在AndroidManifest.xml中加入如下两段代码:    <uses-library android:name=" ...

  5. 【SQL】Update中使用表别名、如何用表中一列值替换另一列的所有值

    Update中使用表别名 select中的表别名: select * from TableA as ta update中的表别名: update ta from TableA as ta 如何用表中一 ...

  6. JS调用PHP 和 PHP调用JS的方法举例

    http://my.oschina.net/jiangchike/blog/220988 1.JS方式调用PHP文件并取得PHP中的值举一个简单的例子来说明:如在页面test_json1中用下面这句调 ...

  7. IOS-开发日志-UIScrollView

    UIScrollView 1.  contentOffset 默认CGPointZero,用来设置scrollView的滚动偏移量. // 设置scrollView的滚动偏移量 scrollView. ...

  8. 深入理解Javascript之this关键字

    深入理解Javascript之this关键字 作者: Laruence(   ) 本文地址: http://www.laruence.com/2009/09/08/1076.html 转载请注明出处 ...

  9. 关于arcgis 9.3破解问题详解

    对于初学GIS的同学,安装软件可能会遇到各种各样的问题,对于photoshop,autocad,sketchup,3dmax等软件我们的我们无非是输入特定序列号或者用工具随机生成特定序列号就可以破解, ...

  10. jQuery如何阻止子元素继承父元素事件?

    <a> <b></b> </a> $("a").click(...); 这种绑定的话,b也会响应一次事件,如何只对a元素绑定事件,而 ...