feat: support zsh for fix #64

This commit is contained in:
libm committed 2025-04-06 02:47:20 +08:00
1 parent b45854cdd4
commit 0b97790a0a
4 files changed
+122 -70

No files matched your search

+8 -7
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# shellcheck disable=SC2148
# shellcheck disable=SC1091
. script/common.sh
. script/clashctl.sh
. script/common.sh >&/dev/null
. script/clashctl.sh >&/dev/null
_valid_env
@@ -18,11 +18,11 @@ _get_kernel
_set_bin "$RESOURCES_BIN_DIR"
_valid_config "$RESOURCES_CONFIG" || {
prompt=$(_okcat '✈️ ' '输入订阅链接:')
read -p "$prompt" -r url
echo -n "$(_okcat '✈️ ' '输入订阅:')"
read -r url
_okcat '⏳' '正在下载...'
_download_config "$RESOURCES_CONFIG" "$url" || _error_quit "下载失败: 请将配置内容写入 $RESOURCES_CONFIG 后重新安装"
_valid_config "$RESOURCES_CONFIG" || _error_quit "配置无效,请检查:$RESOURCES_CONFIG"
_valid_config "$RESOURCES_CONFIG" || _error_quit "配置无效,请检查配置:$RESOURCES_CONFIG,转换日志:$BIN_SUBCONVERTER_LOG"
}
_okcat '✅' '配置可用'
mkdir "$CLASH_BASE_DIR"
@@ -51,6 +51,7 @@ EOF
systemctl daemon-reload
systemctl enable "$BIN_KERNEL_NAME" >&/dev/null || _failcat '💥' "设置自启失败" && _okcat '🚀' "已设置开机自启"
clashon && _okcat '🎉' 'enjoy 🎉'
clashui
_okcat '🎉' 'enjoy 🎉'
clash
_quit
+73 -24
View File
@@ -1,4 +1,4 @@
#!/bin/bash
# shellcheck disable=SC2148
# shellcheck disable=SC2155
function clashon() {
@@ -23,7 +23,7 @@ function clashon() {
}
systemctl is-active "$BIN_KERNEL_NAME" >&/dev/null && [ -z "$http_proxy" ] && {
_is_root || _failcat '当前 shell 未检测到代理变量,需执行 clashon 开启代理环境' && clashon
_is_root || _failcat '未检测到代理变量,可执行 clashon 开启代理环境' && clashon
}
function clashoff() {
@@ -101,9 +101,9 @@ function clashsecret() {
}
_tunstatus() {
local status=$(sudo "$BIN_YQ" '.tun.enable' "${CLASH_CONFIG_RUNTIME}")
local tun_status=$(sudo "$BIN_YQ" '.tun.enable' "${CLASH_CONFIG_RUNTIME}")
# shellcheck disable=SC2015
[ "$status" = 'true' ] && _okcat 'Tun 状态:启用' || _failcat 'Tun 状态:关闭'
[ "$tun_status" = 'true' ] && _okcat 'Tun 状态:启用' || _failcat 'Tun 状态:关闭'
}
_tunoff() {
@@ -178,8 +178,8 @@ function clashupdate() {
_error_quit
}
_download_config "$CLASH_CONFIG_RAW" "$url" || _rollback "更新失败:已回滚配置"
_valid_config "$CLASH_CONFIG_RAW" || _rollback "转换失败:已回滚配置,请检查日志:$BIN_SUBCONVERTER_LOG"
_download_config "$CLASH_CONFIG_RAW" "$url" || _rollback "下载失败:已回滚配置"
_valid_config "$CLASH_CONFIG_RAW" || _rollback "转换失败:已回滚配置,转换日志:$BIN_SUBCONVERTER_LOG"
_merge_config_restart && _okcat '🍃' '订阅更新成功'
echo "$url" | sudo tee "$CLASH_CONFIG_URL" >&/dev/null
@@ -194,30 +194,79 @@ function clashmixin() {
}
;;
-r)
less "$CLASH_CONFIG_RUNTIME"
less -f "$CLASH_CONFIG_RUNTIME"
;;
*)
less "$CLASH_CONFIG_MIXIN"
less -f "$CLASH_CONFIG_MIXIN"
;;
esac
}
function clash() {
local color=#c8d6e5
local prefix=$(_get_color "$color")
local suffix=$(printf '\033[0m')
printf "%b\n" "$(
cat <<EOF | column -t -s ',' | sed -E "/clash/ s|(clash)(\w*)|\1${prefix}\2${suffix}|g"
function clashctl() {
case "$1" in
on)
clashon
;;
off)
clashoff
;;
ui)
clashui
;;
status)
shift
clashstatus "$@"
;;
tun)
shift
clashtun "$@"
;;
mixin)
shift
clashmixin "$@"
;;
secret)
shift
clashsecret "$@"
;;
update)
shift
clashupdate "$@"
;;
*)
cat <<EOF
Usage:
clash 命令一览,
clashon 开启代理,
clashoff 关闭代理,
clashui 面板地址,
clashstatus 内核状况,
clashtun [on|off] Tun 模式,
clashmixin [-e|-r] Mixin 配置,
clashsecret [secret] Web 密钥,
clashupdate [auto|log] 更新订阅,
clash COMMAND [OPTION]
mihomo COMMAND [OPTION]
clashctl COMMAND [OPTION]
mihomoctl COMMAND [OPTION】
Commands:
on 开启代理
off 关闭代理
ui 面板地址
status 内核状况
tun [on|off] Tun 模式
mixin [-e|-r] Mixin 配置
secret [SECRET] Web 密钥
update [auto|log] 更新订阅
EOF
)"
;;
esac
}
function mihomoctl() {
clashctl "$@"
}
function clash() {
clashctl "$@"
}
function mihomo() {
clashctl "$@"
}
+39 -36
View File
@@ -1,8 +1,8 @@
#!/bin/bash
# shellcheck disable=SC2148
# shellcheck disable=SC2034
# shellcheck disable=SC2155
[ -n "$BASH_VERSION" ] && set +o noglob
[ -n "$ZSH_VERSION" ] && setopt glob
[ -n "$ZSH_VERSION" ] && setopt glob no_nomatch
URL_GH_PROXY='https://gh-proxy.com/'
URL_CLASH_UI="http://board.zash.run.place"
@@ -15,10 +15,10 @@ RESOURCES_CONFIG="${RESOURCES_BASE_DIR}/config.yaml"
RESOURCES_CONFIG_MIXIN="${RESOURCES_BASE_DIR}/mixin.yaml"
ZIP_BASE_DIR="${RESOURCES_BASE_DIR}/zip"
ZIP_CLASH="${ZIP_BASE_DIR}/clash*.gz"
ZIP_MIHOMO="${ZIP_BASE_DIR}/mihomo*.gz"
ZIP_YQ="${ZIP_BASE_DIR}/yq*.tar.gz"
ZIP_SUBCONVERTER="${ZIP_BASE_DIR}/subconverter*.tar.gz"
ZIP_CLASH=$(echo ${ZIP_BASE_DIR}/clash*)
ZIP_MIHOMO=$(echo ${ZIP_BASE_DIR}/mihomo*)
ZIP_YQ=$(echo ${ZIP_BASE_DIR}/yq*)
ZIP_SUBCONVERTER=$(echo ${ZIP_BASE_DIR}/subconverter*)
ZIP_UI="${ZIP_BASE_DIR}/yacd.tar.xz"
CLASH_BASE_DIR='/opt/clash'
@@ -31,24 +31,26 @@ CLASH_CONFIG_RUNTIME="${CLASH_BASE_DIR}/runtime.yaml"
CLASH_UPDATE_LOG="${CLASH_BASE_DIR}/clashupdate.log"
_set_var() {
# 定时任务路径
{
local os_info=$(cat /etc/os-release)
echo "$os_info" | grep -iqsE "rhel|centos" && {
CLASH_CRON_TAB="/var/spool/cron/root"
}
echo "$os_info" | grep -iqsE "debian|ubuntu" && {
CLASH_CRON_TAB="/var/spool/cron/crontabs/root"
}
local user=$USER
local home=$HOME
[ -n "$SUDO_USER" ] && {
user=$SUDO_USER
home=$(awk -F: -v user="$SUDO_USER" '$1==user{print $6}' /etc/passwd)
}
# rc文件路径
{
local home=$HOME
[ -n "$SUDO_USER" ] && home=$(awk -F: -v user="$SUDO_USER" '$1==user{print $6}' /etc/passwd)
BASH_RC_ROOT='/root/.bashrc'
BASH_RC_USER="${home}/.bashrc"
[ -n "$BASH_VERSION" ] && {
_SHELL=bash
SHELL_RC="${home}/.bashrc"
}
[ -n "$ZSH_VERSION" ] && {
_SHELL=zsh
SHELL_RC="${home}/.zshrc"
}
# 定时任务路径
local os_info=$(cat /etc/os-release)
echo "$os_info" | grep -iqsE "rhel|centos" && CLASH_CRON_TAB="/var/spool/cron/$user"
echo "$os_info" | grep -iqsE "debian|ubuntu" && CLASH_CRON_TAB="/var/spool/cron/crontabs/$user"
}
_set_var
@@ -77,18 +79,14 @@ _set_bin
# shellcheck disable=SC2086
_set_rc() {
[ "$BASH_RC_ROOT" = "$BASH_RC_USER" ] && unset BASH_RC_USER
[ "$1" = "unset" ] && {
sed -i "\|$CLASH_SCRIPT_DIR|d" $BASH_RC_ROOT $BASH_RC_USER
sed -i "\|$CLASH_SCRIPT_DIR|d" $SHELL_RC
return
}
[ -n "$(tail -n 1 "$BASH_RC_ROOT")" ] && echo >>"$BASH_RC_ROOT"
[ -n "$(tail -n 1 "$BASH_RC_USER" >&/dev/null)" ] && echo >>"$BASH_RC_USER"
[ -n "$(tail -n 1 "$SHELL_RC")" ] && echo >>"$SHELL_RC"
echo "source $CLASH_SCRIPT_DIR/common.sh && source $CLASH_SCRIPT_DIR/clashctl.sh" |
tee -a $BASH_RC_ROOT $BASH_RC_USER >&/dev/null
tee -a $SHELL_RC >&/dev/null
}
# 默认集成、安装mihomo内核
@@ -184,6 +182,12 @@ function _failcat() {
_get_color_msg "$color" "$msg" >&2 && return 1
}
function _quit() {
local user=root
[ -n "$SUDO_USER" ] && user=$SUDO_USER
sudo -u "$user" "$_SHELL"
}
function _error_quit() {
[ $# -gt 0 ] && {
local color=#f92f60
@@ -192,7 +196,7 @@ function _error_quit() {
local msg="${emoji} $1"
_get_color_msg "$color" "$msg"
}
exec $SHELL
_quit
}
_is_bind() {
@@ -212,18 +216,17 @@ function _is_root() {
function _valid_env() {
_is_root || _error_quit "需要 root 或 sudo 权限执行"
[ "$(ps -p $$ -o comm=)" != "bash" ] && _error_quit "当前终端不是 bash"
[ -n "$ZSH_VERSION" ] && [ -n "$BASH_VERSION" ] && _error_quit "仅支持:bash、zsh"
[ "$(ps -p 1 -o comm=)" != "systemd" ] && _error_quit "系统不具备 systemd"
}
function _valid_config() {
[ -e "$1" ] && [ "$(wc -l <"$1")" -gt 1 ] && {
local test_cmd="$BIN_KERNEL -d $(dirname "$1") -f $1 -t"
local fail_msg
fail_msg=$($test_cmd) || {
$test_cmd
echo "$fail_msg" | grep -qs "unsupport proxy type" && _error_quit "不支持的代理协议,请安装 mihomo 内核"
}
local msg is_valid
msg=$($BIN_KERNEL -d "$(dirname "$1")" -f "$1" -t)
is_valid=$?
echo "$msg" | grep -qs "unsupport proxy type" && _error_quit "不支持的代理协议,请安装 mihomo 内核"
return $is_valid
}
}
+2 -3
View File
@@ -1,4 +1,4 @@
#!/bin/bash
# shellcheck disable=SC2148
# shellcheck disable=SC1091
. script/common.sh >&/dev/null
. script/clashctl.sh >&/dev/null
@@ -14,5 +14,4 @@ systemctl daemon-reload
rm -rf "$CLASH_BASE_DIR"
_set_rc unset
_okcat '✨' '已卸载,相关配置已清除'
# 未 export 的变量和函数不会被继承
exec bash
_quit