我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《在golang程序中运行交互式shell脚本》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我想在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)
    }
}


解决方案


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

为此,您需要低级 syscall.Exec 函数。通常您不应期望它会返回。请注意,您需要提供许多详细信息,例如要运行的实际二进制文件以及更高级别包装器不需要的环境。 (google 快速搜索即可找到 this detailed writeup。)

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.startprocessexec.cmd 等更高级别的接口都在 execvefork(2) 子进程。 >(2) 在那个孩子身上。当您的 go 进程退出时,该子进程将成为孤立,并且系统 init 进程将成为其新的父进程。 shell 只是看到 go 进程已经退出,并会产生一个新的 shell 提示符。

将 command 的 stdin、stdout 和 stderr 连接到父进程的 stdin、stdout 和 stderr。另外,在 exec.command 中将 -c 提供给 bash,否则 bash 将尝试运行您的程序,就好像它是 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")
}

到这里,我们也就讲完了《在golang程序中运行交互式shell脚本》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注编程网公众号,带你了解更多关于的知识点!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《在golang程序中运行交互式shell脚本》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!问题内
在golang程序中运行交互式shell脚本
2024-04-05

Linux Shell交互式自动化运维程序

Expect是Linux操作系统下的一个用来处理交互操作,系统默认是没有安装expect库,所以执行expect会提示找不到命令,需要手动安装,其它安装也比较简单,可以通过二进制源码包编译配置进行安装,也可以通过网络借助yum源来安装,yu
2023-06-05

怎么在Shell脚本中实现Expect免交互

本篇文章给大家分享的是有关怎么在Shell脚本中实现Expect免交互,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Expext概述Expect是建立在tcl基础上的一个工具,
2023-06-09

如何实现Shell脚本中非交互式修改密码

本篇内容介绍了“如何实现Shell脚本中非交互式修改密码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1:使用chpasswdchpassw
2023-06-09

如何在 Linux 中运行一个 Shell 脚本

本篇内容介绍了“如何在 Linux 中运行一个 Shell 脚本”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在 Linux 中有两种运行
2023-06-15

Shell脚本中非交互式修改密码的两种方法

今天在写一个shell脚本的时候发现需要设置用户的密码,而设置密码是交互式的,这样在脚本中显然是不太好的,因此上网查找资料,发现了以下两种常见的非交互式设置密码的方式: 1:使用chpasswd chpasswd其实是通过用户输入'用户名:
2022-06-04

在 github actions 中运行 golang 的 pre-commit.com 脚本

欢迎各位小伙伴来到编程网,相聚于此都是缘哈哈哈!今天我给大家带来《在 github actions 中运行 golang 的 pre-commit.com 脚本》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自
在 github actions 中运行 golang 的 pre-commit.com 脚本
2024-04-04

java程序的jar包怎么利用shell脚本运行

这篇文章将为大家详细讲解有关java程序的jar包怎么利用shell脚本运行,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在UBuntu上部署项目的时候,我们往往通过一段shell来启动程序
2023-05-31

Shell脚本实现检测进程是否正在运行

这里简单介绍一个自己写的检测某个进程是否存在的bash小脚本。直接上代码。#!/bin/bashps_out=`ps -ef | grep $1 | grep -v 'grep' | grep -v $0`result=$(echo $ps
2022-06-04

centOS6中使用crontab定时运行执行jar程序的脚本

1、编写一个简单的java程序public class testshell {public static void main(String[] args) {int count = 0;for (String arg : args) {Sy
2022-06-04

怎么在Shell脚本中执行语法检查调试模式

这篇文章将为大家详细讲解有关怎么在Shell脚本中执行语法检查调试模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。启用 verbose 调试模式在进入本指导的重点之前,让我们简要地探索下 verbose
2023-06-16

如何在Shell中实现“多线程”执行脚本文件

本篇内容介绍了“如何在Shell中实现“多线程”执行脚本文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!即比如我有100个可执行文件,互相
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录