为大家带来一个安卓可用的Shell脚本,无需root
它可以用来将一个文件中的内容编码成Base64,并保存在另一个文件中
但,要知道Base64并不是加密,而是一种编码方式,任何人都可以很轻松的将它解码,因此Base64并不适合用来保护重要内容,如果要保护重要内容可以使用AES等加密算法
源码如下:
#!/bin/bash
clear
#---------------------------------------------------------------------
# 提示作者
echo -e "\033[33m 作者BiliBili: director_mark\033[0m"
echo -e "\033[33m 作者BiliBili UID: 1113918991\033[0m"
#---------------------------------------------------------------------
echo "──────────────────────────────────────────────────────────"
#---------------------------------------------------------------------
# 报时
TIME=`date +%Y%m%d%H%M%S`
echo "尊敬的用户,此shell脚本执行时间是: "
date +"%Y-%m-%d %H:%M:%S.%N"
#---------------------------------------------------------------------
echo "──────────────────────────────────────────────────────────"
#---------------------------------------------------------------------
# 善意提醒
echo -e "\033[31m Base64不是加密,而是一种编码方式,任何人都可以很轻松的对其进行解密,如需加密shell脚本,有条件的可以使用如AES等加密方式\033[0m"
#---------------------------------------------------------------------
echo "──────────────────────────────────────────────────────────"
#---------------------------------------------------------------------
# 检测执行环境
if [ $SHELL != /system/bin/sh ]; then
echo -e "\033[33m shell脚本当前执行环境是: 拓展包\033[0m"
#----- ----- ----- ----- ----- -----
else
echo "──────────────────⇧执行环境检测(系统)标识⇧─────────────────"
echo -e "\033[33m shell脚本当前环境检测是: 系统\033[0m"
fi
#----- ----- ----- ----- ----- -----
# Root检测
if [ `id -u` -ne 0 ]; then
echo -e "\033[33m shell脚本当前为 非Root执行\033[0m"
echo -e "\033[36m 需加密文件和保存路径建议存放到本地存储(路径合法前提下)\033[0m"
#----- ----- ----- ----- ----- -----
else
echo -e "\033[33m shell脚本当前为 Root执行(需加密文件和保存路径可以为任何合法路径)\033[0m"
fi
#---------------------------------------------------------------------
echo "──────────────────────────────────────────────────────────"
#---------------------------------------------------------------------
# 输入需要加密的文件的绝对路径
echo -n " 请输入需要编码的文件绝对路径: "
read ORIGINAL_SCRIPT_PATH
#---------------------------------------------------------------------
echo "──────────────────────────────────────────────────────────"
#---------------------------------------------------------------------
# 确保原始脚本存在
if [ ! -f "$ORIGINAL_SCRIPT_PATH" ]; then
echo -e "\033[31m 文件不存在!请检查您的文件路径是否输入正确以及合法!\033[0m"
exit 1
fi
#---------------------------------------------------------------------
# 输入加密后的文件绝对路径
echo -n " 请输入编码后的文件绝对路径: "
read ENCODED_SCRIPT_PATH
#---------------------------------------------------------------------
# 提示
echo -e "\033[31m如果保存文件与原文件路径相同,那么保存后的文件会覆盖原文件\033[0m"
#---------------------------------------------------------------------
echo "──────────────────────────────────────────────────────────"
#---------------------------------------------------------------------
# 输入加密层数
echo -n " 请输入编码层数: "
read NOEL_SCRIPT_NUMBER
#---------------------------------------------------------------------
echo "──────────────────────────────────────────────────────────"
#---------------------------------------------------------------------
# 读取和初始化
# 读取原始脚本内容
SCRIPT_CONTENT=$(cat "$ORIGINAL_SCRIPT_PATH")
# 初始化编码内容变量
ENCODED_CONTENT="$SCRIPT_CONTENT"
#---------------------------------------------------------------------
# 执行Base64编码
echo -e "\033[33m 准备对文件进行Base64编码处理...\033[0m"
date +"首次编译开始时间: %Y-%m-%d %H:%M:%S.%N"
for i in $(seq 1 $NOEL_SCRIPT_NUMBER); do
ENCODED_CONTENT=$(echo -n "$ENCODED_CONTENT" | base64)
# 进度提示信息
echo -e "\033[32m>>>已编译 $i 层(第$i层,共$NOEL_SCRIPT_NUMBER层)<<<\033[0m"
date +"第 $i 层结束时间: %H:%M:%S.%N"
done
#---------------------------------------------------------------------
echo "──────────────────────────────────────────────────────────"
#---------------------------------------------------------------------
# 询问用户是否需要添加可执行化
echo " 1) 为文件添加可执行化(针对shell脚本(不安全的加密方式))\n 2) 不对文件添加可执行化"
echo -n " 请输入: "
read YoN_SCRIPT_NUMBER
#---------------------------------------------------------------------
echo "──────────────────────────────────────────────────────────"
#---------------------------------------------------------------------
# 创建文件
if (( $YoN_SCRIPT_NUMBER == 1 )); then
# 创建一个新的脚本文件并写入解码逻辑与编码后内容
echo -e "\033[36m 对编码后的文件进行可执行化\033[0m"
cat > "$ENCODED_SCRIPT_PATH" <<EOF
#!/bin/bash
ENCODED_SCRIPT="$ENCODED_CONTENT"
for i in \$(seq 1 $NOEL_SCRIPT_NUMBER); do
ENCODED_SCRIPT=\$(echo -n "\$ENCODED_SCRIPT" | base64 -d)
done
eval "\$ENCODED_SCRIPT"
EOF
#----- ----- ----- ----- ----- -----
elif (( $YoN_SCRIPT_NUMBER == 2 )); then
echo -e "\033[36m 不对编码后的文件进行可执行化\033[0m"
cat > "$ENCODED_SCRIPT_PATH" <<EOF
# $NOEL_SCRIPT_NUMBER
$ENCODED_CONTENT
EOF
#----- ----- ----- ----- ----- -----
else
echo -e "\033[36m $YoN_SCRIPT_NUMBER是非法的,自动选择2(不对编译后的文件进行可执行化)\033[0m"
cat > "$ENCODED_SCRIPT_PATH" <<EOF
# $NOEL_SCRIPT_NUMBER
$ENCODED_CONTENT
EOF
fi
#---------------------------------------------------------------------
# 赋予执行权限
# 为新脚本添加执行权限(Linux系统用得上,但是Android系统一般会自动添加660普通权限)
chmod +x "$ENCODED_SCRIPT_PATH"
#---------------------------------------------------------------------
echo "──────────────────────────────────────────────────────────"
#---------------------------------------------------------------------
# 检查是否成功
if [ -f "$ENCODED_SCRIPT_PATH" ]; then
echo -e "\033[32m 加密脚本已保存在: $ENCODED_SCRIPT_PATH\033[0m"
TIMEz=`date +%Y-%m-%d.%H:%M:%S`
#----- ----- ----- ----- ----- -----
else
echo -e "\033[31m 保存失败!\033[0m"
echo -e "\033[31m这可能是由于权限不足造成的,你可以尝试将需要加密的文件和保存路径进行更改(更改到可以读写的目录)\033[0m"
fi
#---------------------------------------------------------------------
# 创建日志
# 创建文件夹
mkdir -p /storage/emulated/0/Engineering/Base64-code/
# 创建日志
# 写入
JOURNAL_FIXED_FILE=/storage/emulated/0/Engineering/Base64-code/
TIMEz_FILE=$TIMEz.log
cat > "$JOURNAL_FIXED_FILE$TIMEz_FILE" << EOF
'Base64编码'在$TIMEz时
将: $ORIGINAL_SCRIPT_PATH 进行 $NOEL_SCRIPT_NUMBER 层Base64编码
保存在: $ENCODED_SCRIPT_PATH
保存值: $YoN_SCRIPT_NUMBER (1:进行可执行化 2&其他:不进行可执行)
EOF
# 提示
echo -e "\033[33m尊敬的用户:\033[0m"
echo -e "\033[36m 本次编码日志保存在/storage/emulated/0/Engineering/Base64-code/目录下的$TIMEz.log文件\033[0m"
在这串代码中
$ORIGINAL_SCRIPT_PATH是需要编码的文件路径(绝对路径)
$ENCODED_SCRIPT_PATH是编码后保存的文件路径(绝对路径)
$NOEL_SCRIPT_NUMBER是编码层数(整数)
因为Shell是可以执行Base64编码过的内容的,所以编码完成后你可以选择对文件进行可执行操作(前提是编码内容编码前就是Shell),但需要注意的是,Base64并不是加密,而是编码,任何人都可以很轻松的解码,所以不能当做加密使用
同时,本脚本会在编码完后生成日志,存放在/storage/emulated/0/Engineering/Base64-code/文件夹下