如何在golang中执行交互式CLI命令?

时间:2019-01-29 10:14:06

标签: go command-line-interface

我正在尝试执行一个命令,要求输入多个信息,例如,如果您尝试将文件从本地设备复制到我们使用的scp test.txt user@domain:~/远程设备,然后它要求我们提供密码。我想要的是编写一个go代码,其中我在代码本身中提供了密码,例如pass:='Secret Password'。同样,我有CLI命令,该命令在其中询问我们诸如IP,名称等几项内容,因此我需要编写代码,在该代码中我声明代码本身中的所有值,而在运行代码时它什么也没问只需从代码中获取所有输入并运行CLI命令,以防将文件复制到远程,当我运行go二进制文件时,不应该要求我输入密码,它应该将文件直接复制到远程决定。

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

如果我使用此代码,它将粘贴在user @ domain的密码上:

没有文件复制到远程设备。

3 个答案:

答案 0 :(得分:0)

  

https://github.com/manifoldco/promptui

这是满足您要求的足够好的选择。我认为重新发明轮子不是一个好主意。

答案 1 :(得分:0)

一种解决方法是使用命令行标志:

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

现在,您可以使用nameip标志来运行程序:

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

这个channel是很好的资源,他曾经在Go团队工作过,并用该语言制作了许多命令行程序来制作大量视频。祝你好运!

答案 2 :(得分:0)

我在尝试通过 golang os/exec 运行 linux cmd.Stdin 时遇到了这个问题。

要实现您想要实现的目标,请尝试将 os.Stdin 设置为 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() } 。这是一个工作示例:

integer