跳转至

新到手 VPS 必做的配置优化

本篇教程基于 Debian 11 系统,其他系统大同小异,请自行参考。

更新组件,包管理

在开始配置新 VPS 之前,确保所有软件包都是最新的是非常重要的。这可以通过以下命令完成:

  • 更新软件包列表:
sudo apt update
  • 这一步会检查系统中所有可用的软件包更新,确保你的包管理器知道有哪些新版本可用。
  • 安装所有可用的软件包更新:
sudo apt upgrade --only-upgrade
  • 这一步会安装所有已检查到的新版本软件包,并升级到最新版本。

常用工具

VIM 编辑器

VIM 是 Linux 系统中一个非常强大的文本编辑器,虽然刚开始可能有点难上手,但一旦熟悉了它的快捷键和操作方式,你会发现它非常高效。以下是安装和配置 VIM 的步骤:

  • 安装:sudo apt install vim

安装完成后,你可以通过 vim 命令来启动它。

安装 command-not-found

command-not-found是一个有用的工具,当您尝试运行一个未安装的命令时,它会提示您如何安装它。这是一个非常有用的工具,当尝试运行一个未安装的命令时,它会提示你如何安装它。这能帮你节省不少时间,尤其是在你不确定某个命令是否已经安装的情况下。

  • 安装:sudo apt install command-not-found

效果如下:

$ gem
Command 'gem' not found, but can be installed with:
apt install ruby-rubygems

安装 curl

curl 是一个命令行工具,用于通过 URL 传输数据。无论是下载文件还是与 API 交互,curl 都是一个非常实用的工具。

  • 安装:sudo apt install curl

安装 wget

wget 是另一个命令行工具,用于从网络上下载文件。虽然 curl 也能做到这一点,但 wget 在某些情况下可能更方便。

  • 安装:sudo apt install wget

安装 git

git 不用多说,必不可少。

  • 安装:sudo apt install git

oh-my-zsh

先检查 zsh 是否安装

在安装 oh-my-zsh 之前,我们先检查一下系统中是否已经安装了 zsh。你可以通过以下命令查看系统支持哪些 shell:

检查系统的 shell:cat /etc/shells 正常情况下,你会看到类似以下的输出:

/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

如果已经有 /bin/zsh,那么我们就不必安装了。如果没有,我们可以通过以下命令来安装:

  • 安装:sudo apt install -y zsh
  • 安装完成后,再次运行cat /etc/shells,你会发现多了一个:/bin/zsh

安装 oh-my-zsh

oh-my-zsh 是一个开源的、社区驱动的框架,用于管理 Zsh 配置。它提供了许多主题和插件,能让你的终端更加美观和高效

  • 安装 oh-my-zsh:sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

配置 oh-my-zsh

oh-my-zsh 提供了许多实用的插件,以下是一些推荐的插件:

  • zsh-autosuggestions
    • 自动建议命令这个插件会对历史命令一些补全,非常方便。
  • zsh-syntax-highlighting
    • 这个插件会对终端命令高亮显示,比如正确的拼写会是绿色标识,否则是红色,另外对于一些 shell 输出语句也会有高亮显示,算是不错的辅助插件
  • z
    • 强大的目录自动跳转命令,会记忆你曾经进入过的目录,用模糊匹配快速进入你想要的目录。
  • extract
    • 功能强大的解压插件,所有类型的文件解压一个命令 x 全搞定,再也不需要去记 tar 后面到底是哪几个参数了。
  • wd
    • 简单地讲就是给指定目录映射一个全局的名字,以后方便直接跳转到这个目录,比如:wd /var/www/html; wd add html,以后直接 wd html 就可以快速进入这个目录了。
  • autojump
    • 自动跳转目录,安装后,直接 j 目录名 就可以快速进入这个目录了。

安全设置

修改 SSH 端口

使用文本编辑器(如 vim 或 vi)打开 SSH 配置文件。命令如下:

sudo vim /etc/ssh/sshd_config

修改端口号:在配置文件中找到 #Port 22 这一行,去掉前面的 # 号,并将 22 修改为你想要的新端口号。例如,如果你想将端口号改为 22345,则修改为:

Port 22345

保存文件并退出编辑器。重启 SSH 服务:

sudo systemctl restart sshd

小结

其实上面的过程,可以写一个脚本,一键完成。

首先创建一个脚本文件:vps_setup.sh

然后写入以下内容:

#!/bin/bash
set -e

# 定义颜色代码
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

detect_distribution() {
    local supported_distributions=("ubuntu" "debian" "centos" "fedora")
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        if [[ "${ID}" = "ubuntu" || "${ID}" = "debian" || "${ID}" = "centos" || "${ID}" = "fedora" ]]; then
            PM="apt"
            [ "${ID}" = "centos" ] && PM="yum"
            [ "${ID}" = "fedora" ] && PM="dnf"
            log_info "检测到系统:${ID} (包管理器:${PM})"
        else
            log_error "不支持的系统类型:${ID}"
            exit 1
        fi
    else
        log_error "无法检测系统类型:/etc/os-release 文件不存在"
        exit 1
    fi
}

# 更新组件,包管理
update_system() {
    log_info "开始更新系统..."
    if [ "${PM}" = "apt" ]; then
        sudo apt update
        sudo apt upgrade --only-upgrade -y
    elif [ "${PM}" = "yum" ]; then
        sudo yum update -y
    fi
    log_info "系统更新完成"
}

# 新增询问函数
ask_user() {
    local tool_name=$1
    local description=$2
    echo -e "${YELLOW}是否安装 ${tool_name}?${NC}"
    [ ! -z "$description" ] && echo -e "${YELLOW}描述:${description}${NC}"
    read -p "请输入 [Y/n]: " choice
    case "$choice" in
    [nN][oO] | [nN])
        return 1
        ;;
    *)
        return 0
        ;;
    esac
}

install_tool() {
    local name=$1
    local description=$2

    # 如果工具已安装,显示版本信息
    if command -v "${name}" &>/dev/null; then
        log_info "${name} 已安装"
        return 0
    fi

    # 询问用户是否安装
    if ask_user "${name}" "${description}"; then
        log_warn "${name} 未安装,正在安装..."
        sudo ${PM} install -y "${name}"
        if [ $? -eq 0 ]; then
            log_info "${name} 安装成功"
        else
            log_error "${name} 安装失败"
            exit 1
        fi
    else
        log_info "跳过安装 ${name}"
    fi
}

install_tool_no_ask() {
    local name=$1
    if command -v "${name}" &>/dev/null; then
        log_info "${name} 已安装"
        return 0
    fi
    log_warn "${name} 未安装,正在安装..."
    sudo ${PM} install -y "${name}"
    if [ $? -eq 0 ]; then
        log_info "${name} 安装成功"
    else
        log_error "${name} 安装失败"
        exit 1
    fi
}

config_zsh() {
    log_info "配置 zsh 主题"
    # choose oh-my-zsh theme
    # 替换 zshrc 文件中的 ZSH_THEME 为 ys
    sed -i "s/^ZSH_THEME=.*/ZSH_THEME=\"ys\"/g" ~/.zshrc

    install_tool_no_ask "git"

    log_info "安装 oh-my-zsh 插件,zsh-autosuggestions, zsh-syntax-highlighting ....."
    git clone https://github.com/zsh-users/zsh-autosuggestions.git ~/.oh-my-zsh/plugins/zsh-autosuggestions
    git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/plugins/zsh-syntax-highlighting

    log_info "配置 zshrc 文件"
    sed -i "s/^plugins=.*/plugins=(git z wd extract zsh-autosuggestions zsh-syntax-highlighting command-not-found)/g" ~/.zshrc

    if ! grep -q "/usr/bin/zsh" /etc/shells; then
        echo "/usr/bin/zsh" >>/etc/shells
    fi
    log_info "设置 zsh 为默认 shell"
    chsh -s $(which zsh)

    log_info "zsh 配置完成"
}

install_oh_my_zsh() {
    log_info "开始安装 oh-my-zsh..."

    # 清理旧文件
    if [ -d ~/.oh-my-zsh ]; then
        log_warn "检测到已存在的 oh-my-zsh 安装,正在删除..."
        rm -rf ~/.oh-my-zsh
    fi

    # 备份已存在的 .zshrc
    [ -f ~/.zshrc ] && mv ~/.zshrc ~/.zshrc.backup

    # 克隆 oh-my-zsh 仓库
    git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh

    # 复制默认配置文件
    cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

    # 配置 zsh
    config_zsh

    log_info "oh-my-zsh 安装完成"
}

change_ssh_port() {

    # 检查 /etc/ssh/sshd_config 文件是否存在
    if [ ! -f /etc/ssh/sshd_config ]; then
        log_error "/etc/ssh/sshd_config 文件不存在"
        exit 1
    fi

    if ask_user "修改 ssh 端口号" "修改 ssh 端口号"; then
        read -p "请输入新的 ssh 端口号(1024-65535): " SSH_PORT
        if [[ ! "${SSH_PORT}" =~ ^[0-9]+$ ]] || [ "${SSH_PORT}" -lt 1024 ] || [ "${SSH_PORT}" -gt 65535 ]; then
            log_error "输入的端口号不在 1024-65535 范围内"
            exit 1
        fi

        local backup_file="/etc/ssh/sshd_config.backup.$(date +%Y%m%d_%H%M%S)"
        log_info "备份配置文件到 ${backup_file}"
        cp /etc/ssh/sshd_config "${backup_file}"

        log_info "修改 ssh 端口号为 ${SSH_PORT}"
        sed -i "s/^#Port.*/Port ${SSH_PORT}/g" /etc/ssh/sshd_config
        sed -i "s/^Port.*/Port ${SSH_PORT}/g" /etc/ssh/sshd_config

        if ! sshd -t; then
            log_error "SSH 配置文件语法检查失败,正在还原配置..."
            cp "${backup_file}" /etc/ssh/sshd_config
            exit 1
        fi

        # 重启 ssh 服务
        log_info "重启 ssh 服务"
        if ! sudo systemctl restart sshd; then
            log_error "SSH 服务重启失败,正在还原配置..."
            cp "${backup_file}" /etc/ssh/sshd_config
            sudo systemctl restart sshd
            exit 1
        fi

        log_info "SSH 端口修改成功,请确保使用新端口 ${SSH_PORT} 连接"
        log_warn "建议保持当前连接,新开一个终端验证新端口是否可用"
    fi
}

# 新增防火墙配置函数
configure_firewall() {
    local port=$1

    case "${ID}" in
    "ubuntu" | "debian")
        # 检查 ufw 是否安装
        if ! command -v ufw >/dev/null; then
            log_warn "未检测到 ufw,正在安装..."
            sudo ${PM} install -y ufw
        fi
        sudo ufw allow "${port}"/tcp
        sudo ufw --force enable
        ;;
    "centos" | "fedora")
        # 检查 firewalld 是否安装
        if ! command -v firewall-cmd >/dev/null; then
            log_warn "未检测到 firewalld,正在安装..."
            sudo ${PM} install -y firewalld
            sudo systemctl enable firewalld
            sudo systemctl start firewalld
        fi
        sudo firewall-cmd --permanent --add-port="${port}"/tcp
        sudo firewall-cmd --reload
        ;;
    *)
        log_warn "未知的系统类型,请手动配置防火墙规则"
        ;;
    esac

    log_info "防火墙规则已添加"
}

run_script() {
    log_info "开始运行脚本..."
    detect_distribution

    # 更新系统
    update_system

    # VIM
    install_tool "vim" "强大的文本编辑器"
    [ -x "$(command -v vim)" ] && log_info "VIM 版本:$(vim --version | head -n 1)"

    # command-not-found
    install_tool "command-not-found" "当运行未安装的命令时,提供安装建议"

    # curl
    install_tool "curl" "命令行文件传输工具"
    [ -x "$(command -v curl)" ] && log_info "curl 版本:$(curl --version | head -n 1)"

    # git
    install_tool "git" "分布式版本控制系统"
    [ -x "$(command -v git)" ] && log_info "git 版本:$(git --version)"

    # zsh
    if install_tool "zsh" "功能强大的 shell"; then
        if ask_user "oh-my-zsh" "zsh 的配置框架,提供主题和插件支持"; then
            log_info "开始安装 oh-my-zsh..."
            install_oh_my_zsh
            log_info "oh-my-zsh 安装和配置完成"
        fi
    fi

    # 修改 ssh 端口号
    change_ssh_port
}

run_script

赋予执行权限:

chmod +x vps_setup.sh

运行脚本:

./vps_setup.sh

跑完脚本一定要验证一下配置,比如:端口是否修改成功,没问题就开始安装其他软件。

本文阅读量  次
本站总访问量  次