为了账号安全,请及时绑定邮箱和手机立即绑定

在 golang 程序中运行交互式 shell 脚本

在 golang 程序中运行交互式 shell 脚本

Go
FFIVE 2022-05-18 15:55:25
我想在 golang 程序中运行一个交互式 shell 脚本,比如包装一个“ping 8.8.8.8”、“python”、“bc”、“mysql -H -P -u -p”。当 golang 程序完成调用交互式命令或 shell 并让生成的用户与用户交互时,应该退出。我已经尝试过“exec.Command(“python”).Run()”,但是 golang 程序刚刚完成,什么都没有给我留下。func (h ConnectHandler)ConnectMySQL()  {    logrus.Debug("ConnectMySQL, script:",common.CONF.FilePath.MySQLConnectScriptPath)    err :=exec.Command("bash",common.CONF.FilePath.MySQLConnectScriptPath).Run()    if err != nil{        logrus.Errorf("ConnectMySQL failed, exit 1,%s",err)        os.Exit(1)    }}
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

将命令的标准输入、标准输出和标准错误连接到父进程的标准输入。此外,提供-cto exec.Command, bashelsebash将尝试运行您的程序,就好像它是一个 shell 脚本一样。


例如启动交互式 Python 控制台:


func main() {

    fmt.Println("Before Python shell:")

    cmd := exec.Command("bash", "-c", "/usr/bin/python3")

    cmd.Stdin = os.Stdin

    cmd.Stdout = os.Stdout

    cmd.Stderr = os.Stderr

    _ = cmd.Run() // add error checking

    fmt.Println("After Python shell")

}


查看完整回答
反对 回复 2022-05-18
?
慕田峪9158850

TA贡献1794条经验 获得超8个赞

听起来您想用您尝试启动的命令替换当前进程。在你启动另一个命令之后,你的 Go 程序就消失了,调用者与启动的程序交互,就好像它是最初启动的东西一样。


为此,您需要低级syscall.Exec函数。您通常不应该期望它返回。请注意,您需要提供许多详细信息,例如要运行的实际二进制文件以及高级包装器不需要的环境。(一个非常快速的谷歌搜索找到了这个详细的文章。)


import "os"

import "syscall"

err := syscall.Exec("/bin/ls", []string{"ls", "-l", "/"}, os.Environ())

// We don't expect this to ever return; if it does something is really wrong

os.panic(err)

就底层的 Unix 系统调用而言,更高级别的接口os.StartProcess和exec.Cmdall fork (2) 首先是一个子进程,然后是该子进程中的execve (2)。当您的 Go 进程退出时,该子进程将变为孤立的,系统 init 进程将成为其新的父进程。shell 只是看到 Go 进程已经退出,并会产生一个新的 shell 提示符。


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 673 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号