Go 如何包装交互式命令

Go 如何包装交互式命令,go,Go,我正在构建一个ftp包装器,在我生成之前做一些事情,我可以在shell脚本中轻松地完成它,但不知道如何在go中完成它 而exec.Command适用于简单命令 out, err := exec.Command("ls").Output() // Works 如何包装交互式命令(例如ftp) out, err := exec.Command("ftp").Output() 它只是出口。我如何处理stdin e、 g.bash等效物: > ./t.sh Welcome to myftp

我正在构建一个ftp包装器,在我生成之前做一些事情,我可以在shell脚本中轻松地完成它,但不知道如何在go中完成它

而exec.Command适用于简单命令

out, err := exec.Command("ls").Output() // Works
如何包装交互式命令(例如ftp)

out, err := exec.Command("ftp").Output()
它只是出口。我如何处理stdin

e、 g.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
int main() {
    system("ftp");
    return 0;
}
c++等价物:

> ./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
int main() {
    system("ftp");
    return 0;
}

传统上,这些交互式脚本练习最好使用expect完成。我可以建议你退房吗

自述文件:

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

我可能会做这样的事情,更自然,不涉及外部包

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

}

要运行将提示用户输入的任何命令,请执行以下操作:

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

cmd.Run()
基于获取exec命令返回码(go 1.12+),可以使用以下完整脚本“包装”命令:

主程序包
进口(
“操作系统”
“os/exec”
)
变量(
bin=“py”
args=[]字符串{“-3.8”}
)
func main(){
cmd:=exec.Command(bin,append(args,os.args[1:]…)…)
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
cmd.Stdin=os.Stdin
如果错误:=cmd.Run();错误!=nil{
如果Exitror,ok:=错误。(*exec.exitror);ok{
os.Exit(exitror.ExitCode())
}
}
}

如何为
ftp
命令提供输入?非交互部分很简单,对吗?只要做:如果len(os.Args)>1{str=cmd+“”+strings.Join(os.Args[1:],“”)}或者{str=cmd}@Victor:除非您要使用shell再次连接命令参数,否则您不能在单个字符串中连接命令参数。你到底想用stdin做什么?您是在提供流,还是在尝试将其连接到ptty并模拟用户输入?准确地显示您正在尝试做什么,您已经尝试了什么,以及您预期会发生什么。@JimB我添加了shell脚本示例,如何在golang中执行它?我认为您必须使用其他命令。这并不是说你可以保持一个交互式的提示符运行,你发出一个命令,你从stdout读取它的输出,您可以在代码中执行任何必要的逻辑来准备下一个命令,然后运行它,并以语句列表或循环的形式继续此过程,直到您没有更多的命令可运行。值得一提的是,Gexpect具有内置的超时管理和ftp示例,特别是在我在redit上看到的,但是如果您替换ls用ftp它不会提示我,它只是死了。哦,我明白了。检查这个堆栈,这样您就可以设置stdin,它似乎适用于交互,但不适用于非交互,就像您编译它并传入一个参数,例如cmd:=exec.Command(“ftp--help”),它不会输出任何东西。有什么想法吗?@Victor看到这篇文章我想这会有帮助