上传文件至 /
This commit is contained in:
80
banwagong.sh
Normal file
80
banwagong.sh
Normal 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
273
docker.sh
Normal 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
232
swap.sh
Normal 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
1223
system_manager.sh
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user