使用Golang通过SSH连接服务器、过滤输出并发送邮件给群组

使用Golang通过SSH连接服务器、过滤输出并发送邮件给群组 我之前用Perl编写过执行以下操作的脚本: 登录到存储阵列,运行监控命令,将输出收集到文本文件中,然后使用正则表达式从输出中提取所需部分,并将输出通过邮件发送给一个群组。

存储阵列的用户名和密码保存在单独的文件中。存储阵列的IP地址保存在另一个文件中。这些都是文本文件,作为Perl脚本的输入。

我想知道是否可以在Golang中实现相同的功能?因为它也将文件视为一种"字节流"。此外,Perl/Python有现成的SSH模块可以使用。Golang是否有类似的东西?

或者,也许上述方法最适合Perl或Python,但对于Golang,我需要以不同的方式处理这个任务?

请注意——我不是在寻找现成的脚本/程序,我只是想了解一些高层次的信息,确认这在Golang中是否可行,以及我是否可以采用相同的方法。

由于工作安排,我无法每天分配时间学习,因此提出这个问题。


更多关于使用Golang通过SSH连接服务器、过滤输出并发送邮件给群组的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

存在一个用于 Go 的 SSH 库。当然,Go 可以像其他语言一样处理文件操作。因此,用 Go 实现你所需的功能是可行的。

但既然你称现有的代码为"脚本",也许你应该继续使用熟悉的脚本编写方法。

更多关于使用Golang通过SSH连接服务器、过滤输出并发送邮件给群组的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中完全可以实现您描述的功能,并且可以采用与Perl类似的方法。以下是技术层面的详细说明:

SSH连接

Golang标准库中没有内置SSH客户端,但可以使用第三方包 golang.org/x/crypto/ssh

import (
    "golang.org/x/crypto/ssh"
    "io/ioutil"
)

func createSSHClient(ip, username, password string) (*ssh.Client, error) {
    config := &ssh.ClientConfig{
        User: username,
        Auth: []ssh.AuthMethod{
            ssh.Password(password),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }
    
    return ssh.Dial("tcp", ip+":22", config)
}

执行命令并获取输出

func runCommand(client *ssh.Client, command string) (string, error) {
    session, err := client.NewSession()
    if err != nil {
        return "", err
    }
    defer session.Close()
    
    output, err := session.CombinedOutput(command)
    if err != nil {
        return "", err
    }
    
    return string(output), nil
}

文本处理

Golang有强大的正则表达式支持和字符串处理能力:

import "regexp"

func filterOutput(output, pattern string) string {
    re := regexp.MustCompile(pattern)
    matches := re.FindAllString(output, -1)
    
    var result string
    for _, match := range matches {
        result += match + "\n"
    }
    return result
}

发送邮件

可以使用标准库 net/smtp

import "net/smtp"

func sendEmail(to []string, subject, body string) error {
    from := "monitor@company.com"
    msg := "From: " + from + "\n" +
           "To: " + strings.Join(to, ",") + "\n" +
           "Subject: " + subject + "\n\n" +
           body
    
    return smtp.SendMail("mailserver:25", nil, from, to, []byte(msg))
}

文件读取

读取IP地址和凭据文件:

func readLines(filename string) ([]string, error) {
    content, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    
    lines := strings.Split(string(content), "\n")
    var result []string
    for _, line := range lines {
        if trimmed := strings.TrimSpace(line); trimmed != "" {
            result = append(result, trimmed)
        }
    }
    return result, nil
}

整体流程

func main() {
    ips, _ := readLines("ip_addresses.txt")
    credentials, _ := readLines("credentials.txt")
    
    for _, ip := range ips {
        client, _ := createSSHClient(ip, credentials[0], credentials[1])
        output, _ := runCommand(client, "monitoring-command")
        filtered := filterOutput(output, `your-regex-pattern`)
        
        recipients := []string{"group@company.com"}
        sendEmail(recipients, "Monitoring Report", filtered)
        client.Close()
    }
}

Golang处理这类任务非常合适,代码结构清晰,性能优秀。文件处理确实如您所说基于字节流,正则表达式和字符串处理能力强大,SSH和邮件发送都有成熟的库支持。这种方法与Perl的实现思路基本一致,可以直接迁移。

回到顶部