go并发实现批量获取主机日志到本地
package main import ( "bufio" "fmt" "io" "os" "os/exec" "strings" "sync" "time" ) /* 并发实现 本地远程获取多个主机/var/log/messages.log 备份到本地目录以ip+端口命名。 实现步骤 1.准备ssh host文件 ip 用户名 端口(互为免密)1个物理机起了两个docker 不同ssh端口,所以备份到本地日志名格式为ip—端口-时间)
root,192.168.8.105,2020
root,192.168.8.105,2021 2.输入一条命令测试远程插入message.log文件是否正常 //获取当前时间 拼接备份文件名 3.远程备份messages.log文件 ip+端口+messages.log+时间格式文件( 4.copy远程文件到本地目录 每次覆盖之前的日志文件,然后删除远程备份文件log日志 */ func Logtime() string { now := time.Now() time_fmt := "2006-01-02-15-04-05" ts := now.Format(time_fmt) return ts } func ReadHost() []string { fin, err := os.Open("hosts.txt") if err != nil { fmt.Printf("打开文件失败:%v\n", err) } defer fin.Close() reder := bufio.NewReader(fin) Hostslice := []string{} for { line, err := reder.ReadString('\n') if err != nil { if err == io.EOF { break } else { fmt.Printf("读文件失败:%v\n", err) } } else { line = strings.TrimRight(line, "\n") /*str 切割获取3位 str := strings.Split(line, ",") if len(str) == 3 { a,b,c = str[0],str[1],str[2] } */ Hostslice = append(Hostslice, line) } } return Hostslice } var wg = sync.WaitGroup{} func SSH_CMD(hostlist []string) { P := len(hostlist) wg.Add(P) fmt.Println(len(hostlist), hostlist) for i := 1; i < len(hostlist); i++ { for _, v := range hostlist { //并发 go func(v string) { defer wg.Done() host_msg := strings.Split(v, ",") host_port := host_msg[2] user_ip := host_msg[0] + "@" + host_msg[1] //command指令 command_log := "cat /var/log/message.log" insert_msg := "echo 'insert hello 01'>> /var/log/message.log" //插入远程主机一条信息 insert_msg_command := exec.Command("ssh", user_ip, "-p", host_port, insert_msg) insert_msg_command.Run() //查看远程主机message.log日志 cmd := exec.Command("ssh", user_ip, "-p", host_port, command_log) output, err := cmd.Output() if err != nil { fmt.Printf("发生错误%s", err) } else { fmt.Printf("%s", output) cmd.Run() } //生成时间格式文件备份message.log 格式为 message.log-2022-09-18-15:37:46 ts := Logtime() Messages_Time_Name := "/var/log/" + host_msg[1] + "-message.log-" + ts fmt.Println(Messages_Time_Name, "copy阶段") bak_message_name := "cp /var/log/message.log " + Messages_Time_Name bak_message_command := exec.Command("ssh", user_ip, "-p", host_port, bak_message_name) fmt.Println(bak_message_command) bak_message_command.Run() //scp 远程主机文件到本地 //scp -rp -P 22 /var/log/message.log mzk@192.168.8.105:/Users/mzk/ //推模式 远程主机目录推到本地 // remote_to_localhost := "scp -rp -P 22 /var/log/message.log mzk@192.168.8.105:/Users/mzk/host_message/" remote_to_localhost := "scp -rp -P 22 " + Messages_Time_Name + " " + "mzk@192.168.8.105:/Users/mzk/host_message/" + host_msg[1] + "-" + host_port + " " + "&& rm -rf " + Messages_Time_Name + "" //执行命令/usr/bin/ssh root@192.168.8.105 -p 2020 scp -rp -P 22 /var/log/192.168.8.105-message.log-2022-09-18-16-13-23 mzk@192.168.8.105:/Users/mzk/host_message/192.168.8.105 && rm -rf /var/log/192.168.8.105-message.log-2022-09-18-16-13-23 scp_command := exec.Command("ssh", user_ip, "-p", host_port, remote_to_localhost) fmt.Println(scp_command) scpoutput, err := scp_command.Output() if err != nil { fmt.Printf("\n>>>>>>%s----发生错误%s\n", host_msg[1], err) } else { fmt.Printf("%s", scpoutput) scp_command.Run() } }(v) //并发需要copy把值传进来([root,192.168.8.105,2020],[root,192.168.8.105,2021])2个线程 } } wg.Wait() } func main() { hostlist := ReadHost() SSH_CMD(hostlist) /* 如果main线程提前终止 其他线程没有执行完,会导致整个程序退出 var wg = sync.WaitGroup{} const P = 2 wg.Add(P) //初始值为1 go func() { defer wg.Done() SSH_CMD(hostlist) //do something }() wg.Wait() */ // time.Sleep(5 * time.Second) }



浙公网安备 33010602011771号