上传文件至 /

This commit is contained in:
2025-09-14 17:34:24 +08:00
commit edf912c01e
4 changed files with 1808 additions and 0 deletions

80
banwagong.sh Normal file
View File

@@ -0,0 +1,80 @@
#!/bin/bash
SERVER_FILE="servers.txt"
function list_servers() {
if [[ ! -f $SERVER_FILE ]]; then
echo "暂无服务器,请先添加。"
return
fi
i=0
while IFS=, read -r name veid api_key; do
((i++))
url="https://api.64clouds.com/v1/getLiveServiceInfo?veid=$veid&api_key=$api_key"
resp=$(curl -s "$url")
total=$(echo "$resp" | jq '.plan_monthly_data // 0')
used=$(echo "$resp" | jq '.data_counter // 0')
ip=$(echo "$resp" | jq -r '.ip_addresses // "未知"')
reset=$(echo "$resp" | jq '.data_next_reset // empty')
if [[ -n $reset ]]; then
reset_date=$(date -r "$reset" "+%Y-%m-%d %H:%M")
else
reset_date="未知"
fi
total_gb=$(awk "BEGIN{printf \"%.2f\", $total/1024/1024/1024}")
remain_gb=$(awk "BEGIN{printf \"%.2f\", ($total-$used)/1024/1024/1024}")
echo "$i. $name"
echo " IP: $ip"
echo " 总流量: $total_gb GB"
echo " 剩余流量: $remain_gb GB"
echo " 重置日期: $reset_date"
echo "-----------------------------"
done < "$SERVER_FILE"
}
function add_server() {
read -p "服务器名称: " name
read -p "VEID: " veid
read -p "API Key: " api_key
echo "$name,$veid,$api_key" >> "$SERVER_FILE"
echo "添加成功。"
}
function delete_server() {
list_servers
read -p "输入要删除的序号: " idx
sed -i '' "${idx}d" "$SERVER_FILE"
echo "已删除。"
}
function edit_server() {
list_servers
read -p "输入要编辑的序号: " idx
sed -n "${idx}p" "$SERVER_FILE"
read -p "新服务器名称: " name
read -p "新VEID: " veid
read -p "新API Key: " api_key
sed -i '' "${idx}s/.*/$name,$veid,$api_key/" "$SERVER_FILE"
echo "已更新。"
}
function menu() {
echo "1. 查看服务器流量"
echo "2. 添加服务器"
echo "3. 删除服务器"
echo "4. 编辑服务器"
echo "0. 退出"
read -p "选择操作: " op
case $op in
1) list_servers ;;
2) add_server ;;
3) delete_server ;;
4) edit_server ;;
0) exit 0 ;;
*) echo "无效选项" ;;
esac
}
while true; do
menu
done

273
docker.sh Normal file
View File

@@ -0,0 +1,273 @@
#!/bin/env bash
# Docker 安装脚本
# 支持中国大陆和海外环境
set -euo pipefail
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly LOG_FILE="${SCRIPT_DIR}/docker_install.log"
readonly DAEMON_JSON="/etc/docker/daemon.json"
readonly BACKUP_FILE="${DAEMON_JSON}.backup"
# 颜色定义
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly NC='\033[0m' # No Color
# 日志函数
log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
}
log_info() {
echo -e "${BLUE}[INFO]${NC} $1" | tee -a "$LOG_FILE"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1" | tee -a "$LOG_FILE"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE"
}
# 检测地区
detect_region() {
local country
country=$(curl -s --connect-timeout 5 --max-time 10 ipinfo.io/country 2>/dev/null || echo "")
[[ "$country" == "CN" ]]
}
# 检查Docker版本
check_docker_version() {
if ! command -v docker &>/dev/null; then
return 1
fi
local version
version=$(docker --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+' | head -n1)
local major="${version%%.*}"
if [[ ${major:-0} -lt 20 ]]; then
log_warn "Docker版本过低 (${version})建议升级到20.x或更高版本"
else
log_info "检测到Docker版本: ${version}"
fi
return 0
}
# 创建daemon.json配置
create_daemon_json() {
local accelerator_url="${1:-}"
if [[ -n "$accelerator_url" ]]; then
log_info "配置Docker镜像加速器: $accelerator_url"
cat > "$DAEMON_JSON" << EOF
{
"registry-mirrors": ["$accelerator_url"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
EOF
else
cat > "$DAEMON_JSON" << EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
EOF
fi
}
# 配置加速器
configure_accelerator() {
if ! detect_region; then
log_info "非中国大陆地区,跳过镜像加速器配置"
return 0
fi
echo -n "是否配置Docker镜像加速器(y/N): "
read -r choice
case "$choice" in
[yY]|[yY][eE][sS])
local accelerator_url=""
# 测试腾讯云镜像可用性
if ping -c 1 -W 3 mirror.ccs.tencentyun.com &>/dev/null; then
accelerator_url="https://mirror.ccs.tencentyun.com"
else
# 备选阿里云镜像
accelerator_url="https://registry.cn-hangzhou.aliyuncs.com"
fi
# 备份现有配置
[[ -f "$DAEMON_JSON" ]] && cp "$DAEMON_JSON" "$BACKUP_FILE"
# 创建配置目录
mkdir -p "$(dirname "$DAEMON_JSON")"
# 创建新配置
create_daemon_json "$accelerator_url"
# 重启Docker服务
log_info "重启Docker服务..."
systemctl daemon-reload
systemctl restart docker
log "Docker镜像加速器配置完成"
;;
*)
log_info "跳过镜像加速器配置"
;;
esac
}
# 获取最快的Docker安装源
get_fastest_source() {
local sources=(
"https://mirrors.aliyun.com/docker-ce"
"https://mirrors.tencent.com/docker-ce"
"https://mirrors.163.com/docker-ce"
)
local fastest_source="${sources[0]}"
local min_time=99999
for source in "${sources[@]}"; do
local response_time
response_time=$(curl -o /dev/null -s -w '%{time_total}\n' -m 3 "$source" 2>/dev/null || echo "99999")
if (( $(echo "$response_time < $min_time" | bc -l 2>/dev/null || echo 0) )); then
min_time=$response_time
fastest_source=$source
fi
done
echo "$fastest_source"
}
# 下载Docker安装脚本
download_docker_script() {
local scripts=(
"https://get.docker.com"
"https://cdn.jsdelivr.net/gh/docker/docker-install@master/install.sh"
"https://fastly.jsdelivr.net/gh/docker/docker-install@master/install.sh"
)
for script_url in "${scripts[@]}"; do
log_info "尝试从 $script_url 下载安装脚本..."
if curl -fsSL --connect-timeout 10 --max-time 30 "$script_url" -o get-docker.sh; then
log "下载成功: $script_url"
return 0
else
log_warn "下载失败: $script_url"
fi
done
log_error "所有下载尝试均失败"
return 1
}
# 安装Docker
install_docker() {
log_info "开始安装Docker..."
if detect_region; then
log_info "检测到中国大陆地区,使用国内镜像源"
local fastest_source
fastest_source=$(get_fastest_source)
export DOWNLOAD_URL="$fastest_source"
log_info "选择最快源: $fastest_source"
else
log_info "使用官方源"
export DOWNLOAD_URL="https://download.docker.com"
fi
# 下载安装脚本
if ! download_docker_script; then
log_error "无法下载Docker安装脚本"
return 1
fi
# 执行安装
log_info "执行Docker安装..."
if sh get-docker.sh 2>&1 | tee -a "$LOG_FILE"; then
log "Docker安装成功"
else
log_error "Docker安装失败"
return 1
fi
# 清理安装脚本
rm -f get-docker.sh
# 启动并启用Docker服务
log_info "启动Docker服务..."
systemctl enable docker
systemctl start docker
# 验证安装
if docker --version &>/dev/null; then
log "Docker安装验证成功"
docker --version | tee -a "$LOG_FILE"
return 0
else
log_error "Docker安装验证失败"
return 1
fi
}
# 主函数
main() {
log "开始Docker安装检查..."
# 检查是否已安装Docker
if check_docker_version; then
log_info "Docker已安装"
configure_accelerator
return 0
fi
# 确认安装
echo -n "Docker未安装是否现在安装(y/N): "
read -r install_choice
case "$install_choice" in
[yY]|[yY][eE][sS])
if install_docker; then
configure_accelerator
log "Docker安装和配置完成"
else
log_error "Docker安装失败请检查日志: $LOG_FILE"
exit 1
fi
;;
*)
log_info "取消安装"
exit 0
;;
esac
}
# 检查root权限
if [[ $EUID -ne 0 ]]; then
log_error "此脚本需要root权限运行"
exit 1
fi
# 执行主函数
main "$@"

232
swap.sh Normal file
View File

@@ -0,0 +1,232 @@
#!/usr/bin/env bash
# Linux 交换文件管理脚本
# 描述: 在 Linux VPS 上添加或删除交换文件
set -euo pipefail # 遇到错误、未定义变量、管道失败时退出
# 颜色定义
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly NC='\033[0m' # 无颜色
# 配置项
readonly SWAPFILE="/swapfile"
readonly SCRIPT_NAME="$(basename "$0")"
# 日志输出函数
log_info() {
echo -e "${GREEN}[信息]${NC} $*"
}
log_warn() {
echo -e "${YELLOW}[警告]${NC} $*"
}
log_error() {
echo -e "${RED}[错误]${NC} $*" >&2
}
# 检查是否以 root 权限运行
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "此脚本必须以 root 权限运行!"
log_info "请使用: sudo $SCRIPT_NAME"
exit 1
fi
}
# 检查系统是否支持交换文件(非 OpenVZ
check_virtualization() {
if [[ -d "/proc/vz" ]] && [[ ! -d "/proc/bc" ]]; then
log_error "OpenVZ 容器不支持交换文件!"
exit 1
fi
}
# 验证交换文件大小输入
validate_swap_size() {
local size="$1"
if ! [[ "$size" =~ ^[0-9]+$ ]] || [[ "$size" -lt 64 ]]; then
log_error "无效的交换文件大小。必须是数字且 >= 64 MB"
return 1
fi
# 检查可用磁盘空间
local available_space
available_space=$(df / | awk 'NR==2 {print int($4/1024)}')
if [[ "$size" -gt "$available_space" ]]; then
log_error "磁盘空间不足。可用: ${available_space}MB需要: ${size}MB"
return 1
fi
return 0
}
# 获取系统内存大小
get_memory_size() {
awk '/MemTotal/ {print int($2/1024)}' /proc/meminfo
}
# 检查交换文件是否已存在
swap_exists() {
grep -q "$SWAPFILE" /etc/fstab 2>/dev/null
}
# 显示当前交换文件信息
show_swap_info() {
log_info "当前交换文件信息:"
if [[ -f /proc/swaps ]]; then
cat /proc/swaps
fi
echo
grep "Swap" /proc/meminfo || true
}
# 添加交换文件
add_swap() {
if swap_exists; then
log_error "交换文件已存在!"
log_info "请先使用选项 2 删除现有的交换文件"
return 1
fi
local memory_mb
memory_mb=$(get_memory_size)
local suggested_size=$((memory_mb * 2))
echo
log_info "当前系统内存: ${memory_mb}MB"
log_info "建议交换文件大小: ${suggested_size}MB (内存的2倍)"
echo
read -rp "请输入交换文件大小MB直接回车使用建议值 ${suggested_size}MB: " swap_size
swap_size=${swap_size:-$suggested_size}
if ! validate_swap_size "$swap_size"; then
return 1
fi
log_info "正在创建 ${swap_size}MB 交换文件..."
# 使用更高效的方式创建交换文件
if command -v fallocate >/dev/null 2>&1; then
fallocate -l "${swap_size}M" "$SWAPFILE"
else
dd if=/dev/zero of="$SWAPFILE" bs=1M count="$swap_size" status=progress
fi
# 设置正确的权限
chmod 600 "$SWAPFILE"
# 设置交换文件
mkswap "$SWAPFILE"
swapon "$SWAPFILE"
# 添加到 fstab 以实现持久化
echo "$SWAPFILE none swap sw 0 0" >> /etc/fstab
log_info "交换文件创建成功!"
echo
show_swap_info
}
# 删除交换文件
remove_swap() {
if ! swap_exists; then
log_warn "未找到需要删除的交换文件"
return 0
fi
log_info "正在删除交换文件..."
# 关闭交换
if swapon --show | grep -q "$SWAPFILE"; then
swapoff "$SWAPFILE"
fi
# 从 fstab 中移除
if grep -q "$SWAPFILE" /etc/fstab; then
sed -i "\|$SWAPFILE|d" /etc/fstab
fi
# 删除交换文件
if [[ -f "$SWAPFILE" ]]; then
rm -f "$SWAPFILE"
fi
# 清理缓存
sync
echo 3 > /proc/sys/vm/drop_caches 2>/dev/null || true
log_info "交换文件删除成功!"
echo
show_swap_info
}
# 显示菜单
show_menu() {
clear
cat << 'EOF'
╔══════════════════════════════════════╗
║ Linux 交换文件管理 ║
╠══════════════════════════════════════╣
║ 1. 添加交换文件 ║
║ 2. 删除交换文件 ║
║ 3. 显示交换文件信息 ║
║ 4. 退出程序 ║
╚══════════════════════════════════════╝
EOF
echo
}
# 主菜单循环
main_menu() {
while true; do
show_menu
read -rp "请选择操作 [1-4]: " choice
echo
case "$choice" in
1)
add_swap
;;
2)
remove_swap
;;
3)
show_swap_info
;;
4)
log_info "再见!"
exit 0
;;
*)
log_error "无效选择。请输入 1-4"
sleep 2
continue
;;
esac
echo
read -rp "按回车键继续..."
done
}
# 主函数
main() {
# 执行系统检查
check_root
check_virtualization
# 启动主菜单
main_menu
}
# 脚本入口点
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi

1223
system_manager.sh Normal file

File diff suppressed because it is too large Load Diff