程序本质:
读取dev.txt,cli.txt的内容,通过多并发进行连接linux服务器完成操控命令的执行,多用于运维或者开发管理多台服务器,基本相同的操作,通过这个代码就是可以完成操作linux以及多命令的执行事项
dev.txt--服务器信息
192.168.20.18 root 123456
192.168.20.19 root 123456
cli.txt文件内容:--linux命令行,都是存放在这里
df -h
uname -r
ls
sshv2.go文件
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"strings"
"sync"
"golang.org/x/crypto/ssh"
)
func main() {
var wg sync.WaitGroup
devs := dev("dev.txt")
lines := len(devs)
wg.Add(lines)
for _, line := range devs {
go session(line, &wg)
}
wg.Wait()
//time.Sleep(3 * time.Second)
}
func session(row string, wg *sync.WaitGroup) {
if len(row) != 0 {
strings.ReplaceAll(row, "\n", "")
info := strings.Split(row, " ")
addr := info[0]
user := info[1]
passwd := info[2]
sshGo(user, passwd, addr, "cli.txt")
}
wg.Done()
}
func sshGo(user string, passwd string, addr string, txt string) {
addr1 := fmt.Sprintf("%s%s", addr, ":22")
config := &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{
ssh.Password(passwd),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
client, err := ssh.Dial("tcp", addr1, config)
if err != nil {
log.Fatal("Failed to dial: ", err)
}
defer client.Close()
session, err := client.NewSession()
if err != nil {
log.Fatal("Failed to create session: ", err)
}
defer session.Close()
cli := coms(txt)
res, err := session.CombinedOutput(cli)
if err != nil {
log.Fatal("Failed to run: " + err.Error())
}
wf(addr+".log", string(res))
log.Printf("log file: %s.log\n", addr)
}
func dev(path string) []string {
file, err := os.OpenFile(path, os.O_RDONLY, 0666)
if err != nil {
panic(err)
}
defer file.Close()
readBytes, err := ioutil.ReadAll(file)
if err != nil {
panic(err)
}
res := strings.Split(string(readBytes), "\n")
return res
}
func coms(path string) string {
file, err := os.OpenFile(path, os.O_RDONLY, 0666)
if err != nil {
panic(err)
}
defer file.Close()
readBytes, err := ioutil.ReadAll(file)
if err != nil {
panic(err)
}
res := strings.ReplaceAll(string(readBytes), "\n", ";")
return res
}
func wf(filename string, data string) {
file, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0200)
if err != nil {
fmt.Println(err)
return
}
content := fmt.Sprintf("%s%c", data, '\n')
file.WriteString(content)
file.Close()
}
备注:运行上述代码的方法,在所在程序的目录下命令行下运行
#init mod的初始方式
1.“go mod init xxx”
#下载需要的包文件
2.go mod tidy