写在前面
在写go程序时,有时需要在Linux中使用某些命令行实现一些配置和功能。但是手动配置又过于麻烦,这时就可以用go中的exec包。里面的Command()方法可以实现用go代码调用Linux命令行并执行。
使用方法
调用单个普通命令
package main
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("ls")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
fmt.Println("命令执行出错:", err)
return
}
fmt.Println("命令输出:\n", out.String())
}
这个示例调用了 Linux中的 ls 命令,效果图如下:
可以看到,命令输出的结果与手动输出的结果相同。
调用多行命令
package main
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
// 多行命令,使用分号分隔
multiLineCommand := `echo "Hello"; echo "World"`
// 执行命令
cmd := exec.Command("sh", "-c", multiLineCommand)
// 创建buffer来捕获标准输出
var out bytes.Buffer
cmd.Stdout = &out
// 运行命令
err := cmd.Run()
if err != nil {
fmt.Println("命令执行出错:", err)
return
}
// 打印输出结果
fmt.Println("命令输出:", out.String())
}
上面代码执行了 echo “hello” 与 echo “world” 两个命令,效果图如下:
可以看到代码输出结果相当于执行了两条Linux命令。
进阶用法
下面展示一下批量执行带参数输入的Linux命令的例子。
package main
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
var int_strings = []string{"1", "2", "3", "4", "5"}
var addr_strings = []string{"192.168.1.1/24", "192.168.1.2/24", "192.168.1.3/24", "192.168.1.4/24", "192.168.1.5/24"}
multiLineCommand := ""
for key, value := range int_strings {
multiLineCommand += fmt.Sprintf("ip link add name %v type dummy;", value)
multiLineCommand += fmt.Sprintf("ip addr add %v dev %v;", addr_strings[key], value)
multiLineCommand += fmt.Sprintf("ip link set %v up;", value)
}
multiLineCommand = "`" + multiLineCommand + "`"
fmt.Printf("multiLineCommand is %v\n", multiLineCommand)
cmd := exec.Command("/bin/bash", "-c", multiLineCommand)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
fmt.Println("命令执行出错:", err)
}
fmt.Println("命令输出:", out.String())
}
上述代码实现了在Linux中创建int_strings里面的接口,并将addr_strings中的ip地址一对一地添加到相应地接口上,并将接口up。
执行效果图如下:
在Linux中用 ip addr 命令 查看代码执行结果是否正确
写在最后
以上就是用Go代码调用Linux命令的一些简单用法,如果在开发过程中,有需要对Linux进行配置的相关逻辑,可以考虑一下使用这种方法。