使用GO语言灵活批量ssh登录服务器执行操作
摘要: 在工作中时常需要登录服务器做一系列操作,每次输入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登录服务器执行操作的更多相关文章
- [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)
转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...
- 批量ssh登录,获取操作系统、CPU、内存、硬盘信息<shell>
说明:该脚本读取machine.txt文件中的机器名,然后批量ssh登录,获取每台机器的操作系统,CPU,内存,硬盘等信息. 使用方法:将文件保存为sh,chmod +x filename 为该sh文 ...
- ssh登录服务器提示错误no hostkey alg
ssh登录服务器提示错误no hostkey alg ssh root@192.168.1.100 -vvv 提示失败: no hostkey alg 登录到192.168.1.100服务器 rm - ...
- centos linux ip地址无法连接数据库,ssh登录服务器时必须使用22端口
问题一:连接数据库时直接使用ip地址无法连接,必须使用ssh方式才能连接? 问题二:ssh登录服务器时必须使用22端口,在/etc/ssh/sshd_config中添加了10086端口,防火墙中已开启 ...
- Mac 无密码 SSH 登录服务器
Mac 无密码 SSH 登录服务器,只需要简单三步,不再需要记住账号密码,快速进入服务器 第一步,生成密钥对 在当前用户下创建.ssh目录 mkdir ~/.ssh 使用命令ssh-keygen生成密 ...
- 秘钥登录服务器执行shell脚本
做自动化的时候,有时候避免不了要和服务器有互动,刚巧碰上一个项目,需要执行命令才能完成本次测试. 昨天遇到的是秘钥形式的,只有秘钥和用户名,百度找了许久也没有思路,(能账号密码登录服务器的还简单些), ...
- 【转】使用shell登录远程服务器执行多条命令,ssh登录之后执行脚本文件
原文:https://blog.csdn.net/qq_36622490/article/details/100773589 这个需求主要是我在jenkins中pipeline的代码里,需要使用she ...
- linux下ssh远程登录服务器入门操作
使用用户名密码登录 在命令行中输入命令: ssh username@ip_address -p port 之后系统会提示输入密码,输入后即可登录 如果不添加-p选项,则默认是22端口 还可以使用-l选 ...
- git用户限制ssh登录服务器
服务器额外的防范措施: 搭建git服务器后通常会建立一个git账户,其它人共用这个账户来克隆或推送数据到git仓库中,通常也只需要这个功能,但是如果不加限制,那么其它人可以通过这个git账户登录到主机 ...
随机推荐
- Linux理念
1.小即是美 2.让程序只做好一件事 3.可移植性比效率更重要 4.一切即文件——使用方便而且吧硬件作为文件处理是安全的 5.使用shell脚本来提高效率和可移植性 6.避免使用可定制性低下的用户界面 ...
- C# if,ifelse语句
1,if语句的判断是根据布尔表达式的值. if语句主要有两种方式,如下 Code(1)if(boolean) do (2)if(boolean){ do } 一般大家都是用第二种方法,因为第一种方法只 ...
- 深入理解C#中this/partial/null的使用
一.this关键字作用 1.this表示当前运行中的对象 Eg: public class Person { public int age; public string name; public Pe ...
- windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法
windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法: 最近安装完发现8.1系统后,ubuntu无法加载以前的ntfs分区了,特别是我添加到了/etc/fstab里面了 导致 ...
- ios NSHashTable & NSMapTable
在ios开发中大家用到更多的集合类可能是像NSSet或者NSDictionary,NSArray这样的.这里要介绍的是更少人使用的两个类,一个是NSMapTable,另一个是NSHashTable. ...
- 500 OOPS: cannot change directory:/home/test
问题: 以root 从远程客户端 登录 FTP 一直密码错误. 发现不能以root 登录, 需要创建其它的用户. 创建一个test 用户后(如下): useradd test; passwd ...
- 100个iOS开发面试题汇总-王刚韧的技术博客
100个iOS开发面试题汇总 关于iOS开发面试,不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术问题环节不仅是企业对应聘者技能和积累的考察,也是一个开发者自我检验的 ...
- javascript BOM对象 第15节
<html> <head> <title>浏览器对象</title> <script type="text/javascript&quo ...
- 《ext江湖》第8章继承-代码片段
创建Animal对象 <html> <head> <title>11</title> <META HTTP-EQUIV="Content ...
- 10.26_地图应用, OSC_doc文档集合,node-webkit
(1)地图:关于电子地图的加载.展示方式,知乎上有篇文章写的很好:http://www.zhihu.com/question/21530085对于地图的导航距离计算呢?原理是什么? (2)node-w ...