分享
  1. 首页
  2. 文章

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

jiangmitiao · · 1551 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:jiangmitiao

查看原文:使用GO语言灵活批量ssh登录服务器执行操作

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1551 次点击
下一篇:The Go scheduler
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏