上传文件至 /
This commit is contained in:
commit
31a98c30e9
259
vps_setup.sh
Normal file
259
vps_setup.sh
Normal file
@ -0,0 +1,259 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 设置变量
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
REPO_ROOT="$SCRIPT_DIR"
|
||||||
|
|
||||||
|
# 安全配置函数
|
||||||
|
setup_security() {
|
||||||
|
echo "配置系统安全..."
|
||||||
|
setup_ssh_keys
|
||||||
|
configure_ssh
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_ssh_keys() {
|
||||||
|
echo "配置 SSH 密钥..."
|
||||||
|
current_user=$SUDO_USER
|
||||||
|
if [ -z "$current_user" ]; then
|
||||||
|
current_user=$(whoami)
|
||||||
|
fi
|
||||||
|
|
||||||
|
user_home=$(eval echo ~${current_user})
|
||||||
|
ssh_dir="${user_home}/.ssh"
|
||||||
|
|
||||||
|
mkdir -p "$ssh_dir"
|
||||||
|
chmod 700 "$ssh_dir"
|
||||||
|
|
||||||
|
# 直接写入 SSH 公钥
|
||||||
|
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHzjJhJfSVQ0BMgjXsdSTLtmjna7bfWobvlEsQDEXYSFKYsrcHQoOYu6Yblst/190WLgP3wL1zr12Q5WuzUR303dWTAweYrqta7bzTNWS4vTt0a5jhTqvfPaB2hniQW3aghec+ryFQ7i4Ev3NfmAhv7jNsYS4j9pgnmcE4JZE//vogUVmxNfKBFZAlQ9hmygAQ56Xk+ITgswQYtkT+a38EBUwxAaCyKJDnN6rHRFBQ9XSH+YlMFtPfAyhR5ThvuqsDnf2M9481i7tmQmD2STg6Ll2+oJZLYXqH+fy554G0d8mVa9Vf5wZuUQTrbVEH/EkYmxMoRZJJCIFcEptLtF33 cc@DESKTOP-68E0GFD" > "${ssh_dir}/authorized_keys"
|
||||||
|
|
||||||
|
chmod 600 "${ssh_dir}/authorized_keys"
|
||||||
|
chown -R ${current_user}:${current_user} "$ssh_dir"
|
||||||
|
|
||||||
|
if ! grep -qE "^(ssh-rsa|ssh-ed25519)" "${ssh_dir}/authorized_keys"; then
|
||||||
|
echo "警告:公钥格式可能不正确"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "SSH 密钥配置完成"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_ssh() {
|
||||||
|
echo "配置 SSH 安全设置..."
|
||||||
|
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
|
||||||
|
sed -i 's/#Port 22/Port 44444/' /etc/ssh/sshd_config
|
||||||
|
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
|
||||||
|
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
|
||||||
|
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
|
||||||
|
systemctl restart sshd
|
||||||
|
echo "SSH 配置完成:端口 44444,已禁用密码登录,已启用公钥认证"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 软件包安装函数
|
||||||
|
install_packages() {
|
||||||
|
echo "开始系统配置..."
|
||||||
|
pacman -Syu --noconfirm
|
||||||
|
pacman -S --noconfirm vim fish lsof net-tools btop
|
||||||
|
ln -s /usr/bin/vim /usr/bin/vi
|
||||||
|
chsh -s /usr/bin/fish
|
||||||
|
|
||||||
|
echo "安装 Docker..."
|
||||||
|
pacman -S --noconfirm docker docker-compose
|
||||||
|
systemctl enable docker
|
||||||
|
systemctl start docker
|
||||||
|
|
||||||
|
echo "配置 sing-box docker..."
|
||||||
|
mkdir -p /etc/sing-box/
|
||||||
|
|
||||||
|
echo '{
|
||||||
|
"log": {
|
||||||
|
"level": "info"
|
||||||
|
},
|
||||||
|
"dns": {
|
||||||
|
"servers": [
|
||||||
|
{
|
||||||
|
"address": "tls://8.8.8.8"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"inbounds": [
|
||||||
|
{
|
||||||
|
"type": "naive",
|
||||||
|
"listen": "::",
|
||||||
|
"listen_port": 56789,
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"Username": "admin",
|
||||||
|
"Password": "1qaz2wsx"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tls": {
|
||||||
|
"enabled": true,
|
||||||
|
"acme": {
|
||||||
|
"domain": "qqqqqq",
|
||||||
|
"email": "admin@notko.top"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hysteria2",
|
||||||
|
"listen": "::",
|
||||||
|
"listen_port": 50000,
|
||||||
|
"up_mbps": 100,
|
||||||
|
"down_mbps": 30,
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"name": "admin",
|
||||||
|
"password": "1qaz2wsx"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tls": {
|
||||||
|
"enabled": true,
|
||||||
|
"server_name": "qqqqqq",
|
||||||
|
"acme": {
|
||||||
|
"domain": "qqqqqq",
|
||||||
|
"email": "admin@notko.top"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outbounds": [
|
||||||
|
{
|
||||||
|
"type": "direct"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "dns",
|
||||||
|
"tag": "dns-out"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"route": {
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"protocol": "dns",
|
||||||
|
"outbound": "dns-out"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}' > /etc/sing-box/config.json
|
||||||
|
sed -i "s/qqqqqq/$hostname/g" /etc/sing-box/config.json
|
||||||
|
|
||||||
|
docker run -d \
|
||||||
|
-v /etc/sing-box:/etc/sing-box/ \
|
||||||
|
--name=sing-box \
|
||||||
|
--network=host \
|
||||||
|
--restart=always \
|
||||||
|
ghcr.io/sagernet/sing-box \
|
||||||
|
-D /var/lib/sing-box \
|
||||||
|
-C /etc/sing-box/ run
|
||||||
|
}
|
||||||
|
|
||||||
|
# Arch Linux 安装函数
|
||||||
|
install_arch() {
|
||||||
|
echo "开始安装 Arch Linux..."
|
||||||
|
if [ "$(id -u)" != "0" ]; then
|
||||||
|
echo "此脚本需要 root 权限运行"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检测系统发行版并安装依赖
|
||||||
|
if [ -f /etc/os-release ]; then
|
||||||
|
. /etc/os-release
|
||||||
|
case $ID in
|
||||||
|
debian|ubuntu)
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y curl zstd
|
||||||
|
;;
|
||||||
|
centos|rhel|fedora)
|
||||||
|
yum install -y curl zstd
|
||||||
|
;;
|
||||||
|
alpine)
|
||||||
|
apk add --no-cache curl zstd
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "未知的发行版,请手动安装 curl 和 zstd"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
echo "无法检测系统发行版"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl -L https://gitlab.com/drizzt/vps2arch/-/raw/master/vps2arch -o /tmp/vps2arch
|
||||||
|
chmod +x /tmp/vps2arch
|
||||||
|
/tmp/vps2arch
|
||||||
|
echo "Arch Linux 安装完成,系统将重启..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# 帮助信息
|
||||||
|
usage() {
|
||||||
|
echo "用法: $0 [-h] [-m MODE] [-n HOSTNAME]"
|
||||||
|
echo "选项:"
|
||||||
|
echo " -h 显示此帮助信息"
|
||||||
|
echo " -m MODE 指定运行模式:"
|
||||||
|
echo " init - 初始化现有系统"
|
||||||
|
echo " arch - 安装 Arch Linux"
|
||||||
|
echo " -n HOSTNAME 设置主机名(在 init 模式下必须指定)"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# 初始化系统
|
||||||
|
initialize_current_system() {
|
||||||
|
if [ -z "$hostname" ]; then
|
||||||
|
echo "错误:必须使用 -n 参数指定主机名"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "开始初始化 VPS..."
|
||||||
|
|
||||||
|
# 设置主机名
|
||||||
|
echo "设置主机名为: $hostname"
|
||||||
|
name=$(echo $hostname | sed 's/\./-/g')
|
||||||
|
hostnamectl set-hostname "$name"
|
||||||
|
|
||||||
|
setup_security
|
||||||
|
install_packages
|
||||||
|
echo "VPS 初始化完成!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主函数
|
||||||
|
main() {
|
||||||
|
|
||||||
|
while getopts "hm:n:" opt; do
|
||||||
|
case $opt in
|
||||||
|
h)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
m)
|
||||||
|
mode=$OPTARG
|
||||||
|
;;
|
||||||
|
n)
|
||||||
|
hostname=$OPTARG
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$mode" ]; then
|
||||||
|
echo "错误:必须指定运行模式"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $mode in
|
||||||
|
init)
|
||||||
|
initialize_current_system
|
||||||
|
;;
|
||||||
|
arch)
|
||||||
|
install_arch
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "错误:无效的模式 '$mode'"
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
Loading…
Reference in New Issue
Block a user