第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在 golang 中執(zhí)行交互式 CLI 命令?

如何在 golang 中執(zhí)行交互式 CLI 命令?

Go
幕布斯7119047 2023-06-05 09:17:59
我正在嘗試執(zhí)行一個(gè)要求多個(gè)輸入的命令,例如,如果您嘗試將文件從本地設(shè)備復(fù)制到我們使用的遠(yuǎn)程設(shè)備,那么它會(huì)scp test.txt user@domain:~/要求我們輸入密碼。我想要的是我想編寫(xiě)一個(gè) go 代碼,例如,我在代碼本身中提供密碼pass:='Secret Password'。同樣,我有 CLI 命令,它要求我們提供 IP、名稱等幾項(xiàng)內(nèi)容,因此我需要編寫(xiě)一段代碼,我只在代碼本身中聲明所有值,當(dāng)我運(yùn)行代碼時(shí)它不會(huì)詢問(wèn)任何內(nèi)容只需從代碼中獲取所有輸入并運(yùn)行 CLI 命令,以防將文件復(fù)制到遠(yuǎn)程它不應(yīng)該在我運(yùn)行我的 go 二進(jìn)制文件時(shí)詢問(wèn)我密碼它應(yīng)該直接將我的文件復(fù)制到遠(yuǎn)程決定。func main() {    cmd := exec.Command("scp", "text.txt", "user@domain:~/")            stdin, err := cmd.StdinPipe()    if err = cmd.Start(); err != nil {        log.Fatalf("failed to start command: %s", err)    }    io.WriteString(stdin, "password\n")    if err = cmd.Wait(); err != nil {    log.Fatalf("command failed: %s", err)    }}如果我使用此代碼,它會(huì)卡在 user@domain 的密碼上:并且沒(méi)有文件被復(fù)制到遠(yuǎn)程設(shè)備。
查看完整描述

3 回答

?
精慕HU

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊

make menuconfig我在嘗試通過(guò) golang運(yùn)行 linux 時(shí)遇到了這個(gè)問(wèn)題os/exec。


要完成您想要實(shí)現(xiàn)的目標(biāo),請(qǐng)嘗試將其設(shè)置cmd.Stdin為os.Stdin. 這是一個(gè)工作示例:


package main


import (

    "fmt"

    "os"

    "os/exec"

)


type cmdWithEnv struct {

    pwd     string

    command string

    cmdArgs []string

    envs    []string

}


func runCommand(s cmdWithEnv) error {

    cmd := exec.Command(s.command, s.cmdArgs...)

    if len(s.pwd) != 0 {

        cmd.Dir = s.pwd

    }


    env := os.Environ()

    env = append(env, s.envs...)

    cmd.Env = env


    fmt.Printf("%v\n", cmd)

    cmd.Stdout = os.Stdout

    cmd.Stderr = os.Stderr

    cmd.Stdin = os.Stdin // setting this allowed me to interact with ncurses interface from `make menuconfig`


    err := cmd.Start()

    if err != nil {

        return err

    }


    if err := cmd.Wait(); err != nil {

        return err

    }

    return nil

}


func buildPackage() {

    makeKernelConfig := cmdWithEnv{

        pwd:     "linux",

        command: "make",

        cmdArgs: []string{"-j12", "menuconfig"},

        envs:    []string{"CROSS_COMPILE=ccache arm-linux-gnueabihf-", "ARCH=arm"},

    }


    runCommand(makeKernelConfig)

}


func main() {

    buildPackage()

}


查看完整回答
反對(duì) 回復(fù) 2023-06-05
?
達(dá)令說(shuō)

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊

解決此問(wèn)題的一種方法是使用命令行標(biāo)志:


package main


import (

? ? "flag"

? ? "fmt"

? ? "math"

)


func main() {

? ? var (

? ? ? ? name = flag.String("name", "John", "Enter your name.")

? ? ? ? ip? ?= flag.Int("ip", 12345, "What is your ip?")

? ? )

? ? flag.Parse()

? ? fmt.Println("name:", *name)

? ? fmt.Println("ip:", *ip)

}

name現(xiàn)在您可以使用和標(biāo)志運(yùn)行程序ip:


go run main.go -name="some random name" -ip=12345678910`

some random name

ip: 12345678910


查看完整回答
反對(duì) 回復(fù) 2023-06-05
?
有只小跳蛙

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊

解決方案 1


您可以使用printf命令繞過(guò)它


cmd := "printf 'John Doe\nNew York\n35' | myInteractiveCmd"

out, err := exec.Command("bash", "-c", cmd).Output()

方案二


你可以使用io.Pipe()。Pipe creates a synchronous in-memory pipe您可以將答案寫(xiě)入io.Writer,您的 cmd 將從io.Reader.


r, w := io.Pipe()

cmd := exec.Command("myInteractiveCmd")

cmd.Stdin = r

go func() {

    fmt.Fprintf(w, "John Doe\n")

    fmt.Fprintf(w, "New York\n")

    fmt.Fprintf(w, "35\n")

    w.Close()

}()

cmd.Start()

cmd.Wait()

測(cè)試信息 為了對(duì)此進(jìn)行測(cè)試,我編寫(xiě)了 cmd,它詢問(wèn)姓名、城市、年齡并將結(jié)果寫(xiě)入文件。


reader := bufio.NewReader(os.Stdin)


fmt.Print("Name: ")

name, _ := reader.ReadString('\n')

name = strings.Trim(name, "\n")

...


查看完整回答
反對(duì) 回復(fù) 2023-06-05
  • 3 回答
  • 0 關(guān)注
  • 361 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)