可行且高效,但需区分一次性初始化与可重复执行逻辑,探测发行版适配包管理命令,禁用交互式安装,严格校验路径、权限、端口及网络连通性。

直接上结论:用 Shell 脚本自动化配置新开发机是可行且高效的,但必须分清「一次性初始化」和「可重复执行」两类逻辑——前者(如改主机名、写 /etc/hosts)只能跑一次,后者(如装包、配环境变量)需加判断避免覆盖或报错。
判断系统发行版并适配包管理命令
不同发行版的包安装命令不兼容,硬写 apt-get 或 yum 会导致脚本在 CentOS 上直接失败。得先探测,再分支执行。
- 用
grep -q "ubuntu\|debian" /etc/os-release或rpm -q centos-release &>/dev/null判断主流发行版 - 避免依赖
lsb_release(部分最小化系统未预装),优先读/etc/os-release - Ubuntu/Debian 下用
apt-get update && apt-get install -y;CentOS/RHEL 8+ 用dnf install -y,7 及以前用yum install -y - 安装前加
command -v curl &>/dev/null || { echo "curl missing"; exit 1; }防止基础工具缺失导致后续命令全挂
安装 JDK/Tomcat/MySQL 时绕过交互式提示
交互式安装(比如 MySQL 的 mysql_secure_installation)会卡住脚本。生产级脚本必须禁用交互,用参数预设行为。
- JDK:下载 tar.gz 后解压到
/opt/jdk,再用update-alternatives --install注册,避免修改/usr/bin/java硬链接 - Tomcat:直接
wget官方二进制包,解压后用useradd -r -s /bin/false tomcat创建专用用户,别用 root 运行 - MySQL:Debian 系用
debconf-set-selections预置 root 密码,再apt-get install -y mysql-server;RHEL 系用mysql_install_db+ 配置文件初始化,跳过mysql_secure_installation - 所有服务启用前,先检查端口占用:
ss -tuln | grep ':3306',避免冲突启动失败
配置生效前必须验证路径与权限
脚本里写死的路径(如 /etc/profile.d/java.sh)或用户主目录(/home/devuser)一旦不存在,source 或 chown 就会静默失败。
- 写入环境变量前,用
mkdir -p /etc/profile.d确保目录存在 - 给新用户配 sudo 权限时,用
usermod -aG sudo devuser(Ubuntu)或usermod -aG wheel devuser(RHEL),别直接改/etc/sudoers - 修改
/etc/hosts前,先用grep -q "mydevbox" /etc/hosts || echo "127.0.0.1 mydevbox" >> /etc/hosts,防止重复追加 - 所有
chown操作前加id -u devuser &>/dev/null检查用户是否存在,否则报错退出
错误处理不能只靠 set -e
set -e 在管道或子 shell 中失效,比如 curl -s url | jq .version 里 curl 失败但 jq 仍返回 0,整个命令看似成功。
- 关键步骤后手动检查退出码:
systemctl start tomcat && systemctl is-active --quiet tomcat - 下载类操作必须校验:
sha256sum -c jdk.sha256 2>/dev/null || { echo "checksum failed"; exit 1; } - 日志输出到文件的同时,也用
tee实时显示:./install.sh 2>&1 | tee /var/log/dev-setup.log - 不要在脚本末尾统一
exit 0,让自然退出码反映真实状态
最易被忽略的是「开发机重启后是否还能连通」——脚本里改了 SSH 配置(如 PermitRootLogin)、关了防火墙(ufw disable)、甚至删了网卡配置,这些操作不会报错,但人一 reboot 就失联。务必把网络连通性验证放在最后一步,比如 ping -c1 github.com &>/dev/null 成功才认为部署完成。


















