❶ Go執行命令行操作
go中提供了 os/exec 包使用 Command 函數可以完成一些調用命令行的操作。因為系統的不同,調用的參數會有點些不一樣。
其他的創建執行都是一樣的。
我們可以封裝一個函數,輸入需要執行的命令,輸入返回結果
調用測試
❷ 如何使用Go語言實現遠程執行命令
一般命令
所謂一般命令,就是在一定時間內會執行完的命令。比如 grep, cat 等等。 執行命令的步驟是:連接,執行,獲取結果
連接
連接包含了認證,可以使用 password 或者 sshkey 2種方式來認證。下面的示例為了簡單,使用了密碼認證的方式來完成連接。
import (
"fmt"
"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,
Timeout: 30 * time.Second,
}
// 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 nil, err
}
return session, nil
}
連接的方法很簡單,只要提供登錄主機的 用戶*, *密碼*, *主機名或者IP*, *SSH埠
執行,命令獲取結果
連接成功後,執行命令很簡單
import (
"fmt"
"log"
"os"
"time"
"golang.org/x/crypto/ssh"
)
func main() {
session, err := connect("root", "xxxxx", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()
session.Run("ls /; ls /abc")
}
上面代碼運行之後,雖然命令正常執行了,但是沒有正常輸出的結果,也沒有異常輸出的結果。 要想顯示結果,需要將 session 的 Stdout 和 Stderr 重定向 修改 func main 為如下:
func main() {
session, err := connect("root", "xxxxx", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Run("ls /; ls /abc")
}
這樣就能在屏幕上顯示正常,異常的信息了。
互動式命令
上面的方式無法遠程執行互動式命令,比如 top , 遠程編輯一個文件,比如 vi /etc/nginx/nginx.conf 如果要支持互動式的命令,需要當前的terminal來接管遠程的 PTY。
func main() {
session, err := connect("root", "olordjesus", "dockers.iotalabs.io", 2210)
if err != nil {
log.Fatal(err)
}
defer session.Close()
fd := int(os.Stdin.Fd())
oldState, err := terminal.MakeRaw(fd)
if err != nil {
panic(err)
}
defer terminal.Restore(fd, oldState)
// excute command
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin
termWidth, termHeight, err := terminal.GetSize(fd)
if err != nil {
panic(err)
}
// Set up terminal modes
modes := ssh.TerminalModes{
ssh.ECHO: 1, // enable echoing
ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
}
// Request pseudo terminal
if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {
log.Fatal(err)
}
session.Run("top")
}
❸ 寫命令行應用程序什麼不可或缺Go可以這樣處理命令行參數
Go語言內置的flag包實現了命令行參數的解析,flag包使得開發命令行工具更為簡單。
如果你只是簡單的想要獲取命令行參數,可以像下面的代碼示例一樣使用os.Args來獲取命令行參數。
將上面的代碼執行go build -o "args_demo"編譯之後,執行:
os.Args是一個存儲命令行參數的字元串切片,它的第一個元素是執行文件的名稱。
本文介紹了flag包的常用函數和基本用法,更詳細的內容請查看官方文檔。
flag包支持的命令行參數類型有bool、int、int64、uint、uint64、float float64、string、ration。
有以下兩種常用的定義命令行flag參數的方法。
基本格式如下:
flag.Type(flag名, 默認值, 幫助信息)*Type 例如我們要定義姓名、年齡、婚否三個命令行參數,我們可以按如下方式定義:
需要注意的是,此時name、age、married、delay均為對應類型的指針。
基本格式如下: flag.TypeVar(Type指針, flag名, 默認值, 幫助信息) 例如我們要定義姓名、年齡、婚否三個命令行參數,我們可以按如下方式定義:
通過以上兩種方法定義好命令行flag參數後,需要通過調用flag.Parse()來對命令行參數進行解析。
支持的命令行參數格式有以下幾種:
其中,布爾類型的參數必須使用等號的方式指定。
Flag解析在第一個非flag參數(單個」-「不是flag參數)之前停止,或者在終止符」–「之後停止。
定義
使用
命令行參數使用提示:
$ ./flag_demo -help
Usage of ./flag_demo:
-age int
年齡 (default 18)
-d ration
時間間隔
-married
婚否
-name string
姓名 (default "張三")
正常使用命令行flag參數:
使用非flag命令行參數:
原文鏈接:https://www.liwenzhou.com/posts/Go/go_flag/
❹ 可以用go語言成功執行shutdown命令嗎怎麼做
import(
"bytes"
"fmt"
"os/exec"
)
funcexec_shell()(string,error){
//函數返回一個*Cmd,用於使用給出的參數執行name指定的程序
cmd:=exec.Command("shutdown","-h","now")
//讀取io.Writer類型的cmd.Stdout,再通過bytes.Buffer(緩沖byte類型的緩沖器)將byte類型轉化為string類型(out.String():這是bytes類型提供的介面)
varoutbytes.Buffer
cmd.Stdout=&out
//Run執行c包含的命令,並阻塞直到完成。這里stdout被取出,cmd.Wait()無法正確獲取stdin,stdout,stderr,則阻塞在那了
err:=cmd.Run()
returnout.String(),err
}
funcmain(){
ifresult,err:=exec_shell();err!=nil{
fmt.Println("error:",err)
}else{
fmt.Println("execsucc",result)
}
}