如何使用 Bash 脚本自动化 CentOS 7 服务器的初始配置

在设置新的 CentOS 7 服务器时,系统管理员通常需要执行一系列标准配置步骤。这些步骤可能包括设置主机名、创建用户帐户、配置防火墙规则、安装常用软件包以及创建用户目录等。手动执行这些任务不仅耗时而且容易出错。自动化这个过程可以帮助您节省时间,并减少因操作不当导致的潜在错误。

下面是一个简单的 Bash 脚本示例,它可以自动完成 CentOS 7 服务器的基本初始配置。

shell 复制代码
#!/bin/bash

# 确保脚本以 root 身份执行
if [ "$(id -u)" -ne 0 ]; then
    echo "该脚本需要以 root 身份运行。"
    exit 1
fi

# 定义变量
NEW_HOSTNAME="node1" # 设置的主机名称
NEW_USERNAME="admin" # 新创建的用户名称
NEW_USER_PASSWORD="Password@123" # 定义用户密码
ALLOWED_IP_RANGE="10.0.0.0/24" # IP白名单

# 1. 设置主机名
echo "1. 设置主机名为 $NEW_HOSTNAME..."
hostnamectl set-hostname "$NEW_HOSTNAME"

# 2. 创建新用户并设置密码
echo "2. 创建新用户 $NEW_USERNAME..."
adduser "$NEW_USERNAME"
echo "$NEW_USER_PASSWORD" | passwd --stdin "$NEW_USERNAME"
usermod -aG wheel "$NEW_USERNAME"
echo "$NEW_USERNAME ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/$NEW_USERNAME
chmod 0440 /etc/sudoers.d/$NEW_USERNAME

# 3. 开放firewall防火墙所有端口,但是只让特定IP范围的访问
echo "3. 配置防火墙,允许 $ALLOWED_IP_RANGE 的IP地址范围访问所有端口..."
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="$ALLOWED_IP_RANGE" accept" && firewall-cmd --reload
echo "防火墙规则已更新。"

# 4. 安装有用的工具
echo "4. 安装一些常用的系统工具..."
yum install -y vim git curl wget unzip lrzsz net-tools

# 5. 配置系统资源限制
echo "5. 配置系统资源限制..."
cat >> /etc/security/limits.conf <<EOL
* soft nofile 65536
* hard nofile 65536
* soft nproc  65536
* hard nproc  65536
EOL
cat >> /etc/security/limits.d/20-nproc.conf <<EOL
* soft nofile 65536
* hard nofile 65536
* soft nproc  65536
* hard nproc  65536
EOL

# 6. 为新用户创建常用目录
echo "6. 为用户 $NEW_USERNAME 创建常用目录..."
USER_HOME=$(eval echo ~$NEW_USERNAME)

# 创建目录列表
declare -a dirs=(
  "$USER_HOME/project"
  "$USER_HOME/software"
  "$USER_HOME/document"
  "$USER_HOME/download"
  "$USER_HOME/tmp"
)

# 创建目录并设置所属权
for dir in "${dirs[@]}"; do
  mkdir -p "$dir"
  chown $NEW_USERNAME:$NEW_USERNAME "$dir"
done

echo "初始化脚本执行完成。即将重启服务器......"

# 7. 重启服务器
sleep 3s
reboot

脚本功能概览

  1. 检查 root 权限:确保脚本以 root 用户身份运行。
  2. 设置主机名:更改服务器的主机名。
  3. 创建新用户:添加一个新用户,并为其配置密码和 sudo 权限。
  4. 配置防火墙:只允许特定 IP 范围的访问。
  5. 安装工具:安装一些必要的系统管理工具。
  6. 配置系统资源限制:提高文件描述符和进程数的限制。
  7. 创建用户目录:为新用户创建一系列常用的工作目录。
  8. 重启服务器:应用所有更改并重启。

脚本逐步解析

权限检查

脚本的第一步是确认当前用户是否具有 root 权限。这是必要的,因为大多数配置更改都需要管理员权限。

shell 复制代码
if [ "$(id -u)" -ne 0 ]; then
    echo "该脚本需要以 root 身份运行。"
    exit 1
fi

设置主机名

使用 hostnamectl 命令,可以轻松地更改服务器的主机名。

shell 复制代码
hostnamectl set-hostname "$NEW_HOSTNAME"

创建新用户

脚本创建了一个新的用户帐户,并设置了密码。它还修改了 sudoers 文件以赋予该用户无密码 sudo 访问权限。

shell 复制代码
adduser "$NEW_USERNAME"
echo "$NEW_USER_PASSWORD" | passwd --stdin "$NEW_USERNAME"
usermod -aG wheel "$NEW_USERNAME"
echo "$NEW_USERNAME ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/$NEW_USERNAME
chmod 0440 /etc/sudoers.d/$NEW_USERNAME

防火墙配置

使用 firewall-cmd,脚本配置了防火墙,以便仅允许来自特定 IP 范围的访问。

shell 复制代码
firewall-cmd --permanent --zone=public --add-rich-rule="rule family=\"ipv4\" source address=\"$ALLOWED_IP_RANGE\" accept"
firewall-cmd --reload

安装常用工具

接下来,脚本使用 yum 来安装一系列有用的系统管理工具。

shell 复制代码
yum install -y vim git curl wget unzip lrzsz net-tools

配置系统资源限制

为了避免因资源限制导致的问题,脚本提高了文件描述符和进程数的限制。

shell 复制代码
cat >> /etc/security/limits.conf <<EOL
...
EOL

创建用户目录

脚本自动为新用户创建了一些常用的工作目录,并设置了适当的权限。

shell 复制代码
for dir in "${dirs[@]}"; do
  mkdir -p "$dir"
  chown $NEW_USERNAME:$NEW_USERNAME "$dir"
done

重启服务器

所有设置完成后,脚本将等待三秒钟,然后重启服务器,确保所有更改都被正确应用。

shell 复制代码
sleep 3s
reboot

如何使用脚本

要使用这个脚本,您只需要将其内容保存到 CentOS 7 服务器上的文件中,例如 init_server.sh。然后,通过 SSH 登录到服务器,通过运行以下命令给予脚本执行权限:

shell 复制代码
chmod +x init_server.sh

然后以 root 用户身份运行脚本:

shell 复制代码
sudo ./init_server.sh

安全注意事项

  • 脚本中的密码应该通过一个更安全的方式设置,比如使用密钥文件或通过交互式提示输入密码。
  • 打开防火墙的端口时,必须确保只允许必要和受信任的 IP 地址范围。
  • 修改 sudoers 文件时要特别小心,错误的配置可能导致安全风险或阻止合法用户获得必要的权限。

结论

通过使用此 Bash 脚本,系统管理员可以快速自动化 CentOS 7 服务器的初始设置。这不仅提高了配置过程的效率,而且还通过减少人为错误来提高了系统的稳定性和安全性。记住,所有自动化脚本都应该在安全的环境中测试,以确保它们按预期工作,并不会导致系统故障或安全漏洞。

相关推荐
一弓虽10 分钟前
SpringBoot 学习
java·spring boot·后端·学习
姑苏洛言19 分钟前
扫码小程序实现仓库进销存管理中遇到的问题 setStorageSync 存储大小限制错误解决方案
前端·后端
光而不耀@lgy34 分钟前
C++初登门槛
linux·开发语言·网络·c++·后端
方圆想当图灵1 小时前
由 Mybatis 源码畅谈软件设计(七):SQL “染色” 拦截器实战
后端·mybatis·代码规范
毅航1 小时前
MyBatis 事务管理:一文掌握Mybatis事务管理核心逻辑
java·后端·mybatis
我的golang之路果然有问题2 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database
柏油2 小时前
MySql InnoDB 事务实现之 undo log 日志
数据库·后端·mysql
写bug写bug3 小时前
Java Streams 中的7个常见错误
java·后端
Luck小吕4 小时前
两天两夜!这个 GB28181 的坑让我差点卸载 VSCode
后端·网络协议
M1A14 小时前
全栈开发必备:Windows安装VS Code全流程
前端·后端·全栈