我正在构建一个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;
}
答案 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 answer和this 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)