Java通过ProcessBuilder调用Sophos检测Shell脚本输出不完整问题排查
问题原因分析
- Shell脚本的变量捕获逻辑导致多行输出丢失
你在脚本中用state=${1}bin/savdstatus 2>&1``把命令输出捕获到变量时,Shell默认会把换行符替换为空格,后续执行echo "Return message : " $state时没有给$state加双引号包裹,会进一步触发Shell的字段分割规则,最终只有第一行核心状态输出到标准输出,on-access相关的后续行直接被丢弃。 - savdstatus命令对不同运行环境的输出策略不同
直接在Shell终端执行时属于交互式TTY环境,savdstatus会默认输出包含on-access扫描状态的全量信息;通过Java ProcessBuilder调用时属于非交互式环境,savdstatus默认仅输出核心运行状态行,省略额外的功能状态说明。 - 运行权限不足导致输出不全
你手动执行脚本时使用的用户一般具备Sophos的管理访问权限,而Java进程运行的用户权限不足时,savdstatus会对低权限用户屏蔽on-access扫描的配置状态,仅返回基础的运行存活信息。
修复建议
- 优先修改Shell脚本,不要把savdstatus的输出捕获到变量,直接执行命令透传所有输出,单独做状态判断即可:
#!/bin/bash #Check state of antivirus sophos echo "Vérification de l'état de l'antivirus" # 直接输出命令所有返回内容,不要捕获到变量 ${1}bin/savdstatus 2>&1 # 单独判断运行状态 if [[ "$(${1}bin/savdstatus 2>/dev/null)" == *"Sophos Anti-Virus is active"* ]]; then exit 0 else exit 1 fi
- 确认Java进程的运行用户和你手动执行脚本的用户权限一致,或者给Java运行用户配置savdstatus的访问权限。
- 若需要强制savdstatus输出全量内容,可尝试在执行命令前添加环境变量模拟终端环境:
TERM=xterm ${1}bin/savdstatus 2>&1
内容的提问来源于stack exchange,提问作者Broshet
相关产品推荐
相关产品推荐

