import?(
"bytes"
"fmt"
"os/exec"
)
func?exec_shell()?(string,?error){
//函数返回一个*Cmd,用于使用给出的参数执行name指定的程序
cmd?:=?exec.Command("shutdown",?"-h","now")
//读取io.Writer类型的cmd.Stdout,再通过bytes.Buffer(缓冲byte类型的缓冲器)将byte类型转化为string类型(out.String():这是bytes类型提供的接口)
var?out?bytes.Buffer
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)
一般命令
所谓一般命令,就是在一定时间内会执行完的命令.比如 grep, cat 等等. 执行命令的步骤是:连接,执行,获取结果
连接
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 编译过程 九个步骤
第一步. 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语言调用操作系统命令相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!