0

0

如何使用Golang编写基础的交互式Shell工具

P粉602998670

P粉602998670

发布时间:2026-02-19 15:26:31

|

436人浏览过

|

来源于php中文网

原创

应使用 golang.org/x/term.readpassword 读取密码以隐藏输入,避免明文显示;执行命令须绕过 shell、用 os/exec.command 显式传参防注入;交互输入推荐 github.com/chzyer/readline;ctrl+c 需用 os/signal 捕获并安全终止子进程。

如何使用golang编写基础的交互式shell工具

golang.org/x/term 读取密码或隐藏输入

默认的 fmt.Scanlnbufio.NewReader(os.Stdin).ReadString('\n') 会把密码明文打在终端上,这不行。得用 golang.org/x/term —— 它是 Go 官方维护的、跨平台的终端控制包,比自己调 syscall 稳定得多。

常见错误是直接 import syscall 或硬写 ANSI 转义序列,结果在 Windows 上崩,或在某些 IDE 内置终端里失效。

  • go get golang.org/x/term
  • 读密码:用 term.ReadPassword(int(os.Stdin.Fd())),它自动关回显、清缓存、处理 Ctrl+C
  • 注意:返回的是 []byte,记得用 string(pwd) 转成字符串;别漏掉 err 检查,比如用户按 Ctrl+D 会返回 io.EOF
  • Windows 下如果报 not a terminal,说明 stdin 被重定向了(比如管道或 IDE 运行),这时不能用 ReadPassword,得降级提示并用普通读取(但要明确告诉用户“密码将明文显示”)

os/exec 安全执行用户命令,避免 shell 注入

交互式 Shell 工具常需要运行用户输入的命令,比如 ls -l /tmp。直接拼接字符串再丢给 sh -c 是高危操作——rm -rf /; echo "done" 这种输入会直接执行两条命令。

正确做法是绕过 shell,用 os/exec.Command 显式拆解命令和参数:

立即学习go语言免费学习笔记(深入)”;

SUN2008 企业网站管理系统2.0 beta
SUN2008 企业网站管理系统2.0 beta

1、数据调用该功能使界面与程序分离实施变得更加容易,美工无需任何编程基础即可完成数据调用操作。2、交互设计该功能可以方便的为栏目提供个性化性息功能及交互功能,为产品栏目添加产品颜色尺寸等属性或简单的留言和订单功能无需另外开发模块。3、静态生成触发式静态生成。4、友好URL设置网页路径变得更加友好5、多语言设计1)UTF8国际编码; 2)理论上可以承担一个任意多语言的网站版本。6、缓存机制减轻服务器

下载
  • 不要:exec.Command("sh", "-c", userCmd)
  • 要:exec.Command("ls", "-l", "/tmp") —— 把用户输入按空格切分后,逐个传进参数列表(注意:简单空格分割不够健壮,真实场景建议用 shlex.Split 类逻辑,或限制只支持固定命令集)
  • 如果真要支持管道或重定向,别自己解析,改用 github.com/mitchellh/go-homedir + os/user 做路径展开,然后交由 shell 执行,但必须对输入做白名单校验(比如只允许 catgrephead 等几个命令)
  • cmd.Run() 会阻塞,适合简单命令;需要实时输出时用 cmd.StdoutPipe() + io.Copy,别用 cmd.Output() 吞大文件,容易 OOM

readline 库实现带历史和补全的输入行

fmt.Print + bufio 只能实现“输完回车才响应”,没法上下键翻历史、Tab 补全、Ctrl+A 跳行首——这不是 Shell,是填空题。

Go 生态里最轻量靠谱的是 github.com/chzyer/readline(虽已归档,但稳定、无依赖、文档清晰)。别用 promptuisurvey,它们面向表单,不是持续交互的 Shell。

  • 初始化:rl, _ := readline.New(readline.Config{Prompt: "> "}),记得 defer rl.Close()
  • 历史记录自动保存在内存,想持久化就加 HistoryFile: "/path/to/history",它会自动读写 JSON
  • 补全靠 rl.SetCompleter(),函数接收当前输入前缀,返回匹配项列表;注意别在补全函数里做耗时操作(如查网络),会卡住整个行编辑
  • Windows 下如果光标乱跳,确认没开 VS Code 的“integrated terminal”兼容模式,或换用 github.com/abiosoft/ishell(更重但 Win 支持更好)

信号处理:让 Ctrl+C 不直接 kill 进程

交互式工具里,用户按 Ctrl+C 通常想取消当前命令,而不是退出整个程序。默认行为是进程收到 SIGINT 后直接终止,没法拦截。

得用 os/signal 显式捕获,并区分场景处理:

  • 全局注册:signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM),但别在主 goroutine 里 阻塞,否则无法响应新命令
  • 推荐方式:每个命令执行前起一个 goroutine 监听 SIGINT,一旦收到,调用 cmd.Process.Kill() 终止子进程,然后继续主循环
  • 注意:cmd.Run() 是同步的,cmd.Start() + cmd.Wait() 才能配合信号中断;同时记得恢复终端状态(比如 readline 被中断后可能残留原始模式)
  • macOS/Linux 下 SIGINT 默认发给整个进程组,Windows 用 os.Interrupt 即可,不用 syscall
事情说清了就结束。真正的难点不在代码怎么写,而在于你得想清楚:这个 Shell 是给谁用?要不要支持脚本化?是否允许用户逃逸到系统 shell?每多一个“要”,底层就要多一层隔离和校验。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

238

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

212

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

403

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

344

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

197

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

970

2025.06.17

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.3万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号