259 lines
6.2 KiB
Bash
259 lines
6.2 KiB
Bash
#!/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 "$@" |