go語言執(zhí)行系統(tǒng)命令 go語言 運(yùn)行

go語言命令行打印清除

命令如下:

萊山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)

直接在終端中輸入gohelp即可顯示所有的go命令以及相應(yīng)命令功能簡(jiǎn)介,主要有下面這些:

build:編譯包和依賴;clean:移除對(duì)象文件;doc:顯示包或者符號(hào)的文檔;env:打印go的環(huán)境信息;bug:啟動(dòng)錯(cuò)誤報(bào)告;fix:運(yùn)行g(shù)otoolfix;fmt:運(yùn)行g(shù)ofmt進(jìn)行格式化;generate:從processingsource生成go文件

get:下載并安裝包和依賴;install:編譯并安裝包和依賴;list:列出包;run:編譯并運(yùn)行g(shù)o程序;test:運(yùn)行測(cè)試;tool:運(yùn)行g(shù)o提供的工具;version:顯示go的版本;vet:運(yùn)行g(shù)otoolvet;命令的使用方式為:gocommand[args],除此之外,可以使用gohelp;來顯示指定命令的更多幫助信息。;在運(yùn)行g(shù)ohelp時(shí),不僅僅打印了這些命令的基本信息,還給出了一些概念的幫助信息:;c:Go和c的相互調(diào)用;buildmode:構(gòu)建模式的描述;filetype:文件類型;gopath:GOPATH環(huán)境變量

environment:環(huán)境變量;importpath:導(dǎo)入路徑語法;packages:包列表的描述;testflag:測(cè)試符號(hào)描述;testfunc:測(cè)試函數(shù)描述等。

可以用go語言成功執(zhí)行shutdown命令嗎?怎么做

import?(

"bytes"

"fmt"

"os/exec"

)

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

//函數(shù)返回一個(gè)*Cmd,用于使用給出的參數(shù)執(zhí)行name指定的程序

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

//讀取io.Writer類型的cmd.Stdout,再通過bytes.Buffer(緩沖byte類型的緩沖器)將byte類型轉(zhuǎn)化為string類型(out.String():這是bytes類型提供的接口)

var?out?bytes.Buffer

cmd.Stdout?=?out

//Run執(zhí)行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)

}

}

一學(xué)就會(huì),手把手教你用Go語言調(diào)用智能合約

智能合約調(diào)用是實(shí)現(xiàn)一個(gè) DApp 的關(guān)鍵,一個(gè)完整的 DApp 包括前端、后端、智能合約及區(qū)塊 鏈系統(tǒng),智能合約的調(diào)用是連接區(qū)塊鏈與前后端的關(guān)鍵。

我們先來了解一下智能合約調(diào)用的基礎(chǔ)原理。智能合約運(yùn)行在以太坊節(jié)點(diǎn)的 EVM 中。因此要 想調(diào)用合約必須要訪問某個(gè)節(jié)點(diǎn)。

以后端程序?yàn)槔?,后端服?wù)若想連接節(jié)點(diǎn)有兩種可能,一種是雙 方在同一主機(jī),此時(shí)后端連接節(jié)點(diǎn)可以采用 本地 IPC(Inter-Process Communication,進(jìn) 程間通信)機(jī)制,也可以采用 RPC(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)機(jī)制;另 一種情況是雙方不在同一臺(tái)主機(jī),此時(shí)只能采用 RPC 機(jī)制進(jìn)行通信。

提到 RPC, 讀者應(yīng)該對(duì) Geth 啟動(dòng)參數(shù)有點(diǎn)印象,Geth 啟動(dòng)時(shí)可以選擇開啟 RPC 服務(wù),對(duì)應(yīng)的 默認(rèn)服務(wù)端口是 8545。。

接著,我們來了解一下智能合約運(yùn)行的過程。

智能合約的運(yùn)行過程是后端服務(wù)連接某節(jié)點(diǎn),將 智能合約的調(diào)用(交易)發(fā)送給節(jié)點(diǎn),節(jié)點(diǎn)在驗(yàn)證了交易的合法性后進(jìn)行全網(wǎng)廣播,被礦工打包到 區(qū)塊中代表此交易得到確認(rèn),至此交易才算完成。

就像數(shù)據(jù)庫(kù)一樣,每個(gè)區(qū)塊鏈平臺(tái)都會(huì)提供主流 開發(fā)語言的 SDK(Software Development Kit,軟件開發(fā)工具包),由于 Geth 本身就是用 Go 語言 編寫的,因此若想使用 Go 語言連接節(jié)點(diǎn)、發(fā)交易,直接在工程內(nèi)導(dǎo)入 go-ethereum(Geth 源碼) 包就可以了,剩下的問題就是流程和 API 的事情了。

總結(jié)一下,智能合約被調(diào)用的兩個(gè)關(guān)鍵點(diǎn)是節(jié)點(diǎn)和 SDK。

由于 IPC 要求后端與節(jié)點(diǎn)必須在同一主機(jī),所以很多時(shí)候開發(fā)者都會(huì)采用 RPC 模式。除了 RPC,以太坊也為開發(fā)者提供了 json- rpc 接口,本文就不展開討論了。

接下來介紹如何使用 Go 語言,借助 go-ethereum 源碼庫(kù)來實(shí)現(xiàn)智能合約的調(diào)用。這是有固定 步驟的,我們先來說一下總體步驟,以下面的合約為例。

步驟 01:編譯合約,獲取合約 ABI(Application Binary Interface,應(yīng)用二進(jìn)制接口)。 單擊【ABI】按鈕拷貝合約 ABI 信息,將其粘貼到文件 calldemo.abi 中(可使用 Go 語言IDE 創(chuàng)建該文件,文件名可自定義,后綴最好使用 abi)。

最好能將 calldemo.abi 單獨(dú)保存在一個(gè)目錄下,輸入“l(fā)s”命令只能看到 calldemo.abi 文件,參 考效果如下:

步驟 02:獲得合約地址。注意要將合約部署到 Geth 節(jié)點(diǎn)。因此 Environment 選擇為 Web3 Provider。

在【Environment】選項(xiàng)框中選擇“Web3 Provider”,然后單擊【Deploy】按鈕。

部署后,獲得合約地址為:0xa09209c28AEf59a4653b905792a9a910E78E7407。

步驟 03:利用 abigen 工具(Geth 工具包內(nèi)的可執(zhí)行程序)編譯智能合約為 Go 代碼。abigen 工具的作用是將 abi 文件轉(zhuǎn)換為 Go 代碼,命令如下:

其中各參數(shù)的含義如下。 (1)abi:是指定傳入的 abi 文件。 (2)type:是指定輸出文件中的基本結(jié)構(gòu)類型。 (3)pkg:指定輸出文件 package 名稱。 (4)out:指定輸出文件名。 執(zhí)行后,將在代碼目錄下看到 funcdemo.go 文件,讀者可以打開該文件欣賞一下,注意不要修改它。

步驟 04:創(chuàng)建 main.go,填入如下代碼。 注意代碼中 HexToAddress 函數(shù)內(nèi)要傳入該合約部署后的地址,此地址在步驟 01 中獲得。

步驟 04:設(shè)置 go mod,以便工程自動(dòng)識(shí)別。

前面有所提及,若要使用 Go 語言調(diào)用智能合約,需要下載 go-ethereum 工程,可以使用下面 的指令:

該指令會(huì)自動(dòng)將 go-ethereum 下載到“$GOPATH/src/github.com/ethereum/go-ethereum”,這樣還算 不錯(cuò)。不過,Go 語言自 1.11 版本后,增加了 module 管理工程的模式。只要設(shè)置好了 go mod,下載 依賴工程的事情就不必關(guān)心了。

接下來設(shè)置 module 生效和 GOPROXY,命令如下:

在項(xiàng)目工程內(nèi),執(zhí)行初始化,calldemo 可以自定義名稱。

步驟 05:運(yùn)行代碼。執(zhí)行代碼,將看到下面的效果,以及最終輸出的 2020。

上述輸出信息中,可以看到 Go 語言會(huì)自動(dòng)下載依賴文件,這就是 go mod 的神奇之處??吹?2020,相信讀者也知道運(yùn)行結(jié)果是正確的了。

GO語言運(yùn)行32位

第一種

1.使用go env命令,查看系統(tǒng)的配置環(huán)境,可以看到GOARCH(當(dāng)前系統(tǒng))是amd64

2.執(zhí)行 set GOARCH=386 配置go輸出系統(tǒng)平臺(tái)為32位,此時(shí)再用go env命令查看系統(tǒng)的配置環(huán)境,如圖:

第二種

打開Run Edit Configurations Configuration標(biāo)簽

為Environment添加兩個(gè)設(shè)置項(xiàng)

參考

如何使用Go語言實(shí)現(xiàn)遠(yuǎn)程執(zhí)行命令

一般命令

所謂一般命令,就是在一定時(shí)間內(nèi)會(huì)執(zhí)行完的命令。比如 grep, cat 等等。 執(zhí)行命令的步驟是:連接,執(zhí)行,獲取結(jié)果

連接

連接包含了認(rèn)證,可以使用 password 或者 sshkey 2種方式來認(rèn)證。下面的示例為了簡(jiǎn)單,使用了密碼認(rèn)證的方式來完成連接。

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

}

連接的方法很簡(jiǎn)單,只要提供登錄主機(jī)的 用戶*, *密碼*, *主機(jī)名或者IP*, *SSH端口

執(zhí)行,命令獲取結(jié)果

連接成功后,執(zhí)行命令很簡(jiǎn)單

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")

}

上面代碼運(yùn)行之后,雖然命令正常執(zhí)行了,但是沒有正常輸出的結(jié)果,也沒有異常輸出的結(jié)果。 要想顯示結(jié)果,需要將 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")

}

這樣就能在屏幕上顯示正常,異常的信息了。

交互式命令

上面的方式無法遠(yuǎn)程執(zhí)行交互式命令,比如 top , 遠(yuǎn)程編輯一個(gè)文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要當(dāng)前的terminal來接管遠(yuǎn)程的 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語言命令行利器cobra使用教程

cobra是一個(gè)提供簡(jiǎn)單接口來創(chuàng)建強(qiáng)大的現(xiàn)代CLI界面的庫(kù)類似git git tools,cobra也是一個(gè)應(yīng)用程序,它會(huì)生成你的應(yīng)用程序的腳手架來快速開發(fā)基于cobra的應(yīng)用程序

cobra提供:

cobra建立在命令、參數(shù)、標(biāo)志的結(jié)構(gòu)之上

commands代表動(dòng)作,args是事物,flags是動(dòng)作的修飾符

最好的應(yīng)用程序在使用時(shí)讀起來就像句子,因此,用戶直觀地知道如何與它們交互

模式如下:APPNAME VERB NOUN --ADJECTIVE. or APPNAME COMMAND ARG --FLAG(APPNAME 動(dòng)詞 名詞 形容詞 或者 APPNAME 命令 參數(shù) 標(biāo)志)

一些真實(shí)世界的好例子可以更好地說明這一點(diǎn)

kubectl 命令更能體現(xiàn)APPNAME 動(dòng)詞 名詞 形容詞

如下的例子,server 是command,port是flag

這個(gè)命令中,我們告訴git 克隆url

命令是應(yīng)用程序的中心點(diǎn),應(yīng)用程序支持的每一個(gè)交互都包含在一個(gè)命令中,命令可以有子命令,也可以運(yùn)行操作

在上面的例子中,server是命令

更多關(guān)于cobra.Command

flag是一種修改命令行為的方式,cobra支持完全兼容POSIX標(biāo)志,也支持go flag package,cobra可以定義到子命令上的標(biāo)志,也可以僅對(duì)該命令可用的標(biāo)志

在上面的命令中,port是標(biāo)志

標(biāo)志的功能由 pflag library 提供,pflag library是flag標(biāo)準(zhǔn)庫(kù)的一個(gè)分支,在添加POSIX兼容性的同時(shí)維護(hù)相同的接口。

使用cobra很簡(jiǎn)單,首先,使用go get按照最新版本的庫(kù),這個(gè)命令會(huì)安裝cobra可執(zhí)行程序以及庫(kù)和依賴項(xiàng)

下一步,引入cobra到應(yīng)用程序中

雖然歡迎您提供自己的組織,但通?;贑obra的應(yīng)用程序?qū)⒆裱韵陆M織結(jié)構(gòu):

在Cobra應(yīng)用程序中,main.go文件通常非常簡(jiǎn)單。它有一個(gè)目的:初始化Cobra。

使用cobra生成器

cobra提供了程序用來創(chuàng)建你的應(yīng)用程序然后添加你想添加的命令,這是將cobra引入應(yīng)用程序最簡(jiǎn)單的方式

這兒 你可以發(fā)現(xiàn)關(guān)于cobra的更多信息

要手動(dòng)實(shí)現(xiàn)cobra,需要?jiǎng)?chuàng)建一個(gè)main.go 和rootCmd文件,可以根據(jù)需要提供其他命令

Cobra不需要任何特殊的構(gòu)造器。只需創(chuàng)建命令。

理想情況下,您可以將其放在app/cmd/root.go中:

在init()函數(shù)中定義標(biāo)志和處理配置

例子如下,cmd/root.go:

創(chuàng)建main.go

使用root命令,您需要讓主函數(shù)執(zhí)行它。為清楚起見,Execute應(yīng)該在根目錄下運(yùn)行,盡管它可以在任何命令上調(diào)用。

在Cobra應(yīng)用程序中,main.go文件通常非常簡(jiǎn)單。它有一個(gè)目的:初始化Cobra。

可以定義其他命令,通常每個(gè)命令在cmd/目錄中都有自己的文件。

如果要?jiǎng)?chuàng)建版本命令,可以創(chuàng)建cmd/version.go并用以下內(nèi)容填充它:

如果希望將錯(cuò)誤返回給命令的調(diào)用者,可以使用RunE。

然后可以在execute函數(shù)調(diào)用中捕獲錯(cuò)誤。

標(biāo)志提供修飾符來控制操作命令的操作方式。

由于標(biāo)志是在不同的位置定義和使用的,因此我們需要在外部定義一個(gè)具有正確作用域的變量來分配要使用的標(biāo)志。

有兩種不同的方法來分配標(biāo)志。

標(biāo)志可以是“持久”的,這意味著該標(biāo)志將可用于分配給它的命令以及該命令下的每個(gè)命令。對(duì)于全局標(biāo)志,在根上指定一個(gè)標(biāo)志作為持久標(biāo)志。

也可以在本地分配一個(gè)標(biāo)志,該標(biāo)志只應(yīng)用于該特定命令。

默認(rèn)情況下,Cobra只解析目標(biāo)命令上的本地標(biāo)志,而忽略父命令上的任何本地標(biāo)志。通過啟用Command.TraverseChildren,Cobra將在執(zhí)行目標(biāo)命令之前解析每個(gè)命令上的本地標(biāo)志。

使用viper綁定標(biāo)志

在本例中,持久標(biāo)志author與viper綁定。注意:當(dāng)用戶未提供--author標(biāo)志時(shí),變量author將不會(huì)設(shè)置為config中的值。

更多關(guān)于 viper的文檔

Flags默認(rèn)是可選的,如果希望命令在未設(shè)置標(biāo)志時(shí)報(bào)告錯(cuò)誤,請(qǐng)根據(jù)需要進(jìn)行標(biāo)記:

持久性Flags

可以使用命令的Args字段指定位置參數(shù)的驗(yàn)證。

內(nèi)置了以下驗(yàn)證器:

在下面的示例中,我們定義了三個(gè)命令。兩個(gè)是頂級(jí)命令,一個(gè)(cmdTimes)是頂級(jí)命令之一的子命令。在這種情況下,根是不可執(zhí)行的,這意味著需要一個(gè)子命令。這是通過不為“rootCmd”提供“Run”來實(shí)現(xiàn)的。

我們只為一個(gè)命令定義了一個(gè)標(biāo)志。

有關(guān)標(biāo)志的更多文檔,請(qǐng)?jiān)L問

對(duì)于一個(gè)更完整的例子更大的應(yīng)用程序,請(qǐng)檢查 Hugo 。

當(dāng)您有子命令時(shí),Cobra會(huì)自動(dòng)將help命令添加到應(yīng)用程序中。當(dāng)用戶運(yùn)行“應(yīng)用程序幫助”時(shí),將調(diào)用此函數(shù)。此外,help還支持所有其他命令作為輸入。例如,您有一個(gè)名為“create”的命令,沒有任何附加配置;調(diào)用“app help create”時(shí),Cobra將起作用。每個(gè)命令都會(huì)自動(dòng)添加“-help”標(biāo)志。

以下輸出由Cobra自動(dòng)生成。除了命令和標(biāo)志定義之外,不需要任何東西。

幫助就像其他命令一樣。它周圍沒有特殊的邏輯或行為。事實(shí)上,你可以提供你想提供的。

您可以為默認(rèn)命令提供自己的幫助命令或模板,以用于以下功能:

當(dāng)用戶提供無效的標(biāo)志或無效的命令時(shí),Cobra通過向用戶顯示“用法”來響應(yīng)。

你可以從上面的幫助中認(rèn)識(shí)到這一點(diǎn)。這是因?yàn)槟J(rèn)幫助將用法作為其輸出的一部分嵌入。

您可以提供自己的使用函數(shù)或模板供Cobra使用。與幫助一樣,函數(shù)和模板也可以通過公共方法重寫:

如果在root命令上設(shè)置了version字段,Cobra會(huì)添加一個(gè)頂級(jí)的'--version'標(biāo)志。運(yùn)行帶有“-version”標(biāo)志的應(yīng)用程序?qū)⑹褂冒姹灸0鍖姹敬蛴〉綐?biāo)準(zhǔn)輸出??梢允褂胏md.SetVersionTemplate(s string)函數(shù)自定義模板。

可以在命令的主運(yùn)行函數(shù)之前或之后運(yùn)行函數(shù)。PersistentPreRun和PreRun函數(shù)將在運(yùn)行之前執(zhí)行。PersistentPostRun和PostRun將在運(yùn)行后執(zhí)行。如果子函數(shù)不聲明自己的函數(shù),則它們將繼承Persistent*Run函數(shù)。這些函數(shù)按以下順序運(yùn)行:

輸出:

當(dāng)發(fā)生“未知命令”錯(cuò)誤時(shí),Cobra將打印自動(dòng)建議。這使得Cobra在發(fā)生拼寫錯(cuò)誤時(shí)的行為類似于git命令。例如:

基于注冊(cè)的每個(gè)子命令和Levenshtein距離的實(shí)現(xiàn),建議是自動(dòng)的。匹配最小距離2(忽略大小寫)的每個(gè)已注冊(cè)命令都將顯示為建議。

如果需要在命令中禁用建議或調(diào)整字符串距離,請(qǐng)使用:

or

您還可以使用SuggestFor屬性顯式設(shè)置將為其建議給定命令的名稱。這允許對(duì)在字符串距離方面不接近的字符串提供建議,但在您的一組命令中是有意義的,并且對(duì)于某些您不需要?jiǎng)e名的字符串。例子:

Cobra可以基于子命令、標(biāo)志等生成文檔。請(qǐng)?jiān)?docs generation文檔 中閱讀更多關(guān)于它的信息。

Cobra可以為以下shell生成shell完成文件:bash、zsh、fish、PowerShell。如果您在命令中添加更多信息,這些補(bǔ)全功能將非常強(qiáng)大和靈活。在 Shell Completions 中閱讀更多關(guān)于它的信息。

Cobra is released under the Apache 2.0 license. See LICENSE.txt

本文題目:go語言執(zhí)行系統(tǒng)命令 go語言 運(yùn)行
文章URL:http://muchs.cn/article24/hgseje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、營(yíng)銷型網(wǎng)站建設(shè)外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、品牌網(wǎng)站制作關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)