You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在jarsigner检测到未签名Jar时终止Bash脚本?

解决Bash脚本中jarsigner未签名检测的问题

jarsigner -verify在遇到未签名Jar/Zip时只会输出jar is unsigned.或no manifest.提示,但返回退出码0,没法直接靠set -e自动终止脚本。我们可以通过捕获命令输出内容,判断文件是否未签名或非AWS签名,从而终止脚本,具体实现如下:

1. 捕获jarsigner验证输出

执行验证命令时,把标准输出和错误输出一并捕获到变量里,避免输出干扰脚本逻辑:

TARGET_FILE="your-file.jar"
VERIFY_RESULT=$(jarsigner -verify "$TARGET_FILE" 2>&1)

2. 判断是否为未签名状态

检查捕获到的内容里是否包含未签名相关关键词,一旦匹配就终止脚本:

if echo "$VERIFY_RESULT" | grep -qE "jar is unsigned\.|no manifest\."; then
    echo "错误:目标文件未签名,终止脚本"
    exit 1
fi

3. 验证签名是否为AWS签名

如果需要确认签名来自AWS,用-verbose参数获取详细签名信息,再匹配AWS相关标识(比如证书主题里的Amazon Web Services或AWS字段,可根据实际情况调整):

DETAILED_RESULT=$(jarsigner -verify -verbose "$TARGET_FILE" 2>&1)
# 匹配AWS签名特征,示例规则可根据实际输出修改
if ! echo "$DETAILED_RESULT" | grep -qE "CN=Amazon Web Services|OU=AWS"; then
    echo "错误:目标文件不是AWS签名,终止脚本"
    exit 1
fi

完整脚本示例

#!/bin/bash
set -e

# 替换成你的目标Jar/Zip文件路径
TARGET_FILE="app-package.zip"

# 第一步:检查文件是否已签名
VERIFY_RESULT=$(jarsigner -verify "$TARGET_FILE" 2>&1)
if echo "$VERIFY_RESULT" | grep -qE "jar is unsigned\.|no manifest\."; then
    echo "错误:目标文件未签名,终止脚本"
    exit 1
fi

# 第二步:检查是否为AWS签名
DETAILED_RESULT=$(jarsigner -verify -verbose "$TARGET_FILE" 2>&1)
# 可根据实际AWS签名的输出特征调整匹配规则
if ! echo "$DETAILED_RESULT" | grep -qE "CN=Amazon Web Services|OU=AWS"; then
    echo "错误:目标文件不是AWS签名,终止脚本"
    exit 1
fi

# 验证通过后执行后续逻辑
echo "签名验证通过,继续执行脚本..."

注意事项

  • 调整grep的匹配规则时,先执行jarsigner -verify -verbose查看已知AWS签名文件的输出,提取稳定的标识字段,避免误判。
  • 如果遇到过期证书警告(比如Warning: The signer certificate will expire within six months.),可以在判断时用grep -v排除这些无关内容。

内容的提问来源于stack exchange,提问作者Emanuel George Hategan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:13:33