feat: support zsh for fix #64
This commit is contained in:
1 parent
b45854cdd4
commit
0b97790a0a
4 files changed
+122
-70
No files matched your search
+8
-7
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
Reference in new issue
Block a user