1、前言
需要编写一个shell脚本支持
1、修改.so文件
2、修改配置文件
3、执行jar包
2、代码解析
2.1、修改.so文件
so_file_dir="/opt/casb/xxx/lib"
# 处理.so文件
cd "$so_file_dir" || { echo "错误: 无法进入目录 $so_file_dir"; exit 1; }
if [ -e "libCSCipherJNI-release-2.3.8.so" ]; then
echo "目标.so文件已存在"
else
so_files=(libCSCipherJNI-release-*.so)
if [ -e "${so_files[0]}" ]; then
mv "${so_files[0]}" libCSCipherJNI-release-2.3.8.so
echo "已重命名.so文件"
else
echo "错误: 未找到匹配的.so文件"; exit 1
fi
fi
2.2、修改配置文件(难点在这个)
# 复制配置文件
if [ -e "$source_file" ]; then
cp "$source_file" "$target_file"
echo "已复制配置文件"
else
echo "错误: 源配置文件不存在"; exit 1
fi# 替换配置项
cp "$target_file" "${target_file}.bak"# 安全转义字符串中的特殊字符
escape_sed() {
echo "$1" | sed -e 's/[\/&]/\\&/g'
}# 替换函数(带逗号后缀)
replace_property_comma() {
local config_name="$1"
local config_value="$2"
local escaped_name=$(escape_sed "$config_name")
local escaped_value=$(escape_sed "$config_value")# 查找配置项(忽略等号周围空格)
local existing_line=$(grep -E "^[[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*" "$target_file")if [ -n "$existing_line" ]; then
# 提取当前配置项的值部分(考虑等号周围的空格)
current_value=$(echo "$existing_line" | sed -E "s/^[[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*//")# 如果当前值和要设置的值不同,才进行替换
if [ "$current_value" != ",$escaped_value,,,,,," ]; then
# 使用更灵活的正则表达式匹配(忽略等号周围空格)
sed -i.bak -E "s/^([[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*).*/\1,$escaped_value,,,,,,,/" "$target_file"
echo "✓ 已更新: $config_name=,$escaped_value"
else
echo "配置项 $config_name 值未改变,无需更新"
fi
else
echo "⚠️ 配置项 $config_name 不存在,跳过修改"
fi
}# 替换函数(直接为值,不带逗号)
replace_property_value() {
local config_name="$1"
local config_value="$2"
local escaped_name=$(escape_sed "$config_name")
local escaped_value=$(escape_sed "$config_value")# 查找配置项(忽略等号周围空格)
local existing_line=$(grep -E "^[[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*" "$target_file")if [ -n "$existing_line" ]; then
# 提取当前配置项的值部分(考虑等号周围的空格)
current_value=$(echo "$existing_line" | sed -E "s/^[[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*//")# 如果当前值和要设置的值不同,才进行替换
if [ "$current_value" != "$escaped_value" ]; then
# 使用更灵活的正则表达式匹配(忽略等号周围空格)
sed -i.bak -E "s/^([[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*).*/\1$escaped_value/" "$target_file"
echo "✓ 已更新: $config_name=$escaped_value"
else
echo "配置项 $config_name 值未改变,无需更新"
fi
else
echo "⚠️ 配置项 $config_name 不存在,跳过修改"
fi
}# 根据模式执行不同配置
case "$MODE" in
en)
echo "==== 配置加密模式 ===="# 设置加密参数(前4个带逗号,后2个不带)
replace_property_comma "export.columns.keyId" "$paramA"
replace_property_comma "export.columns.metadata" "$paramB"
replace_property_comma "export.columns.algorithm" "$paramC"
replace_property_comma "export.columns.iv" "$paramD"
replace_property_value "EN_DE_CRYPT_MODE" "0"
replace_property_value "RENAME_SUFFIX" "plain.csv"ACTION="加密"
;;
de)
echo "==== 配置解密模式 ===="# 设置解密参数(前4个带逗号,后2个不带)
replace_property_comma "export.columns.keyId" "$paramA"
replace_property_comma "export.columns.metadata" "$paramB"
replace_property_comma "export.columns.algorithm" "$paramC"
replace_property_comma "export.columns.iv" "$paramD"
replace_property_value "EN_DE_CRYPT_MODE" "1"
replace_property_value "RENAME_SUFFIX" "cipher.csv"ACTION="解密"
;;
*)
echo "错误: 未知模式 '$MODE' (支持: en=加密, de=解密)"
exit 1
;;
esac
2.3、执行jar包
# 执行 Java 程序
echo "==== 开始执行$ACTION ===="
cd "$target_dir" || { echo "错误: 无法进入目录 $target_dir"; exit 1; }
if [ -e "$users_csv_file" ]; then
java -jar decryption*.jar user.properties users.csv
else
echo "错误: 数据文件 $users_csv_file 不存在"; exit 1
fiecho "==== $ACTION操作已完成 ===="
3、修改配置文件遇到问题:配置项在配置文件里有,但是就是找不到
EN_DE_CRYPT_MODE = 0
RENAME_SUFFIX = plain.csv
3.1、原因
因为=号的前后空格导致,需要匹配空格才行。
3.2、解决方法
关键点回顾
- 空格处理:使用
[[:space:]]*
正则表达式匹配任意数量的空格,包括制表符和换行符 - 值提取:改进了值提取逻辑,确保能正确获取等号后的实际值
- 替换精度:在替换时保留了原有的空格格式,只修改值部分
# 替换函数(带逗号后缀)
replace_property_comma() {
local config_name="$1"
local config_value="$2"
local escaped_name=$(escape_sed "$config_name")
local escaped_value=$(escape_sed "$config_value")
# 查找配置项(忽略等号周围空格)
local existing_line=$(grep -E "^[[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*" "$target_file")
if [ -n "$existing_line" ]; then
# 提取当前配置项的值部分(考虑等号周围的空格)
current_value=$(echo "$existing_line" | sed -E "s/^[[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*//")
# 如果当前值和要设置的值不同,才进行替换
if [ "$current_value" != ",$escaped_value,,,,,," ]; then
# 使用更灵活的正则表达式匹配(忽略等号周围空格)
sed -i.bak -E "s/^([[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*).*/\1,$escaped_value,,,,,,,/" "$target_file"
echo "✓ 已更新: $config_name=,$escaped_value"
else
echo "配置项 $config_name 值未改变,无需更新"
fi
else
echo "⚠️ 配置项 $config_name 不存在,跳过修改"
fi
}
4、Shell脚本实践
4.1、shell脚本全文
#!/bin/bash
# 检查模式参数
if [ $# -lt 5 ]; then
echo "错误: 需要指定操作模式和4个参数"
echo "用法: $0 en|de <A> <B> <C> <D>"
exit 1
fi
MODE="$1"
paramA="$2"
paramB="$3"
paramC="$4"
paramD="$5"
# 定义目录和文件路径
so_file_dir="/opt/casb/xxx/lib"
source_dir="/opt"
target_dir="/opt/AOEClient/client/decryption"
source_file="$source_dir/user.properties"
target_file="$target_dir/user.properties"
users_csv_file="$target_dir/users.csv"
# 处理.so文件
cd "$so_file_dir" || { echo "错误: 无法进入目录 $so_file_dir"; exit 1; }
if [ -e "libCSCipherJNI-release-2.3.8.so" ]; then
echo "目标.so文件已存在"
else
so_files=(libCSCipherJNI-release-*.so)
if [ -e "${so_files[0]}" ]; then
mv "${so_files[0]}" libCSCipherJNI-release-2.3.8.so
echo "已重命名.so文件"
else
echo "错误: 未找到匹配的.so文件"; exit 1
fi
fi
# 检查目标目录是否存在
if [ ! -d "$target_dir" ]; then
echo "错误: 目标目录 $target_dir 不存在"; exit 1
fi
# 复制配置文件
if [ -e "$source_file" ]; then
cp "$source_file" "$target_file"
echo "已复制配置文件"
else
echo "错误: 源配置文件不存在"; exit 1
fi
# 替换配置项
cp "$target_file" "${target_file}.bak"
# 安全转义字符串中的特殊字符
escape_sed() {
echo "$1" | sed -e 's/[\/&]/\\&/g'
}
# 替换函数(带逗号后缀)
replace_property_comma() {
local config_name="$1"
local config_value="$2"
local escaped_name=$(escape_sed "$config_name")
local escaped_value=$(escape_sed "$config_value")
# 查找配置项(忽略等号周围空格)
local existing_line=$(grep -E "^[[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*" "$target_file")
if [ -n "$existing_line" ]; then
# 提取当前配置项的值部分(考虑等号周围的空格)
current_value=$(echo "$existing_line" | sed -E "s/^[[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*//")
# 如果当前值和要设置的值不同,才进行替换
if [ "$current_value" != ",$escaped_value,,,,,," ]; then
# 使用更灵活的正则表达式匹配(忽略等号周围空格)
sed -i.bak -E "s/^([[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*).*/\1,$escaped_value,,,,,,,/" "$target_file"
echo "✓ 已更新: $config_name=,$escaped_value"
else
echo "配置项 $config_name 值未改变,无需更新"
fi
else
echo "⚠️ 配置项 $config_name 不存在,跳过修改"
fi
}
# 替换函数(直接为值,不带逗号)
replace_property_value() {
local config_name="$1"
local config_value="$2"
local escaped_name=$(escape_sed "$config_name")
local escaped_value=$(escape_sed "$config_value")
# 查找配置项(忽略等号周围空格)
local existing_line=$(grep -E "^[[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*" "$target_file")
if [ -n "$existing_line" ]; then
# 提取当前配置项的值部分(考虑等号周围的空格)
current_value=$(echo "$existing_line" | sed -E "s/^[[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*//")
# 如果当前值和要设置的值不同,才进行替换
if [ "$current_value" != "$escaped_value" ]; then
# 使用更灵活的正则表达式匹配(忽略等号周围空格)
sed -i.bak -E "s/^([[:space:]]*$escaped_name[[:space:]]*=[[:space:]]*).*/\1$escaped_value/" "$target_file"
echo "✓ 已更新: $config_name=$escaped_value"
else
echo "配置项 $config_name 值未改变,无需更新"
fi
else
echo "⚠️ 配置项 $config_name 不存在,跳过修改"
fi
}
# 根据模式执行不同配置
case "$MODE" in
en)
echo "==== 配置加密模式 ===="
# 设置加密参数(前4个带逗号,后2个不带)
replace_property_comma "export.columns.keyId" "$paramA"
replace_property_comma "export.columns.metadata" "$paramB"
replace_property_comma "export.columns.algorithm" "$paramC"
replace_property_comma "export.columns.iv" "$paramD"
replace_property_value "EN_DE_CRYPT_MODE" "0"
replace_property_value "RENAME_SUFFIX" "plain.csv"
ACTION="加密"
;;
de)
echo "==== 配置解密模式 ===="
# 设置解密参数(前4个带逗号,后2个不带)
replace_property_comma "export.columns.keyId" "$paramA"
replace_property_comma "export.columns.metadata" "$paramB"
replace_property_comma "export.columns.algorithm" "$paramC"
replace_property_comma "export.columns.iv" "$paramD"
replace_property_value "EN_DE_CRYPT_MODE" "1"
replace_property_value "RENAME_SUFFIX" "cipher.csv"
ACTION="解密"
;;
*)
echo "错误: 未知模式 '$MODE' (支持: en=加密, de=解密)"
exit 1
;;
esac
# 执行 Java 程序
echo "==== 开始执行$ACTION ===="
cd "$target_dir" || { echo "错误: 无法进入目录 $target_dir"; exit 1; }
if [ -e "$users_csv_file" ]; then
java -jar decryption*.jar user.properties users.csv
else
echo "错误: 数据文件 $users_csv_file 不存在"; exit 1
fi
echo "==== $ACTION操作已完成 ===="
4.2、执行结果
sh test.sh en 1920678415246057474 dff2ea4e046ee585e9d3297e590c1062 SM4_GCM fbd570b56d929666f51f3e0791caf2cd