go exec.command root远程登录多个主机 执行 uname -n命令 并判断返回结果 请举例并解释代码含义
时间: 2024-02-20 17:56:26 浏览: 130
以下是一个示例代码,用于远程登录多个主机并执行 `uname -n` 命令,然后判断返回的主机名是否符合预期:
```go
package main
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
hosts := []string{"host1.example.com", "host2.example.com", "host3.example.com"}
for _, host := range hosts {
// 构建 ssh 命令
cmd := exec.Command("ssh", "-o", "StrictHostKeyChecking=no", "root@"+host, "uname -n")
// 执行 ssh 命令并等待其完成
var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Printf("Error executing ssh command on %s: %v\n", host, err)
continue
}
// 获取命令输出并判断主机名是否符合预期
hostname := stdout.String()
expectedHostname := host + "\n"
if hostname != expectedHostname {
fmt.Printf("Unexpected hostname on %s: expected %s but got %s", host, expectedHostname, hostname)
} else {
fmt.Printf("Hostname on %s is %s", host, hostname)
}
}
}
```
这段代码先定义了一个主机列表 `hosts`,然后遍历这个列表,在每个主机上执行 `ssh root@<host> uname -n` 命令,获取命令输出并判断主机名是否符合预期。
在执行 ssh 命令时,我们使用了 `exec.Command` 函数创建了一个 `*exec.Cmd` 对象,并设置了其 `Stdout` 和 `Stderr` 字段,以便在命令执行完毕后获取输出和错误信息。
在命令执行完毕后,我们从 `stdout` 缓冲区中获取了命令输出,并将其与预期的主机名进行比较。如果主机名不符合预期,则输出错误信息;否则输出正确的主机名。
阅读全文