golang执行Linux和Windows命令

1. 可接收变参命令

package main
import (
    "fmt"
    "os"
    "os/exec"
    "strings"
)

func main(){
    sliceFunc(os.Args[1:]...)
}

func sliceFunc(cmd... string){
    fmt.Println(cmd)
    if len(cmd) == 0 {
        fmt.Printf("Usage: %s args...\n", os.Args[0])
        os.Exit(-1)
    }
    fmt.Println(cmdFunc(cmd...))
}

func cmdFunc(cmd... string) string {
    fmt.Printf("cmd slice len: %d, value:%v\n", len(cmd),  cmd)
    result, err := exec.Command(cmd[0], cmd[1:]...).Output()
    if err != nil {
        fmt.Println("Command failed:", err.Error())
    }   

//  return string(result)  // with ‘\n‘
    return strings.TrimSpace(string(result))
}

执行结果:

$ go run slice.go uname -a
[uname -a]
cmd slice len: 2, value:[uname -a]
Linux e531 5.0.0-29-generic #31~18.04.1-Ubuntu SMP Thu Sep 12 18:29:21 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ go run slice.go uname
[uname]
cmd slice len: 1, value:[uname]
Linux

2. Linux和Windows命令

只接收单个命令并执行:

package main

import (
    "fmt"
    "errors"
    "os"
    "os/exec"
    "runtime"
    "strings"
)

func main(){
    if len(os.Args) == 1{
        fmt.Printf("Usage: %s args...\n", os.Args[0])
        os.Exit(-1)
    }
    str1, err := RunCommandWithErr(os.Args[1])
    if err != nil {
        fmt.Println(err.Error())
    } else {
        fmt.Println(str1)
    }

    str := RunCommand(os.Args[1])
    fmt.Println(str)
}

func runInLinux(cmd string) string{
    fmt.Println("Running Linux cmd:" , cmd)
    result, err := exec.Command("/bin/sh", "-c", cmd).Output()
    if err != nil {
        fmt.Println(err.Error())
    }
    return strings.TrimSpace(string(result))
}

func runInWindows(cmd string) string{
    fmt.Println("Running Win cmd:", cmd)
    result, err := exec.Command("cmd", "/c", cmd).Output()
    if err != nil {
        fmt.Println(err.Error())
    }
    return strings.TrimSpace(string(result))
}

func RunCommand(cmd string) string{
    if runtime.GOOS == "windows" {
        return runInWindows(cmd)
    } else {
        return runInLinux(cmd)
    }
}

func RunLinuxCommand(cmd string) string{
    if runtime.GOOS == "windows" {
        return ""
    } else {
        return runInLinux(cmd)
    }
}

func runInLinuxWithErr(cmd string) (string, error) {
    fmt.Println("Running Linux cmd:"+cmd)
    result, err := exec.Command("/bin/sh", "-c", cmd).Output()
    if err != nil {
        fmt.Println(err.Error())
    }
    return strings.TrimSpace(string(result)), err
}

func runInWindowsWithErr(cmd string) (string, error){
    fmt.Println("Running Windows cmd:"+cmd)
    result, err := exec.Command("cmd", "/c", cmd).Output()
    if err != nil {
        fmt.Println(err.Error())
    }
    return strings.TrimSpace(string(result)), err
}

func RunCommandWithErr(cmd string) (string, error){
    if runtime.GOOS == "windows" {
        return runInWindowsWithErr(cmd)
    } else {
        return runInLinuxWithErr(cmd)
    }
}

func RunLinuxCommandWithErr(cmd string)(string, error){
    if runtime.GOOS == "windows" {
        return "", errors.New("could not run in Windows Os")
    } else {
        return runInLinuxWithErr(cmd)
    }
}

执行结果:

$ go run cmd.go uname
Running Linux cmd:uname
Linux
Running Linux cmd: uname
Linux
$ go run cmd.go uname -a
Running Linux cmd:uname
Linux
Running Linux cmd: uname
Linux

参考:

1. golang功能代码

原文地址:https://www.cnblogs.com/embedded-linux/p/11619637.html

时间: 2024-11-24 15:22:20

golang执行Linux和Windows命令的相关文章

Mac OSX系统、Linux、Windows命令行教程

Mac OSX系统.Linux.Windows命令行教程 一.各系统终端的使用方法 二.各系统命令的功能 用你的终端做一些事情 (command line, Terminal, PowerShell). 一.各系统终端的使用方法 Mac OSX 在Mac OSX系统上,你应该 按住 command 键,并敲空格键. 屏幕顶部会弹出一个蓝色的"搜索框". 输入"terminal". 点击终端应用程序,这个程序的图标看起来有点像一个黑盒子. 终端就打开了. 现在你可以在

解决python执行linux查看文件命令后,因为^@特殊符号导致部分内容不显示的问题

问题现象 文件a的内容如下: 查看第2行到第5行的内容:sed -n '2,5p' /tmp/test/a 可见在命令行执行,是没有问题的. 在python中使用paramiko模块执行linux命令,主要代码如下: def toServer(self, str): sys.setdefaultencoding('utf-8') return str.decode('utf-8').encode('GB18030') def fromServer(self, str): sys.setdefau

linux、WINDOWS命令行下查找和统计行数

linux : 例子: netstat -an | grep TIME_WAIT | wc -l |  管道符 grep 查找命令 wc 统计命令 windows: 例子: netstat -an | find /i /c "TIME_WAIT" find 查找命令  /i 选项 忽略大小写   /c 统计行数    “TIME_WAIT” 要查找的内容(记得双引号) 例子 netstat -an | findstr /N TIME_WAIT

GoLang执行需要输入密码的命令

需求 同步一组视频到其他节点 限制带宽,防止占用过多带宽对访问造成影响 分析 Linux命令scp,rsync满足需求 使用以上命令都需要输入服务器密码,这里给出2个方案 对各个节点做免密 使用gexpect库 免密(推荐) 实例演示服务器用户名为root,IP为192.168.1.208 本地生成公私钥 ssh-keygen (一路回车默认即可) 以上命令会在~/.ssh下创建两个密钥 id_rsa (私钥) id_rsa.pub (公钥) 上传公钥 ssh-copy-id -i ~/.ssh

linux 远程 windows 命令:rdesktop

[[email protected] tmp]# which rdesktop /usr/bin/rdesktop [[email protected] tmp]# rpm -qf /usr/bin/rdesktop rdesktop-1.7.1-1.el6.x86_64

【erlang】执行linux命令的两种方法

os.cmd(Cmd) os模块提供了cmd函数可以执行linux系统shell命令(也可以执行windows命令).返回一个Cmd命令的标准输出字符串结果.例如在linux系统中执行os:cmd("date"). 返回linux的时间. 这种比较简单,一般情况下,也满足了大部分需求. erlang:open_port(PortName, PortSettings) 当os.cmd(Cmd) 满足不了你的需求的时候,就可以用强大的open_port(PortName, PortSett

[Python] 利用commands模块执行Linux shell命令

用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要函数: 1. commands.getoutput('shell command') 执行shell命令,返回结果(string类型) >>> commands.getoutput('pwd') '/home/oracle' 2. commands.getstatus('file') 该函数

用python执行Linux命令

例1:在python中包装ls命令 #!/usr/bin/env python#python wapper for the ls commandimport subprocesssubprocess.call(["ls","-l"]) 在Linux中执行该命令 [[email protected] python]# python ls.pytotal 8-rwxrwxrwx 1 root root 415 Mar 18 11:40 a.py-rw-r--r-- 1 

C#获取远程计算机硬件信息实例(支持linux和windows)

原文:C#获取远程计算机硬件信息实例(支持linux和windows) 网上关于WMI的资料很多,但一直没有比较全的属性介绍.今天通过反射把所有属性都给弄出来了. 关于WMI的代码就不多说了. 需要手动添加引用:System.Management /// <summary>        /// 获取查询队列        ///         /// </summary>        /// <param name="ip"></para