bug:golang通过exec.Command()执行命令报错

bug:golang通过exec.Command()执行命令报错

1 通过exec指定zip命令报错

需求描述:压缩某个目录下的所有文件

  • 在执行过程中,发现zip命令可行,但是 /usr/bin/zip test.zip *发现无法压缩成功,程序直接报错退出,后来排查返现是golang中的exec.Command()不支持*通配符,但是我们可以通过下面的方式实现效果。

*替换为所有的文件名及目录:

package main

import (
	"fmt"
	"os/exec"
	"path/filepath"
)

func main() {
	zipName := "9999.zip"
	command := []string{
		"-r",
		zipName,
	}
	tmp, err := filepath.Glob("*")
	if len(tmp) == 0 {
		fmt.Println("No matching files found")
	}
	fmt.Println("* tmp=", tmp)
	command = append(command, tmp...)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("args=", command)

	cmd := exec.Command("/usr/bin/zip", command...)
	fmt.Println("compression cmd=", cmd)
	err = cmd.Run()
	if err != nil {
		fmt.Println("compression dir err=", err)
		return
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用 Golang 中的 exec 包登录主机并执行多条命令的示例代码: ```go package main import ( "fmt" "os/exec" "strings" ) func main() { // 定义登录主机的命令 sshCmd := "ssh user@hostname" // 定义要执行的命令 cmd1 := "uname -n" cmd2 := "ps aux | grep \"named\" | grep -v grep | wc -l" // 使用 exec.Command 方法创建一个 cmd 对象 cmd := exec.Command("bash", "-c", sshCmd + " \"" + cmd1 + ";" + cmd2 + "\"") // 执行命令并获取输出结果 output, err := cmd.Output() if err != nil { fmt.Println("执行命令出错:", err) return } // 将输出结果转换为字符串并按行分割 lines := strings.Split(string(output), "\n") // 获取第一条命令的输出结果 result1 := strings.TrimSpace(lines[0]) // 获取第二条命令的输出结果并转换为整数 result2 := strings.TrimSpace(lines[1]) count, err := strconv.Atoi(result2) if err != nil { fmt.Println("转换输出结果出错:", err) return } // 输出结果 fmt.Println("第一条命令的输出结果:", result1) fmt.Println("第二条命令的输出结果:", count) // 根据命令输出结果进行判断 if result1 == "hostname" && count > 0 { fmt.Println("命令执行成功!") } else { fmt.Println("命令执行失败!") } } ``` 这个示例代码中,我们首先定义了登录主机的命令 `sshCmd`,然后定义了要执行的两条命令 `cmd1` 和 `cmd2`,使用 `exec.Command` 方法创建一个 cmd 对象,并在其中执行这两条命令,最后将命令输出结果转换为字符串并按行分割,获取每条命令的输出结果,进行判断并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值