如何在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
相关产品推荐
相关产品推荐

