如何在bash脚本中解析自定义CLI命令的终端回显字符串
捕获CLI命令全部终端输出的解决方案
核心原因
你无法捕获到全部回显内容,是因为大多数交互式CLI的提示语、运行状态、错误信息默认输出到标准错误流(stderr),而非你常规捕获的标准输出(stdout)。部分认证类命令出于安全考虑甚至会直接写入终端设备/dev/tty,完全不走标准IO流,因此常规的输出捕获逻辑会遗漏内容。
方案1:合并标准流捕获(适配90%以上场景)
绝大多数场景下,你只需要将stderr重定向合并到stdout,就能拿到全部输出内容,该方案不依赖命令退出码,哪怕命令优雅失败返回0也可正常识别:
- 基础捕获写法:
# 2>&1 表示将标准错误流重定向到标准输出流 auth_output=$(custauth 2>&1)
- 搭配自动输入密码+失败校验的完整示例:
# 自动输入密码并合并捕获所有标准流输出 auth_output=$(echo "你的密码明文" | custauth 2>&1) # 不区分大小写检查输出中是否包含失败关键词 if grep -qi "fail" <<< "$auth_output"; then echo "认证失败,执行后续失败逻辑" exit 1 fi
方案2:伪终端捕获(适配命令直接写终端的特殊场景)
如果命令直接写入/dev/tty不走标准流,你需要用伪终端(PTY)模拟真实终端运行命令,用系统自带的script工具即可实现全回显捕获:
- Linux 环境写法:
# -q 开启静默模式不输出script自身日志,-c 指定运行的命令,/dev/null 不生成本地日志文件 auth_output=$(echo "你的密码明文" | script -q -c "custauth" /dev/null)
- macOS 环境写法:
auth_output=$(echo "你的密码明文" | script -q /dev/null custauth)
捕获完成后即可正常检查输出内容中的任意关键词,不会遗漏任何终端回显的文本。
内容的提问来源于stack exchange,提问作者btrballin
相关产品推荐
相关产品推荐

