add
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# 批量搭建ss2022入站到sk5出站代理
|
||||
# 批量搭建ss2022入站到批量sk5出站代理,链式代理
|
||||
# 读取sk5文件实现批量导入出站
|
||||
# 作者sky22333
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# 批量搭建vmess+ws入站到sk5出站代理
|
||||
# 批量搭建vmess+ws入站到批量sk5出站代理,链式 代理
|
||||
# 读取sk5文件实现批量导入出站
|
||||
# 作者sky22333
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# 站群多IP源进源出节点脚本vmess+ws协议
|
||||
# 站群多IP源进源出节点脚本vmess-ws协议
|
||||
# 作者sky22333
|
||||
|
||||
install_jq() {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# sing-box站群多IP源进源出节点脚本 支持sk5和vless+tcp协议
|
||||
# sing-box站群多IP源进源出节点脚本 socks和vless+tcp协议
|
||||
|
||||
# 生成随机8位数的用户名和密码
|
||||
generate_random_string() {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# 自用修改版脚本,鸣谢:https://github.com/Devmiston/sing-box
|
||||
# 自用修改版脚本,sing-box全协议脚本,鸣谢:https://github.com/Devmiston/sing-box
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# 站群多IP源进源出节点脚本 支持sk5和vless+tcp协议
|
||||
# 站群多IP源进源出节点脚本 socks和vless+tcp协议
|
||||
|
||||
# 生成随机8位数的用户名和密码
|
||||
generate_random_string() {
|
||||
670
proxy/socks-vmess.sh
Normal file
670
proxy/socks-vmess.sh
Normal file
@@ -0,0 +1,670 @@
|
||||
#!/bin/bash
|
||||
# 站群多IP源进源出节点脚本 socks和vmess+ws协议
|
||||
|
||||
# 生成随机UUID
|
||||
generate_uuid() {
|
||||
cat /proc/sys/kernel/random/uuid
|
||||
}
|
||||
|
||||
# 获取当前北京时间,精确到秒
|
||||
get_beijing_time() {
|
||||
TZ=Asia/Shanghai date +"%Y年%m月%d日%H点%M分%S秒"
|
||||
}
|
||||
|
||||
# 交互式输入固定的用户名和密码
|
||||
get_fixed_credentials() {
|
||||
if [[ -z "$FIXED_USERNAME" || -z "$FIXED_PASSWORD" ]]; then
|
||||
echo -e "\n\033[36m==== 设置固定的Socks5用户名和密码 ====\033[0m"
|
||||
|
||||
while [[ -z "$FIXED_USERNAME" ]]; do
|
||||
read -p "请输入Socks5用户名: " FIXED_USERNAME
|
||||
if [[ -z "$FIXED_USERNAME" ]]; then
|
||||
echo -e "\033[31m用户名不能为空,请重新输入\033[0m"
|
||||
fi
|
||||
done
|
||||
|
||||
while [[ -z "$FIXED_PASSWORD" ]]; do
|
||||
read -p "请输入Socks5密码: " FIXED_PASSWORD
|
||||
if [[ -z "$FIXED_PASSWORD" ]]; then
|
||||
echo -e "\033[31m密码不能为空,请重新输入\033[0m"
|
||||
fi
|
||||
done
|
||||
|
||||
echo -e "\033[32m已设置固定用户名: $FIXED_USERNAME\033[0m"
|
||||
echo -e "\033[32m已设置固定密码: $FIXED_PASSWORD\033[0m"
|
||||
echo -e "\033[36m=====================================\033[0m\n"
|
||||
fi
|
||||
}
|
||||
|
||||
# 全局变量,保存当前操作使用的输出文件名
|
||||
OUTPUT_FILE=""
|
||||
|
||||
# 全局变量,保存用户指定的固定用户名和密码
|
||||
FIXED_USERNAME=""
|
||||
FIXED_PASSWORD=""
|
||||
|
||||
# 初始化输出文件名
|
||||
init_output_file() {
|
||||
OUTPUT_FILE="/home/$(get_beijing_time).txt"
|
||||
# 确保文件存在并清空内容
|
||||
touch "$OUTPUT_FILE"
|
||||
> "$OUTPUT_FILE"
|
||||
echo "将使用输出文件: $OUTPUT_FILE"
|
||||
}
|
||||
|
||||
install_jq() {
|
||||
if ! command -v jq &> /dev/null; then
|
||||
echo "jq 未安装,正在安装 jq..."
|
||||
if [[ -f /etc/debian_version ]]; then
|
||||
apt update && apt install -yq jq
|
||||
elif [[ -f /etc/redhat-release ]]; then
|
||||
yum install -y epel-release jq
|
||||
else
|
||||
echo "无法确定系统发行版,请手动安装 jq。"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "jq 已安装。"
|
||||
fi
|
||||
}
|
||||
|
||||
install_xray() {
|
||||
if ! command -v xray &> /dev/null; then
|
||||
echo "Xray 未安装,正在安装 Xray..."
|
||||
if ! bash <(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh) install --version v1.8.4; then
|
||||
echo "Xray 安装失败,请检查网络连接或安装脚本。"
|
||||
exit 1
|
||||
fi
|
||||
echo "Xray 安装完成。"
|
||||
else
|
||||
echo "Xray 已安装。"
|
||||
fi
|
||||
}
|
||||
|
||||
# 检查是否已有节点配置
|
||||
check_existing_nodes() {
|
||||
local config_file="/usr/local/etc/xray/config.json"
|
||||
|
||||
# 如果配置文件不存在,则没有节点配置
|
||||
if [ ! -f "$config_file" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 检查inbounds数量是否大于0
|
||||
local inbounds_count=$(jq '.inbounds | length' "$config_file" 2>/dev/null)
|
||||
|
||||
# 如果jq命令失败或inbounds为空,则认为没有节点配置
|
||||
if [ -z "$inbounds_count" ] || [ "$inbounds_count" -eq 0 ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 有节点配置
|
||||
return 0
|
||||
}
|
||||
|
||||
get_public_ipv4() {
|
||||
ip -4 addr show | awk '/inet / {ip = $2; sub(/\/.*/, "", ip); if (ip !~ /^127\./ && ip !~ /^10\./ && ip !~ /^192\.168\./ && ip !~ /^169\.254\./ && ip !~ /^172\.(1[6-9]|2[0-9]|3[0-1])\./) print ip}'
|
||||
}
|
||||
|
||||
# 获取已配置的IP列表
|
||||
get_configured_ips() {
|
||||
local config_file="/usr/local/etc/xray/config.json"
|
||||
|
||||
if [ ! -f "$config_file" ]; then
|
||||
echo ""
|
||||
return
|
||||
fi
|
||||
|
||||
jq -r '.outbounds[] | .sendThrough' "$config_file" | sort | uniq
|
||||
}
|
||||
|
||||
print_node_info() {
|
||||
local ip=$1
|
||||
local socks_port=$2
|
||||
local vmess_port=$3
|
||||
local username=$4
|
||||
local password=$5
|
||||
local uuid=$6
|
||||
|
||||
echo -e " IP: \033[32m$ip\033[0m"
|
||||
echo -e " Socks5 端口: \033[32m$socks_port\033[0m 用户名: \033[32m$username\033[0m 密码: \033[32m$password\033[0m"
|
||||
echo -e " VMess 端口: \033[32m$vmess_port\033[0m UUID: \033[32m$uuid\033[0m"
|
||||
|
||||
# 构建vmess链接,使用IP作为备注
|
||||
local vmess_config=$(echo -n "{\"v\":\"2\",\"ps\":\"$ip\",\"add\":\"$ip\",\"port\":$vmess_port,\"id\":\"$uuid\",\"aid\":0,\"scy\":\"auto\",\"net\":\"ws\",\"type\":\"none\",\"host\":\"\",\"path\":\"/\",\"tls\":\"\",\"sni\":\"\",\"alpn\":\"\"}" | base64 -w 0)
|
||||
local vmess_link="vmess://$vmess_config"
|
||||
|
||||
# 保存节点信息到文件
|
||||
echo "$ip:$socks_port:$username:$password————$vmess_link" >> "$OUTPUT_FILE"
|
||||
echo "节点信息已保存到 $OUTPUT_FILE"
|
||||
}
|
||||
|
||||
# 导出所有节点配置
|
||||
export_all_nodes() {
|
||||
local config_file="/usr/local/etc/xray/config.json"
|
||||
|
||||
if [ ! -f "$config_file" ]; then
|
||||
echo "Xray配置文件不存在,无法导出节点信息。"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 初始化输出文件
|
||||
init_output_file
|
||||
|
||||
echo "正在导出所有节点配置到 $OUTPUT_FILE..."
|
||||
|
||||
# 获取所有Socks5节点
|
||||
local socks_nodes=$(jq -r '.inbounds[] | select(.protocol == "socks") | {port: .port, tag: .tag}' "$config_file")
|
||||
|
||||
if [ -z "$socks_nodes" ]; then
|
||||
echo "未找到任何节点配置。"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 遍历所有Socks5节点,查找对应的信息
|
||||
for row in $(jq -r '.inbounds[] | select(.protocol == "socks") | @base64' "$config_file"); do
|
||||
inbound=$(echo $row | base64 --decode)
|
||||
|
||||
local port=$(echo "$inbound" | jq -r '.port')
|
||||
local tag=$(echo "$inbound" | jq -r '.tag')
|
||||
|
||||
# 查找对应的outbound以获取IP
|
||||
local outbound_tag="out-$port"
|
||||
local ip=$(jq -r --arg tag "$outbound_tag" '.outbounds[] | select(.tag == $tag) | .sendThrough' "$config_file")
|
||||
|
||||
# 获取Socks5的用户名和密码
|
||||
local username=$(echo "$inbound" | jq -r '.settings.accounts[0].user')
|
||||
local password=$(echo "$inbound" | jq -r '.settings.accounts[0].pass')
|
||||
|
||||
# 查找相应的VMess节点
|
||||
local vmess_port=$((port + 1))
|
||||
local vmess_tag="in-$vmess_port"
|
||||
|
||||
# 获取VMess的UUID
|
||||
local uuid=$(jq -r --arg tag "$vmess_tag" '.inbounds[] | select(.tag == $tag) | .settings.clients[0].id' "$config_file")
|
||||
|
||||
if [ -n "$uuid" ]; then
|
||||
# 构建vmess链接,使用IP作为备注
|
||||
local vmess_config=$(echo -n "{\"v\":\"2\",\"ps\":\"$ip\",\"add\":\"$ip\",\"port\":$vmess_port,\"id\":\"$uuid\",\"aid\":0,\"scy\":\"auto\",\"net\":\"ws\",\"type\":\"none\",\"host\":\"\",\"path\":\"/\",\"tls\":\"\",\"sni\":\"\",\"alpn\":\"\"}" | base64 -w 0)
|
||||
local vmess_link="vmess://$vmess_config"
|
||||
|
||||
# 输出节点信息
|
||||
echo "$ip:$port:$username:$password————$vmess_link" >> "$OUTPUT_FILE"
|
||||
echo -e "已导出节点: \033[32m$ip\033[0m Socks5端口:\033[32m$port\033[0m VMess端口:\033[32m$vmess_port\033[0m"
|
||||
fi
|
||||
done
|
||||
|
||||
echo "所有节点导出完成,信息已保存到 $OUTPUT_FILE"
|
||||
return 0
|
||||
}
|
||||
|
||||
# 查找配置中未使用的端口号
|
||||
find_next_unused_port() {
|
||||
local config_file="/usr/local/etc/xray/config.json"
|
||||
|
||||
if [ ! -f "$config_file" ]; then
|
||||
echo "10001" # 如果配置文件不存在,从10001开始
|
||||
return
|
||||
fi
|
||||
|
||||
# 获取所有已使用的端口
|
||||
local used_ports=$(jq -r '.inbounds[].port' "$config_file" | sort -n)
|
||||
|
||||
if [ -z "$used_ports" ]; then
|
||||
echo "10001" # 如果没有已使用的端口,从10001开始
|
||||
return
|
||||
fi
|
||||
|
||||
# 获取最大的端口号并加1
|
||||
local max_port=$(echo "$used_ports" | tail -1)
|
||||
local next_port=$((max_port + 1))
|
||||
|
||||
# 确保端口号是奇数(用于socks5)
|
||||
if [ $((next_port % 2)) -eq 0 ]; then
|
||||
next_port=$((next_port + 1))
|
||||
fi
|
||||
|
||||
echo "$next_port"
|
||||
}
|
||||
|
||||
# 添加新节点(只添加未配置的IP)
|
||||
add_new_nodes() {
|
||||
# 获取当前系统的所有公网IP
|
||||
public_ips=($(get_public_ipv4))
|
||||
|
||||
if [[ ${#public_ips[@]} -eq 0 ]]; then
|
||||
echo "未找到公网IP地址,退出..."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 获取已经配置的IP列表
|
||||
configured_ips=($(get_configured_ips))
|
||||
|
||||
# 初始化新IP列表
|
||||
new_ips=()
|
||||
|
||||
# 比对IP,找出未配置的IP
|
||||
for ip in "${public_ips[@]}"; do
|
||||
is_configured=false
|
||||
for configured_ip in "${configured_ips[@]}"; do
|
||||
if [[ "$ip" == "$configured_ip" ]]; then
|
||||
is_configured=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if ! $is_configured; then
|
||||
new_ips+=("$ip")
|
||||
fi
|
||||
done
|
||||
|
||||
# 检查是否有新的IP需要配置
|
||||
if [[ ${#new_ips[@]} -eq 0 ]]; then
|
||||
echo "所有IP都已配置,无需添加新节点。"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "发现 ${#new_ips[@]} 个未配置的IP: ${new_ips[@]}"
|
||||
|
||||
# 获取固定的用户名和密码
|
||||
get_fixed_credentials
|
||||
|
||||
# 初始化输出文件
|
||||
init_output_file
|
||||
|
||||
# 获取配置文件路径
|
||||
config_file="/usr/local/etc/xray/config.json"
|
||||
|
||||
# 如果配置文件不存在,创建基础配置
|
||||
if [ ! -f "$config_file" ]; then
|
||||
cat > $config_file <<EOF
|
||||
{
|
||||
"inbounds": [],
|
||||
"outbounds": [],
|
||||
"routing": {
|
||||
"rules": []
|
||||
}
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
|
||||
# 获取下一个可用的端口
|
||||
socks_port=$(find_next_unused_port)
|
||||
|
||||
echo "将从端口 $socks_port 开始配置新节点"
|
||||
|
||||
# 为每个新IP配置节点
|
||||
for ip in "${new_ips[@]}"; do
|
||||
echo "正在配置 IP: $ip"
|
||||
|
||||
# Socks5配置 (奇数端口) - 使用固定用户名密码
|
||||
username="$FIXED_USERNAME"
|
||||
password="$FIXED_PASSWORD"
|
||||
|
||||
# VMess配置 (偶数端口)
|
||||
vmess_port=$((socks_port + 1))
|
||||
uuid=$(generate_uuid)
|
||||
|
||||
# 添加Socks5配置
|
||||
jq --argjson port "$socks_port" --arg ip "$ip" --arg username "$username" --arg password "$password" '.inbounds += [{
|
||||
"port": $port,
|
||||
"protocol": "socks",
|
||||
"settings": {
|
||||
"auth": "password",
|
||||
"accounts": [{
|
||||
"user": $username,
|
||||
"pass": $password
|
||||
}],
|
||||
"udp": true,
|
||||
"ip": "0.0.0.0"
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp"
|
||||
},
|
||||
"tag": ("in-\($port)")
|
||||
}] | .outbounds += [{
|
||||
"protocol": "freedom",
|
||||
"settings": {},
|
||||
"sendThrough": $ip,
|
||||
"tag": ("out-\($port)")
|
||||
}] | .routing.rules += [{
|
||||
"type": "field",
|
||||
"inboundTag": ["in-\($port)"],
|
||||
"outboundTag": "out-\($port)"
|
||||
}]' "$config_file" > temp.json && mv temp.json "$config_file"
|
||||
|
||||
# 添加VMess配置
|
||||
jq --argjson port "$vmess_port" --arg ip "$ip" --arg uuid "$uuid" '.inbounds += [{
|
||||
"port": $port,
|
||||
"protocol": "vmess",
|
||||
"settings": {
|
||||
"clients": [{
|
||||
"id": $uuid,
|
||||
"level": 0,
|
||||
"security": "auto"
|
||||
}]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "ws",
|
||||
"wsSettings": {
|
||||
"path": "/"
|
||||
}
|
||||
},
|
||||
"tag": ("in-\($port)")
|
||||
}] | .outbounds += [{
|
||||
"protocol": "freedom",
|
||||
"settings": {},
|
||||
"sendThrough": $ip,
|
||||
"tag": ("out-\($port)")
|
||||
}] | .routing.rules += [{
|
||||
"type": "field",
|
||||
"inboundTag": ["in-\($port)"],
|
||||
"outboundTag": "out-\($port)"
|
||||
}]' "$config_file" > temp.json && mv temp.json "$config_file"
|
||||
|
||||
# 输出节点信息
|
||||
print_node_info "$ip" "$socks_port" "$vmess_port" "$username" "$password" "$uuid"
|
||||
|
||||
# 增加端口号,为下一个IP准备
|
||||
socks_port=$((vmess_port + 1))
|
||||
done
|
||||
|
||||
echo "新节点配置完成,共添加了 ${#new_ips[@]} 个节点"
|
||||
return 0
|
||||
}
|
||||
|
||||
configure_xray() {
|
||||
public_ips=($(get_public_ipv4))
|
||||
|
||||
if [[ ${#public_ips[@]} -eq 0 ]]; then
|
||||
echo "未找到额外IP地址,退出..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "找到的公网 IPv4 地址: ${public_ips[@]}"
|
||||
|
||||
# 获取固定的用户名和密码
|
||||
get_fixed_credentials
|
||||
|
||||
# 初始化输出文件
|
||||
init_output_file
|
||||
|
||||
config_file="/usr/local/etc/xray/config.json"
|
||||
|
||||
# 创建基础配置文件
|
||||
cat > $config_file <<EOF
|
||||
{
|
||||
"inbounds": [],
|
||||
"outbounds": [],
|
||||
"routing": {
|
||||
"rules": []
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# 初始端口
|
||||
socks_port=10001
|
||||
|
||||
# 配置 inbounds 和 outbounds
|
||||
for ip in "${public_ips[@]}"; do
|
||||
echo "正在配置 IP: $ip"
|
||||
|
||||
# Socks5配置 (奇数端口) - 使用固定用户名密码
|
||||
username="$FIXED_USERNAME"
|
||||
password="$FIXED_PASSWORD"
|
||||
|
||||
# VMess配置 (偶数端口)
|
||||
vmess_port=$((socks_port + 1))
|
||||
uuid=$(generate_uuid)
|
||||
|
||||
# 添加Socks5配置
|
||||
jq --argjson port "$socks_port" --arg ip "$ip" --arg username "$username" --arg password "$password" '.inbounds += [{
|
||||
"port": $port,
|
||||
"protocol": "socks",
|
||||
"settings": {
|
||||
"auth": "password",
|
||||
"accounts": [{
|
||||
"user": $username,
|
||||
"pass": $password
|
||||
}],
|
||||
"udp": true,
|
||||
"ip": "0.0.0.0"
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp"
|
||||
},
|
||||
"tag": ("in-\($port)")
|
||||
}] | .outbounds += [{
|
||||
"protocol": "freedom",
|
||||
"settings": {},
|
||||
"sendThrough": $ip,
|
||||
"tag": ("out-\($port)")
|
||||
}] | .routing.rules += [{
|
||||
"type": "field",
|
||||
"inboundTag": ["in-\($port)"],
|
||||
"outboundTag": "out-\($port)"
|
||||
}]' "$config_file" > temp.json && mv temp.json "$config_file"
|
||||
|
||||
# 添加VMess配置
|
||||
jq --argjson port "$vmess_port" --arg ip "$ip" --arg uuid "$uuid" '.inbounds += [{
|
||||
"port": $port,
|
||||
"protocol": "vmess",
|
||||
"settings": {
|
||||
"clients": [{
|
||||
"id": $uuid,
|
||||
"level": 0,
|
||||
"security": "auto"
|
||||
}]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "ws",
|
||||
"wsSettings": {
|
||||
"path": "/"
|
||||
}
|
||||
},
|
||||
"tag": ("in-\($port)")
|
||||
}] | .outbounds += [{
|
||||
"protocol": "freedom",
|
||||
"settings": {},
|
||||
"sendThrough": $ip,
|
||||
"tag": ("out-\($port)")
|
||||
}] | .routing.rules += [{
|
||||
"type": "field",
|
||||
"inboundTag": ["in-\($port)"],
|
||||
"outboundTag": "out-\($port)"
|
||||
}]' "$config_file" > temp.json && mv temp.json "$config_file"
|
||||
|
||||
# 输出节点信息
|
||||
print_node_info "$ip" "$socks_port" "$vmess_port" "$username" "$password" "$uuid"
|
||||
|
||||
# 增加端口号,为下一个IP准备
|
||||
socks_port=$((vmess_port + 1))
|
||||
done
|
||||
|
||||
echo "Xray 配置完成。"
|
||||
}
|
||||
|
||||
modify_by_ip() {
|
||||
local modify_file="/home/xiugai.txt"
|
||||
|
||||
if [ ! -f "$modify_file" ]; then
|
||||
echo "修改文件 $modify_file 不存在,跳过修改操作。"
|
||||
return
|
||||
fi
|
||||
|
||||
echo "检测到修改文件,开始根据IP修改节点..."
|
||||
|
||||
# 读取当前配置
|
||||
local config_file="/usr/local/etc/xray/config.json"
|
||||
if [ ! -f "$config_file" ]; then
|
||||
echo "Xray配置文件不存在,请先配置Xray。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 获取固定的用户名和密码
|
||||
get_fixed_credentials
|
||||
|
||||
# 初始化输出文件
|
||||
init_output_file
|
||||
|
||||
local modify_success=false
|
||||
|
||||
# 逐行读取修改文件中的IP
|
||||
while IFS= read -r ip || [[ -n "$ip" ]]; do
|
||||
# 跳过空行和注释行
|
||||
[[ -z "$ip" || "$ip" =~ ^# ]] && continue
|
||||
|
||||
echo "正在处理IP: $ip"
|
||||
|
||||
# 查找此IP对应的出站配置
|
||||
local ip_exists=$(jq --arg ip "$ip" '.outbounds[] | select(.sendThrough == $ip) | .tag' "$config_file")
|
||||
|
||||
if [[ -z "$ip_exists" ]]; then
|
||||
echo "错误: IP $ip 在当前配置中未找到,停止脚本执行。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 找到对应的入站端口和标签
|
||||
local outbound_tags=$(jq -r --arg ip "$ip" '.outbounds[] | select(.sendThrough == $ip) | .tag' "$config_file")
|
||||
|
||||
for outbound_tag in $outbound_tags; do
|
||||
local port=$(echo $outbound_tag | cut -d'-' -f2)
|
||||
local inbound_tag="in-$port"
|
||||
|
||||
# 检查协议类型
|
||||
local protocol=$(jq -r --arg tag "$inbound_tag" '.inbounds[] | select(.tag == $tag) | .protocol' "$config_file")
|
||||
|
||||
if [[ "$protocol" == "socks" ]]; then
|
||||
# 更新socks协议的用户名和密码 - 使用固定用户名密码
|
||||
local username="$FIXED_USERNAME"
|
||||
local password="$FIXED_PASSWORD"
|
||||
|
||||
jq --arg tag "$inbound_tag" --arg username "$username" --arg password "$password" '
|
||||
.inbounds[] |= if .tag == $tag then
|
||||
.settings.accounts[0].user = $username |
|
||||
.settings.accounts[0].pass = $password
|
||||
else . end' "$config_file" > temp.json && mv temp.json "$config_file"
|
||||
|
||||
# 找到对应的vmess端口
|
||||
local vmess_port=$((port + 1))
|
||||
local vmess_tag="in-$vmess_port"
|
||||
|
||||
# 确认vmess端口存在
|
||||
local vmess_exists=$(jq --arg tag "$vmess_tag" '.inbounds[] | select(.tag == $tag) | .tag' "$config_file")
|
||||
|
||||
# 如果存在,更新vmess协议的UUID
|
||||
if [[ -n "$vmess_exists" ]]; then
|
||||
local uuid=$(generate_uuid)
|
||||
|
||||
jq --arg tag "$vmess_tag" --arg uuid "$uuid" '
|
||||
.inbounds[] |= if .tag == $tag then
|
||||
.settings.clients[0].id = $uuid
|
||||
else . end' "$config_file" > temp.json && mv temp.json "$config_file"
|
||||
|
||||
# 构建vmess链接,使用IP作为备注
|
||||
local vmess_config=$(echo -n "{\"v\":\"2\",\"ps\":\"$ip\",\"add\":\"$ip\",\"port\":$vmess_port,\"id\":\"$uuid\",\"aid\":0,\"scy\":\"auto\",\"net\":\"ws\",\"type\":\"none\",\"host\":\"\",\"path\":\"/\",\"tls\":\"\",\"sni\":\"\",\"alpn\":\"\"}" | base64 -w 0)
|
||||
local vmess_link="vmess://$vmess_config"
|
||||
|
||||
# 保存修改后的节点信息
|
||||
echo "$ip:$port:$username:$password————$vmess_link" >> "$OUTPUT_FILE"
|
||||
|
||||
echo "已修改 IP: $ip 的Socks5(端口:$port)和VMess(端口:$vmess_port)配置"
|
||||
modify_success=true
|
||||
else
|
||||
echo "警告: 未找到IP $ip 对应的VMess配置"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done < "$modify_file"
|
||||
|
||||
if $modify_success; then
|
||||
echo "节点修改完成,信息已保存到 $OUTPUT_FILE"
|
||||
else
|
||||
echo "未进行任何修改"
|
||||
fi
|
||||
}
|
||||
|
||||
restart_xray() {
|
||||
echo "正在重启 Xray 服务..."
|
||||
if ! systemctl restart xray; then
|
||||
echo "Xray 服务重启失败,请检查配置文件。"
|
||||
exit 1
|
||||
fi
|
||||
systemctl enable xray
|
||||
echo "Xray 服务已重启。"
|
||||
}
|
||||
|
||||
# 显示交互式菜单
|
||||
show_menu() {
|
||||
echo -e "\n\033[36m==== 站群多IP节点管理菜单 ====\033[0m"
|
||||
echo -e "\033[33m1. 部署节点(首次部署)\033[0m"
|
||||
echo -e "\033[33m2. 修改节点\033[0m"
|
||||
echo -e "\033[33m3. 导出所有节点\033[0m"
|
||||
echo -e "\033[33m4. 新增节点(自动添加未配置的IP)\033[0m"
|
||||
echo -e "\033[33m0. 退出\033[0m"
|
||||
echo -e "\033[36m==========================\033[0m"
|
||||
|
||||
read -p "请输入选项 [0-4]: " choice
|
||||
|
||||
case $choice in
|
||||
1)
|
||||
if check_existing_nodes; then
|
||||
echo -e "\033[31m警告: 检测到已有节点配置!\033[0m"
|
||||
echo -e "\033[31m选择此选项将会清空所有现有节点并重新部署所有IP的节点\033[0m"
|
||||
echo -e "\033[31m如果您只想添加新的IP节点,请使用选项4\033[0m"
|
||||
read -p "是否确认清空所有节点并重新部署? (y/n): " confirm
|
||||
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
|
||||
echo "已取消操作"
|
||||
show_menu
|
||||
return
|
||||
fi
|
||||
fi
|
||||
configure_xray
|
||||
restart_xray
|
||||
echo "节点部署完成"
|
||||
;;
|
||||
2)
|
||||
echo "请确保 /home/xiugai.txt 文件中包含需要修改的IP地址列表,每行一个IP"
|
||||
read -p "是否继续修改? (y/n): " confirm
|
||||
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
|
||||
modify_by_ip
|
||||
restart_xray
|
||||
echo "节点修改完成"
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
export_all_nodes
|
||||
;;
|
||||
4)
|
||||
add_new_nodes
|
||||
if [ $? -eq 0 ]; then
|
||||
restart_xray
|
||||
echo "新节点添加完成"
|
||||
fi
|
||||
;;
|
||||
0)
|
||||
echo "退出程序"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "无效选项,请重新选择"
|
||||
show_menu
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
# 检查是否已有节点配置
|
||||
if check_existing_nodes; then
|
||||
echo "检测到已有节点配置,跳过依赖安装..."
|
||||
show_menu
|
||||
else
|
||||
echo "未检测到节点配置,开始安装必要依赖..."
|
||||
install_jq
|
||||
install_xray
|
||||
show_menu
|
||||
fi
|
||||
}
|
||||
|
||||
main
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/bin/bash
|
||||
# 单IP快速批量搭建二级代理vmess入socks出
|
||||
|
||||
red='\e[31m'
|
||||
yellow='\e[33m'
|
||||
@@ -243,7 +244,7 @@ delete_node_by_port() {
|
||||
# 主菜单
|
||||
main_menu() {
|
||||
while true; do
|
||||
echo -e "\n${green}sky22333-快速批量搭建二级代理脚本-管理菜单:${none}"
|
||||
echo -e "\n${green}快速批量搭建二级代理脚本-管理菜单:${none}"
|
||||
echo "1. 查看所有节点"
|
||||
echo "2. 新增vmess入站sk5出站"
|
||||
echo "3. 删除节点"
|
||||
|
||||
Reference in New Issue
Block a user