如何检测Shell脚本是否以空格前缀的隐秘方式启动?
检测脚本是否以空格前缀隐秘启动的可靠方案
之前的方案因为依赖历史记录,要么受HISTCONTROL=ignoreboth配置影响读不到空格前缀的命令,要么连续启动时历史还没写入导致失效。这里给个绕过历史记录的方法,直接从进程信息入手:
实现代码
把这段代码加到你的脚本里:
# 获取启动脚本的父Shell进程命令行 parent_shell_cmd=$(ps -o cmd= -p "$PPID") # 提取包含当前脚本的启动片段 current_script=$(basename "$0") launch_line=$(echo "$parent_shell_cmd" | grep -o "\s*$current_script\b" || true) # 判断是否有前导空格 if [[ "$launch_line" =~ ^\s+ ]]; then echo "警告:脚本以隐秘方式启动(命令前缀含空格)" else echo "脚本以常规方式启动" fi
为什么这个方法靠谱?
- 不碰历史记录:直接读取父Shell进程的实时命令行,完全不受
HISTCONTROL配置影响,也不会因为连续启动时历史未写入而失效。 - 精准匹配:通过脚本文件名定位启动命令的关键部分,判断是否存在前导空格。
适配绝对路径启动的情况
如果你的脚本是用绝对路径启动的(比如 /home/you/scripts/my_script.sh),把代码里的current_script=$(basename "$0")改成current_script="$0"就行,这样能匹配完整路径的启动命令。
注意事项
这个方案基于bash环境,要是用zsh等其他Shell,可能需要微调ps的参数,但核心逻辑——读取父进程命令行来判断——是通用的。
内容的提问来源于stack exchange,提问作者gregoiregentil
相关产品推荐
相关产品推荐

