网站首页 > 文章中心 > 其它

go语言调用操作系统命令_如果无法避免直接调用操作系统命令

作者:小编 更新时间:2023-10-16 07:24:37 浏览量:228人看过

可以用go语言成功执行shutdown命令吗?怎么做

import?(

"bytes"

"fmt"

"os/exec"

)

func?exec_shell()?(string,?error){

go语言调用操作系统命令_如果无法避免直接调用操作系统命令-图1

//函数返回一个*Cmd,用于使用给出的参数执行name指定的程序

cmd?:=?exec.Command("shutdown",?"-h","now")

//读取io.Writer类型的cmd.Stdout,再通过bytes.Buffer(缓冲byte类型的缓冲器)将byte类型转化为string类型(out.String():这是bytes类型提供的接口)

var?out?bytes.Buffer

go语言调用操作系统命令_如果无法避免直接调用操作系统命令-图2

cmd.Stdout?=?out

//Run执行c包含的命令,并阻塞直到完成.?这里stdout被取出,cmd.Wait()无法正确获取stdin,stdout,stderr,则阻塞在那了

err?:=?cmd.Run()

return?out.String(),?err

}

func?main(){

if?result,err:=exec_shell();err!=nil{

fmt.Println("error:",err)

}else{

fmt.Println("exec?succ?",?result)

如何使用Go语言实现远程执行命令

一般命令

所谓一般命令,就是在一定时间内会执行完的命令.比如 grep, cat 等等. 执行命令的步骤是:连接,执行,获取结果

连接

go语言调用操作系统命令_如果无法避免直接调用操作系统命令-图3

import (

"time"

"golang.org/x/crypto/ssh"

func connect(user, password, host string, port int) (*ssh.Session, error) {

var (

auth []ssh.AuthMethod

addr string

clientConfig *ssh.ClientConfig

client *ssh.Client

session *ssh.Session

err error

// get auth method

auth = make([]ssh.AuthMethod, 0)

auth = append(auth, ssh.Password(password))

clientConfig = ssh.ClientConfig{

User: user,

Auth: auth,

// connet to ssh

addr = fmt.Sprintf("%s:%d", host, port)

if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {

return nil, err

// create session

if session, err = client.NewSession(); err != nil {

return session, nil

连接的方法很简单,只要提供登录主机的 用户*, *密码*, *主机名或者IP*, *SSH端口

执行,命令获取结果

连接成功后,执行命令很简单

"log"

"os"

func main() {

if err != nil {

log.Fatal(err)

defer session.Close()

session.Run("ls /; ls /abc")

上面代码运行之后,虽然命令正常执行了,但是没有正常输出的结果,也没有异常输出的结果. 要想显示结果,需要将 session 的 Stdout 和 Stderr 重定向 修改 func main 为如下:

session.Stdout = os.Stdout

session.Stderr = os.Stderr

这样就能在屏幕上显示正常,异常的信息了.

交互式命令

fd := int(os.Stdin.Fd())

oldState, err := terminal.MakeRaw(fd)

panic(err)

defer terminal.Restore(fd, oldState)

// excute command

session.Stdin = os.Stdin

termWidth, termHeight, err := terminal.GetSize(fd)

// Set up terminal modes

modes := ssh.TerminalModes{

ssh.ECHO: 1, // enable echoing

// Request pseudo terminal

session.Run("top")

Go 是怎么使用 Go 来编译自身的

是Go语言吗?

Go 编译过程 九个步骤

第一步. all.bash

%?cd?$GOROOT/src

%?./all.bash

第二步. make.bash

.?./make.bash?--no-banner

make.bash 作为 all.bash 内容的一部分,如果它退出也会中断构建过程

第三步. cmd/dist

当健全检查完成后,make.bash 开始编译?cmd/dist.

第四步. go_bootstrap

现在 go_bootstrap 已经构建完成,make.bash 的最后一步是使用 go_bootstrap 编译完整的 Go 标准库,包括一个完整的 go 工具用以替换.

echo?"#?Building?packages?and?commands?for?$GOOS/$GOARCH."

"$GOTOOLDIR"/go_bootstrap?install?-gcflags?"$GO_GCFLAGS"?\

-ldflags?"$GO_LDFLAGS"?-v?std

第五步. run.bash

现在 make.bash 已经完成,回到 all.bash 的执行,这会调用 run.bash.run.bash 的任务是编译和测试标准库、运行时以及语言测试集.

bash?run.bash?--no-rebuild

由于 make.bash 和 run.bash 都会调用 go install -a std,所以呢需要使用 –no-rebuild 标志来避免重复前面的步骤,–no-rebuild 跳过了第二个 go install.

#?allow?all.bash?to?avoid?double-build?of?everythingrebuild=trueif?[?"$1"?=?"--no-rebuild"?];?then?shiftelse?echo?'#?Building?packages?and?commands.'?time?go?install?-a?-v?std?echofi

第六步. go test -a std

echo?'#?Testing?packages.'

echo

此时此刻呢 run.bash 会在标准库里所有的包上来运行用 testing 包编写的单元测试.由于 $GOPATH 和 $GOROOT 中有着相同的命名空间,所以不能直接使用 go test ... 否则 $GOPATH 中的每个包也会被逐一测试,所以呢创建了一个用于标准库中的包的别名:std.由于一些测试需要比较长的时间,且会消耗大量内存,所以呢用 -short 标志对一些测试进行了过滤.

第七步. runtime 和 cgo 测试

run.bash 此时此刻呢的部分会运行平台对 cgo 支持的测试,执行一些性能测试,并且编译一些伴随 Go 发行版一起的杂项程序.随着时间的流逝,这些杂项程序的清单会越来越长,那么它们也就会不可避免的被从编译过程中悄悄剥离出去.

第八步. go run test

(xcd?../test

unset?GOMAXPROCS

time?go?run?run.go

)?||?exit?$?

run.bash 的倒数第二步会调用在 $GOROOT 下的 test 目录里的编译器和运行时的测试.他们是对于编译器和运行时自身的,较为低级细节的测试.会执行语言规格测试,test/bugs 和 test/fixedbugs 子目录保存有那些已经被发现并被修复的问题的独立的测试.驱动测试的是一个小 Go 程序 $GOROOT/test/run.go,会执行 test 目录里的每个 .go 文件.一些 .go 文件的首行包含了指导 run.go 对结果作出判断的指令,例如,程序将会失败,或提供一个确定的输出队列.

第九步. go tool api

echo?'#?Checking?API?compatibility.'

go?tool?api?-c?$GOROOT/api/go1.txt,$GOROOT/api/go1.1.txt?\

-next?$GOROOT/api/next.txt?-except?$GOROOT/api/except.txt

run.bash 的最后一步调用了 api 工具.

以上就是土嘎嘎小编为大家整理的go语言调用操作系统命令相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章