mirror of
https://github.com/juewuy/ShellCrash.git
synced 2026-03-11 16:01:28 +00:00
234 lines
9.5 KiB
Bash
234 lines
9.5 KiB
Bash
#!/bin/sh
|
||
# Copyright (C) Juewuy
|
||
|
||
#特殊固件识别及标记
|
||
[ -f "/etc/storage/started_script.sh" ] && { #老毛子固件
|
||
systype=Padavan
|
||
initdir='/etc/storage/started_script.sh'
|
||
}
|
||
[ -d "/jffs" ] && { #华硕固件
|
||
systype=asusrouter
|
||
[ -f "/jffs/.asusrouter" ] && initdir='/jffs/.asusrouter'
|
||
[ -d "/jffs/scripts" ] && initdir='/jffs/scripts/nat-start'
|
||
#华硕启用jffs
|
||
nvram set jffs2_scripts="1"
|
||
nvram commit
|
||
}
|
||
[ -f "/data/etc/crontabs/root" ] && systype=mi_snapshot #小米设备
|
||
[ -w "/var/mnt/cfg/firewall" ] && systype=ng_snapshot #NETGEAR设备
|
||
#容器内环境
|
||
grep -qE '/(docker|lxc|kubepods|crio|containerd)/' /proc/1/cgroup || [ -f /run/.containerenv ] || [ -f /.dockerenv ] && systype='container'
|
||
#检查环境变量
|
||
[ "$systype" = 'container' ] && CRASHDIR='/etc/ShellCrash'
|
||
[ -z "$CRASHDIR" ] && [ -n "$clashdir" ] && CRASHDIR="$clashdir"
|
||
[ -z "$CRASHDIR" ] && [ -d /tmp/SC_tmp ] && . /tmp/SC_tmp/menus/set_crashdir.sh && set_crashdir
|
||
#移动文件
|
||
mkdir -p "$CRASHDIR"
|
||
rm -rf /tmp/SC_tmp/menus/set_crashdir.sh
|
||
mv -f /tmp/SC_tmp/* "$CRASHDIR" 2>/dev/null
|
||
##############################
|
||
#注意目录变更
|
||
CFG_PATH="$CRASHDIR"/configs/ShellCrash.cfg
|
||
. "$CRASHDIR"/libs/set_config.sh
|
||
. "$CRASHDIR"/libs/set_profile.sh
|
||
#初始化
|
||
mkdir -p "$CRASHDIR"/configs
|
||
[ -f "$CFG_PATH" ] || echo '#ShellCrash配置文件,不明勿动!' >"$CFG_PATH"
|
||
#判断系统类型写入不同的启动文件
|
||
[ -w /usr/lib/systemd/system ] && sysdir=/usr/lib/systemd/system
|
||
[ -w /etc/systemd/system ] && sysdir=/etc/systemd/system
|
||
if [ -f /etc/rc.common -a "$(cat /proc/1/comm)" = "procd" ]; then
|
||
#设为init.d方式启动
|
||
cp -f "$CRASHDIR"/starts/shellcrash.procd /etc/init.d/shellcrash
|
||
chmod 755 /etc/init.d/shellcrash
|
||
elif [ -n "$sysdir" -a "$USER" = "root" -a "$(cat /proc/1/comm)" = "systemd" ]; then
|
||
#创建shellcrash用户
|
||
userdel shellcrash 2>/dev/null
|
||
sed -i '/0:7890/d' /etc/passwd
|
||
sed -i '/x:7890/d' /etc/group
|
||
if useradd -h >/dev/null 2>&1; then
|
||
useradd shellcrash -u 7890 2>/dev/null
|
||
sed -Ei s/7890:7890/0:7890/g /etc/passwd
|
||
else
|
||
echo "shellcrash:x:0:7890::/home/shellcrash:/bin/sh" >>/etc/passwd
|
||
fi
|
||
#配置systemd
|
||
mv -f "$CRASHDIR"/starts/shellcrash.service "$sysdir"/shellcrash.service 2>/dev/null
|
||
sed -i "s%/etc/ShellCrash%$CRASHDIR%g" "$sysdir"/shellcrash.service
|
||
systemctl daemon-reload
|
||
rm -rf "$CRASHDIR"/starts/shellcrash.procd
|
||
elif rc-status -r >/dev/null 2>&1; then
|
||
#设为openrc方式启动
|
||
mv -f "$CRASHDIR"/starts/shellcrash.openrc /etc/init.d/shellcrash
|
||
chmod 755 /etc/init.d/shellcrash
|
||
rm -rf "$CRASHDIR"/starts/shellcrash.procd
|
||
else
|
||
#设为保守模式启动
|
||
setconfig start_old 已开启
|
||
rm -rf "$CRASHDIR"/starts/shellcrash.procd
|
||
fi
|
||
rm -rf "$CRASHDIR"/starts/shellcrash.service
|
||
rm -rf "$CRASHDIR"/starts/shellcrash.openrc
|
||
|
||
#修饰文件及版本号
|
||
command -v bash >/dev/null 2>&1 && shtype=bash
|
||
[ -x /bin/ash ] && shtype=ash
|
||
#批量授权
|
||
for file in start.sh starts/bfstart.sh starts/afstart.sh starts/fw_stop.sh menu.sh menus/task_cmd.sh menus/bot_tg.sh; do
|
||
sed -i "s|/bin/sh|/bin/$shtype|" "$CRASHDIR/$file" 2>/dev/null
|
||
chmod +x "$CRASHDIR/$file" 2>/dev/null
|
||
done
|
||
setconfig versionsh_l $version
|
||
#生成用于执行启动服务的变量文件
|
||
[ ! -f "$CRASHDIR"/configs/command.env ] && {
|
||
TMPDIR='/tmp/ShellCrash'
|
||
BINDIR="$CRASHDIR"
|
||
touch "$CRASHDIR"/configs/command.env
|
||
setconfig TMPDIR "$TMPDIR" "$CRASHDIR"/configs/command.env
|
||
setconfig BINDIR "$BINDIR" "$CRASHDIR"/configs/command.env
|
||
}
|
||
if [ -n "$(grep 'crashcore=singbox' "$CFG_PATH")" ]; then
|
||
COMMAND='"$TMPDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"'
|
||
else
|
||
COMMAND='"$TMPDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"'
|
||
fi
|
||
setconfig COMMAND "$COMMAND" "$CRASHDIR"/configs/command.env
|
||
#设置防火墙执行模式
|
||
grep -q 'firewall_mod' "$CRASHDIR/configs/ShellClash.cfg" 2>/dev/null || {
|
||
firewall_mod=iptables
|
||
nft add table inet shellcrash 2>/dev/null && firewall_mod=nftables
|
||
setconfig firewall_mod $firewall_mod
|
||
}
|
||
#设置更新地址
|
||
[ -n "$url" ] && setconfig update_url $url
|
||
#设置环境变量
|
||
[ -w /opt/etc/profile ] && profile=/opt/etc/profile
|
||
[ -w /jffs/configs/profile.add ] && profile=/jffs/configs/profile.add
|
||
[ -z "$profile" ] && profile=/etc/profile
|
||
if [ -n "$profile" ]; then
|
||
set_profile "$profile"
|
||
#适配zsh环境变量
|
||
zsh --version >/dev/null 2>&1 && [ -z "$(cat $HOME/.zshrc 2>/dev/null | grep CRASHDIR)" ] && set_profile "$HOME/.zshrc"
|
||
setconfig my_alias "$my_alias"
|
||
else
|
||
echo -e "\033[33m无法写入环境变量!请检查安装权限!\033[0m"
|
||
exit 1
|
||
fi
|
||
#梅林/Padavan额外设置
|
||
[ -n "$initdir" ] && {
|
||
touch "$initdir"
|
||
sed -i '/ShellCrash初始化/'d "$initdir"
|
||
echo "$CRASHDIR/starts/general_init.sh & #ShellCrash初始化脚本" >>"$initdir"
|
||
chmod 755 "$CRASHDIR"/starts/general_init.sh
|
||
chmod a+rx "$initdir" 2>/dev/null
|
||
setconfig initdir "$initdir"
|
||
}
|
||
#Padavan额外设置
|
||
[ -f "/etc/storage/started_script.sh" ] && mount -t tmpfs -o remount,rw,size=45M tmpfs /tmp #增加/tmp空间以适配新的内核压缩方式
|
||
#镜像化OpenWrt(snapshot)额外设置
|
||
if [ "$systype" = "mi_snapshot" -o "$systype" = "ng_snapshot" ]; then
|
||
chmod 755 "$CRASHDIR"/starts/snapshot_init.sh
|
||
if [ "$systype" = "mi_snapshot" ];then
|
||
path="/data/shellcrash_init.sh"
|
||
setconfig CRASHDIR "$CRASHDIR" "$CRASHDIR"/starts/snapshot_init.sh
|
||
mv -f "$CRASHDIR"/starts/snapshot_init.sh "$path"
|
||
[ ! -f /data/auto_start.sh ] && echo '#用于自定义需要开机启动的功能或者命令,会在开机后自动运行' > /data/auto_start.sh
|
||
else
|
||
path="$CRASHDIR"/starts/snapshot_init.sh
|
||
fi
|
||
uci delete firewall.auto_ssh 2>/dev/null
|
||
uci delete firewall.ShellCrash 2>/dev/null
|
||
uci set firewall.ShellCrash=include
|
||
uci set firewall.ShellCrash.type='script'
|
||
uci set firewall.ShellCrash.path="$path"
|
||
uci set firewall.ShellCrash.enabled='1'
|
||
uci commit firewall
|
||
else
|
||
rm -rf "$CRASHDIR"/starts/snapshot_init.sh
|
||
fi
|
||
#华硕USB启动额外设置
|
||
[ "$usb_status" = "1" ] && {
|
||
echo "$CRASHDIR/start.sh init & #ShellCrash初始化脚本" >"$CRASHDIR"/asus_usb_mount.sh
|
||
nvram set script_usbmount="$CRASHDIR/asus_usb_mount.sh"
|
||
nvram commit
|
||
}
|
||
#华硕下载大师启动额外设置
|
||
[ -f "$dir/asusware.arm/etc/init.d/S50downloadmaster" ] && [ -z "$(grep 'ShellCrash' $dir/asusware.arm/etc/init.d/S50downloadmaster)" ] &&
|
||
sed -i "/^PATH=/a\\$CRASHDIR/start.sh init & #ShellCrash初始化脚本" "$dir/asusware.arm/etc/init.d/S50downloadmaster"
|
||
#容器环境额外设置
|
||
[ "$systype" = 'container' ] && {
|
||
setconfig userguide '1'
|
||
setconfig crashcore 'meta'
|
||
setconfig dns_mod 'mix'
|
||
setconfig firewall_area '1'
|
||
setconfig firewall_mod 'nftables'
|
||
setconfig release_type 'master'
|
||
setconfig start_old 'OFF'
|
||
echo "$CRASHDIR/menu.sh" >> /etc/profile
|
||
cat > /usr/bin/crash <<'EOF'
|
||
#!/bin/sh
|
||
CRASHDIR=${CRASHDIR:-/etc/ShellCrash}
|
||
export CRASHDIR
|
||
exec "$CRASHDIR/menu.sh" "$@"
|
||
EOF
|
||
chmod 755 /usr/bin/crash
|
||
}
|
||
setconfig systype $systype
|
||
#删除临时文件
|
||
rm -rf /tmp/*rash*gz
|
||
rm -rf /tmp/SC_tmp
|
||
#转换&清理旧版本文件
|
||
mkdir -p "$CRASHDIR"/yamls
|
||
mkdir -p "$CRASHDIR"/jsons
|
||
mkdir -p "$CRASHDIR"/tools
|
||
mkdir -p "$CRASHDIR"/task
|
||
mkdir -p "$CRASHDIR"/ruleset
|
||
for file in config.yaml.bak user.yaml proxies.yaml proxy-groups.yaml rules.yaml others.yaml; do
|
||
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/yamls/"$file" 2>/dev/null
|
||
done
|
||
[ ! -L "$CRASHDIR"/config.yaml ] && mv -f "$CRASHDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml 2>/dev/null
|
||
for file in fake_ip_filter mac web_save servers.list fake_ip_filter.list fallback_filter.list singbox_providers.list clash_providers.list; do
|
||
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/configs/"$file" 2>/dev/null
|
||
done
|
||
#配置文件改名
|
||
mv -f "$CRASHDIR"/configs/ShellClash.cfg "$CFG_PATH" 2>/dev/null
|
||
#数据库改名
|
||
mv -f "$CRASHDIR"/geosite.dat "$CRASHDIR"/GeoSite.dat 2>/dev/null
|
||
mv -f "$CRASHDIR"/ruleset/geosite-cn.srs "$CRASHDIR"/ruleset/cn.srs 2>/dev/null
|
||
mv -f "$CRASHDIR"/ruleset/geosite-cn.mrs "$CRASHDIR"/ruleset/cn.mrs 2>/dev/null
|
||
#数据库移动
|
||
mv -f "$CRASHDIR"/*.srs "$CRASHDIR"/ruleset/ 2>/dev/null
|
||
mv -f "$CRASHDIR"/*.mrs "$CRASHDIR"/ruleset/ 2>/dev/null
|
||
for file in dropbear_rsa_host_key authorized_keys tun.ko ShellDDNS.sh; do
|
||
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/tools/"$file" 2>/dev/null
|
||
done
|
||
for file in cron task.list; do
|
||
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/task/"$file" 2>/dev/null
|
||
done
|
||
mv -f "$CRASHDIR"/menus/task_cmd.sh "$CRASHDIR"/task/task.sh 2>/dev/null
|
||
#旧版文件清理
|
||
userdel shellclash >/dev/null 2>&1
|
||
sed -i '/shellclash/d' /etc/passwd
|
||
sed -i '/shellclash/d' /etc/group
|
||
rm -rf /etc/init.d/clash
|
||
rm -rf "$CRASHDIR"/rules
|
||
[ "$systype" = "mi_snapshot" -a "$CRASHDIR" != '/data/clash' ] && rm -rf /data/clash
|
||
for file in webget.sh misnap_init.sh core.new; do
|
||
rm -f "$CRASHDIR/$file"
|
||
done
|
||
#旧版变量改名
|
||
sed -i "s/clashcore/crashcore/g" "$CFG_PATH"
|
||
sed -i "s/clash_v/core_v/g" "$CFG_PATH"
|
||
sed -i "s/clash.meta/meta/g" "$CFG_PATH"
|
||
sed -i "s/ShellClash/ShellCrash/g" "$CFG_PATH"
|
||
sed -i "s/cpucore=armv8/cpucore=arm64/g" "$CFG_PATH"
|
||
sed -i "s/redir_mod=Nft基础/redir_mod=Redir模式/g" "$CFG_PATH"
|
||
sed -i "s/redir_mod=Nft混合/redir_mod=Tproxy模式/g" "$CFG_PATH"
|
||
sed -i "s/redir_mod=Tproxy混合/redir_mod=Tproxy模式/g" "$CFG_PATH"
|
||
sed -i "s/redir_mod=纯净模式/firewall_area=4/g" "$CFG_PATH"
|
||
#变量统一使用ON/OFF
|
||
sed -i 's/=\(已启用\|已开启\)$/=ON/' "$CFG_PATH"
|
||
sed -i 's/=\(未启用\|未开启\)$/=OFF/' "$CFG_PATH"
|
||
|
||
echo -e "\033[32m脚本初始化完成,请输入\033[30;47m $my_alias \033[0;33m命令开始使用!\033[0m"
|