如何判断yum是否从交互式会话调用?开发yum wrapper需求
判断Yum调用是否为交互式/关联TTY的可行方法
要区分Yum是从交互式会话调用还是非交互式(如Puppet触发),可以通过以下几种可靠的方式实现:
检查标准输入是否关联TTY
这是最直接的判断方式,交互式会话的标准输入(stdin)通常关联TTY设备,而非交互式调用(脚本、自动化工具触发)的stdin一般是管道或文件。在shell脚本包装器中,可用test -t 0判断:# 检查stdin是否为TTY if test -t 0; then # 交互式会话,执行变更控制流程 echo "执行交互式变更检查..." # 此处添加审批、日志等自定义逻辑 exec /usr/bin/yum "$@" else # 非交互式,直接转发请求给原生yum exec /usr/bin/yum "$@" fi注意:若用户手动将交互式Yum的输入重定向(如
yum install < package.list),该判断会误判为非交互式,适合绝大多数常规场景。检查进程的控制终端
通过ps命令查看当前进程的TTY字段,结果为?表示无控制终端(非交互式),反之则关联TTY。示例代码:CURRENT_TTY=$(ps -p $$ -o tty=) if [ "$CURRENT_TTY" != "?" ]; then # 存在控制终端,走交互式流程 # 变更控制逻辑... exec /usr/bin/yum "$@" else # 无控制终端,直接转发 exec /usr/bin/yum "$@" fi这种方式比检查stdin更准确,直接查看进程本身的控制终端,不受输入重定向影响。
辅助检查环境变量
交互式Shell通常会设置PS1(命令提示符)环境变量,非交互式Shell一般不会。可将其作为辅助判断条件,结合前两种方法提升准确性:if test -t 0 && [ -n "$PS1" ]; then # 双重验证为交互式 # 执行变更控制... exec /usr/bin/yum "$@" else exec /usr/bin/yum "$@" fi注意:部分脚本可能手动设置
PS1,单独用该判断不可靠,仅作补充。
实际使用时,推荐结合进程控制终端检查和stdin TTY检查,覆盖绝大多数场景,确保交互式与非交互式调用的区分准确,不影响自动化工具的正常执行。
内容的提问来源于stack exchange,提问作者GGSec
相关产品推荐
相关产品推荐

