如何包装交互式命令

时间:2016-09-27 22:15:12

标签: go

我正在构建一个ftp包装器,在我生成之前会执行一些操作,我可以轻松地在shell脚本中执行它但是想知道如何在go中执行它

虽然exec.Command适用于简单的命令。

out, err := exec.Command("ls").Output() // Works

如何包装交互式命令,例如ftp

out, err := exec.Command("ftp").Output()

它刚刚退出。我该如何处理stdin?

例如,bash等价物:

> ./t.sh 
Welcome to myftp 

ftp> open blahblah.com

> cat t.sh 
#!/bin/bash
echo "Welcome to myftp "
#extra commands such as auth/authoriz.. etc.,
shift
echo "$@"
ftp

c ++等价物:

int main() {
    system("ftp");
    return 0;
}

4 个答案:

答案 0 :(得分:3)

我可能会做这样的事情,这更像是原生的,不涉及外部包

package main
import (
    "os"
    "os/exec"
)

func main() {

    cmd := exec.Command("ls")
    // redirect the output to terminal
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    cmd.Run()

}

答案 1 :(得分:1)

传统上,这些类型的交互式脚本练习最好用期望来完成。我可以建议您查看pure Go equivalent吗?

自述文件:

child, err := gexpect.Spawn("python")
if err != nil { panic(err) }
child.Expect(">>>")
child.SendLine("print 'Hello World'")
child.Interact()
child.Close()

答案 2 :(得分:0)

要运行将提示用户输入的任何命令:

cmd := exec.Command("cf", "login")
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin

cmd.Run()

答案 3 :(得分:0)

可以使用以下完整脚本“包装”命令,该脚本基于reticentroot's answerthis answer,有关获取exec命令返回代码(执行1.12 +):

# get_context_data method
context['form'] = self.get_form()
context['validation_form'] = self.get_form(self.validator_form_class)

# post method
validation_form = self.get_form(self.validator_form_class)