Shell脚本实现多节点自动化高效配置——解决主机名、IP、SSH、免密登录(MobaXterm+VMware+CentOS)
本文介绍了在VMware环境下搭建CentOS集群的详细步骤:1. 通过克隆创建node1/node2/node3三台虚拟机,分别配置静态IP(192.168.125.131/129/130);2. 使用MobaXterm建立SSH连接;3. 编写自动化脚本(setup_nodeX.sh)统一配置各节点:安装SSH服务、允许root远程登录、设置主机名、配置防火墙等;4. 实现节点间免密登录并通过
【本机已提前部署配置好MobaXterm+VMware,提前下载好CentOS软件安装包】
一、物理机上搭建 CentOS 虚拟机环境
1.手动克隆虚拟机
打开已经安装好的CentOS文件地址,手动复制虚拟机至相同文件位置并重命名不同文件名

2.为VMware配置 node1,node2,node3,得到 node1、node2、node3 的 IP 地址
分别打开刚才三个CentOS文件地址,并为三个虚拟机重命名为node1,node2,node3

打开node1,输入:
ip addr # 或者输入 ifconfig 也是同样效果
弹出以下界面:

图中显示系统下通过命令查看网络接口配置信息的结果,其中涉及多个 IP 地址:
回环地址(lo 接口)
inet 127.0.0.1/8:这是回环地址,用于本地主机内部通信,比如在同一台机器上的程序之间进行网络通信测试等,不会经过实际的网络硬件。
物理网络接口地址(ens33 接口)
inet 192.168.125.128/24:这是 ens33 网络接口的一个 IP 地址,属于私有 IP 地址范围(192.168.0.0 - 192.168.255.255),通常用于局域网内的设备通信。/24表示子网掩码为 255.255.255.0,意味着该 IP 所在的子网可容纳较多设备。inet 192.168.125.131/24:这是 ens33 接口的另一个 IP 地址,同样处于 192.168.125.0/24 这个子网中,为该网络接口配置的辅助 IP,用于实现一些特殊的网络需求,比如在同一物理接口上区分不同的网络服务等。
虚拟网络接口地址(virbr0 接口)
inet 192.168.122.1/24:virbr0 是虚拟机相关的虚拟网络接口,这个 IP 地址用于虚拟机网络(通常是 NAT 模式下的虚拟机网络),方便虚拟机与主机或其他虚拟机进行网络通信。
二、通过 MobaXterm 工具远程连接并管理该虚拟机
1.打开MobaXterm

2.远程连接
打开Session—SSH,创建新的SSH会话,输入连接目标(node1)的IP地址:

以下是创建并连接成功的界面:

输入密码回车,选择yes

点击取消:

得到以下界面,即为创建并成功连通的界面:

同样操作配置node2和node3虚拟机,最终成功配置可显示以下界面:


三、配置 root 用户的远程 SSH 连接环境(以node1为例)
1.编写setup_node1.sh,setup_node2.sh,setup_node3.sh至各自IP地址的MobaXterm-SSH下

实现快速配置 node 节点的 SSH 远程登录环境及基础系统设置,核心操作包括:先检查并确保以 root 用户执行,随后安装并启动 SSH 服务、设置开机自启;接着修改 SSH 配置文件,允许 root 用户通过密码远程登录;为 ens33 网卡配置 192.168.125.129/192.168.125.130/192.168.125.131 的固定 IP(含临时生效与永久写入配置),并将主机名设为 node1/node2/node3;之后重启 SSH 与网络服务使配置生效,开放防火墙 22 端口(SSH 默认端口);还会创建 root 用户的.ssh 目录及 authorized_keys 文件、设置正确权限,为后续免密登录做准备,最后输出 node1/node2/node3 的 IP、主机名等配置结果,整体作用是让 node1/node2/node3 节点具备可远程管理的基础环境,方便后续集群搭建或系统运维。
setup_node1.sh 脚本内容如下:
#!/bin/bash
# 脚本功能:配置root用户SSH远程登录权限,优化连接设置(node1)
# 检查是否以root用户执行
if [ "$(id -u)" -ne 0 ]; then
echo "错误:请使用root用户执行此脚本(sudo ./setup_node1.sh)"
exit 1
fi
# 1. 确保SSH服务已安装并启动
echo "===== 检查SSH服务 ====="
if ! rpm -qa | grep -q openssh-server; then
echo "安装SSH服务..."
yum install -y openssh-server &>/dev/null
fi
# 启动并设置开机自启SSH服务
systemctl start sshd &>/dev/null
systemctl enable sshd &>/dev/null
echo "SSH服务状态:$(systemctl is-active sshd)"
# 2. 配置root用户SSH登录权限
echo -e "\n===== 配置root用户SSH权限 ====="
SSHD_CONFIG="/etc/ssh/sshd_config"
# 允许root用户登录(默认可能禁止)
sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' $SSHD_CONFIG
sed -i 's/^PermitRootLogin no/PermitRootLogin yes/' $SSHD_CONFIG
# 允许密码登录(默认开启,防止被禁用)
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication yes/' $SSHD_CONFIG
sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' $SSHD_CONFIG
echo "已允许root用户通过密码登录SSH"
# 3. 配置ens33网卡IP(192.168.125.131)
echo -e "\n===== 配置网络接口 ====="
INTERFACE="ens33"
CONFIG_FILE="/etc/sysconfig/network-scripts/ifcfg-$INTERFACE"
TARGET_IP="192.168.125.131" # node1专属IP
NETMASK="255.255.255.0"
# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
echo "错误:网卡配置文件 $CONFIG_FILE 不存在"
exit 1
fi
# 临时添加IP(立即生效)
ip addr add $TARGET_IP/24 dev $INTERFACE &>/dev/null
# 永久配置(添加到网卡配置文件)
if ! grep -q "IPADDR1=$TARGET_IP" "$CONFIG_FILE"; then
echo "IPADDR1=$TARGET_IP" >> "$CONFIG_FILE"
echo "NETMASK1=$NETMASK" >> "$CONFIG_FILE"
echo "网络配置已写入 $CONFIG_FILE"
else
echo "IP地址 $TARGET_IP 已配置,跳过写入步骤"
fi
# 4. 配置主机名(新增:设置为node1)
echo -e "\n===== 配置主机名 ====="
hostnamectl set-hostname node1
echo "主机名已设置为:node1"
# 5. 重启服务使配置生效
echo -e "\n===== 重启服务 ====="
# 重启SSH服务
systemctl restart sshd &>/dev/null
echo "SSH服务已重启"
# 重启网络服务
if command -v nmcli &>/dev/null; then
nmcli connection reload &>/dev/null
nmcli connection up $INTERFACE &>/dev/null
else
systemctl restart network &>/dev/null
fi
echo "网络服务已重启"
# 6. 开放防火墙SSH端口
echo -e "\n===== 配置防火墙 ====="
firewall-cmd --add-port=22/tcp --permanent &>/dev/null
firewall-cmd --reload &>/dev/null
echo "已开放SSH端口(22)"
# 7. 准备免密登录环境(新增:创建.ssh目录及授权文件)
echo -e "\n===== 准备免密登录环境 ====="
mkdir -p /root/.ssh
chmod 700 /root/.ssh
touch /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
echo "免密登录环境已就绪"
# 8. 显示配置结果
echo -e "\n===== 配置完成 ====="
echo "节点信息:node1"
echo "IP地址:$TARGET_IP"
echo "主机名:$(hostname)"
echo "用户名:root"
echo "当前IP配置:"
ip addr show $INTERFACE | grep "inet "
setup_node2.sh 脚本内容如下:
#!/bin/bash
# 脚本功能:配置root用户SSH远程登录权限,优化连接设置(node2)
# 检查是否以root用户执行
if [ "$(id -u)" -ne 0 ]; then
echo "错误:请使用root用户执行此脚本(sudo ./setup_node2.sh)"
exit 1
fi
# 1. 确保SSH服务已安装并启动
echo "===== 检查SSH服务 ====="
if ! rpm -qa | grep -q openssh-server; then
echo "安装SSH服务..."
yum install -y openssh-server &>/dev/null
fi
# 启动并设置开机自启SSH服务
systemctl start sshd &>/dev/null
systemctl enable sshd &>/dev/null
echo "SSH服务状态:$(systemctl is-active sshd)"
# 2. 配置root用户SSH登录权限
echo -e "\n===== 配置root用户SSH权限 ====="
SSHD_CONFIG="/etc/ssh/sshd_config"
# 允许root用户登录(默认可能禁止)
sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' $SSHD_CONFIG
sed -i 's/^PermitRootLogin no/PermitRootLogin yes/' $SSHD_CONFIG
# 允许密码登录(默认开启,防止被禁用)
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication yes/' $SSHD_CONFIG
sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' $SSHD_CONFIG
echo "已允许root用户通过密码登录SSH"
# 3. 配置ens33网卡IP(192.168.125.129)
echo -e "\n===== 配置网络接口 ====="
INTERFACE="ens33"
CONFIG_FILE="/etc/sysconfig/network-scripts/ifcfg-$INTERFACE"
TARGET_IP="192.168.125.129" # node2专属IP
NETMASK="255.255.255.0"
# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
echo "错误:网卡配置文件 $CONFIG_FILE 不存在"
exit 1
fi
# 临时添加IP(立即生效)
ip addr add $TARGET_IP/24 dev $INTERFACE &>/dev/null
# 永久配置(添加到网卡配置文件)
if ! grep -q "IPADDR1=$TARGET_IP" "$CONFIG_FILE"; then
echo "IPADDR1=$TARGET_IP" >> "$CONFIG_FILE"
echo "NETMASK1=$NETMASK" >> "$CONFIG_FILE"
echo "网络配置已写入 $CONFIG_FILE"
else
echo "IP地址 $TARGET_IP 已配置,跳过写入步骤"
fi
# 4. 配置主机名(新增:设置为node2)
echo -e "\n===== 配置主机名 ====="
hostnamectl set-hostname node2
echo "主机名已设置为:node2"
# 5. 重启服务使配置生效
echo -e "\n===== 重启服务 ====="
# 重启SSH服务
systemctl restart sshd &>/dev/null
echo "SSH服务已重启"
# 重启网络服务
if command -v nmcli &>/dev/null; then
nmcli connection reload &>/dev/null
nmcli connection up $INTERFACE &>/dev/null
else
systemctl restart network &>/dev/null
fi
echo "网络服务已重启"
# 6. 开放防火墙SSH端口
echo -e "\n===== 配置防火墙 ====="
firewall-cmd --add-port=22/tcp --permanent &>/dev/null
firewall-cmd --reload &>/dev/null
echo "已开放SSH端口(22)"
# 7. 准备免密登录环境(新增:创建.ssh目录及授权文件)
echo -e "\n===== 准备免密登录环境 ====="
mkdir -p /root/.ssh
chmod 700 /root/.ssh
touch /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
echo "免密登录环境已就绪"
# 8. 显示配置结果
echo -e "\n===== 配置完成 ====="
echo "节点信息:node2"
echo "IP地址:$TARGET_IP"
echo "主机名:$(hostname)"
echo "用户名:root"
echo "当前IP配置:"
ip addr show $INTERFACE | grep "inet "
setup_node3.sh 脚本内容如下:
#!/bin/bash
# 脚本功能:配置root用户SSH远程登录权限,优化连接设置(node3)
# 检查是否以root用户执行
if [ "$(id -u)" -ne 0 ]; then
echo "错误:请使用root用户执行此脚本(sudo ./setup_node3.sh)"
exit 1
fi
# 1. 确保SSH服务已安装并启动
echo "===== 检查SSH服务 ====="
if ! rpm -qa | grep -q openssh-server; then
echo "安装SSH服务..."
yum install -y openssh-server &>/dev/null
fi
# 启动并设置开机自启SSH服务
systemctl start sshd &>/dev/null
systemctl enable sshd &>/dev/null
echo "SSH服务状态:$(systemctl is-active sshd)"
# 2. 配置root用户SSH登录权限
echo -e "\n===== 配置root用户SSH权限 ====="
SSHD_CONFIG="/etc/ssh/sshd_config"
# 允许root用户登录(默认可能禁止)
sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' $SSHD_CONFIG
sed -i 's/^PermitRootLogin no/PermitRootLogin yes/' $SSHD_CONFIG
# 允许密码登录(默认开启,防止被禁用)
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication yes/' $SSHD_CONFIG
sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' $SSHD_CONFIG
echo "已允许root用户通过密码登录SSH"
# 3. 配置ens33网卡IP(192.168.125.130)
echo -e "\n===== 配置网络接口 ====="
INTERFACE="ens33"
CONFIG_FILE="/etc/sysconfig/network-scripts/ifcfg-$INTERFACE"
TARGET_IP="192.168.125.130" # node3专属IP
NETMASK="255.255.255.0"
# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
echo "错误:网卡配置文件 $CONFIG_FILE 不存在"
exit 1
fi
# 临时添加IP(立即生效)
ip addr add $TARGET_IP/24 dev $INTERFACE &>/dev/null
# 永久配置(添加到网卡配置文件)
if ! grep -q "IPADDR1=$TARGET_IP" "$CONFIG_FILE"; then
echo "IPADDR1=$TARGET_IP" >> "$CONFIG_FILE"
echo "NETMASK1=$NETMASK" >> "$CONFIG_FILE"
echo "网络配置已写入 $CONFIG_FILE"
else
echo "IP地址 $TARGET_IP 已配置,跳过写入步骤"
fi
# 4. 配置主机名(新增:设置为node3)
echo -e "\n===== 配置主机名 ====="
hostnamectl set-hostname node3
echo "主机名已设置为:node3"
# 5. 重启服务使配置生效
echo -e "\n===== 重启服务 ====="
# 重启SSH服务
systemctl restart sshd &>/dev/null
echo "SSH服务已重启"
# 重启网络服务
if command -v nmcli &>/dev/null; then
nmcli connection reload &>/dev/null
nmcli connection up $INTERFACE &>/dev/null
else
systemctl restart network &>/dev/null
fi
echo "网络服务已重启"
# 6. 开放防火墙SSH端口
echo -e "\n===== 配置防火墙 ====="
firewall-cmd --add-port=22/tcp --permanent &>/dev/null
firewall-cmd --reload &>/dev/null
echo "已开放SSH端口(22)"
# 7. 准备免密登录环境(新增:创建.ssh目录及授权文件)
echo -e "\n===== 准备免密登录环境 ====="
mkdir -p /root/.ssh
chmod 700 /root/.ssh
touch /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
echo "免密登录环境已就绪"
# 8. 显示配置结果
echo -e "\n===== 配置完成 ====="
echo "节点信息:node3"
echo "IP地址:$TARGET_IP"
echo "主机名:$(hostname)"
echo "用户名:root"
echo "当前IP配置:"
ip addr show $INTERFACE | grep "inet "
2.执行脚本前的准备(确保在正确路径)
(1)首先在 CentOS 终端中,确保当前用户是 root(脚本需 root 权限)
若当前是普通用户(如 centos),先执行切换命令:
su - # 输入 root 密码后,提示符会变为 [root@node1 ~]#
最终显示如下界面即可:

(2)确认脚本存在且路径正确
执行以下命令检查脚本是否在 /root 目录下:
ls -l /root/setup_node1.sh
- 若输出类似
-rw-r--r--. 1 root root xxxx 日期 /root/setup_node1.sh,说明脚本存在(但尚未添加执行权限); - 若提示
ls: 无法访问/root/setup_node1.sh: 没有那个文件或目录,需重新确认脚本保存路径是否正确。
显示如下界面,即脚本存在:

3.给脚本添加执行权限(必须步骤)
执行以下命令,赋予脚本可执行权限(否则无法运行):
chmod +x /root/setup_node1.sh
执行后,再次用 ls -l /root/setup_node1.sh 验证,权限列会变为 rwxr-xr-x(表示拥有执行权限)。
正确操作显示界面如下:

4.执行脚本(直接指定完整路径)
无需切换目录,直接通过完整路径执行脚本:
/root/setup_node1.sh
执行过程中,脚本会自动输出每一步操作结果(如 “SSH 服务已重启”“网络配置已写入”),等待最后显示 ===== 配置完成 ===== 即表示脚本执行结束。
正确操作显示界面如下:

【上面4步操作同样在node2和node3上执行】
5.配置免密登录(分别在 node1,node2,node3上执行,输入其他节点的 root 密码)
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa # 生成密钥对
ssh-copy-id root@192.168.125.131 # 本机
ssh-copy-id root@192.168.125.129 # node2
ssh-copy-id root@192.168.125.130 # node3
成功执行界面显示如下:




- 首次连接会提示 “是否持续连接”,输入
yes后按回车; - 再输入对应节点的 root 密码,若能成功登录并显示目标节点名,说明跨节点网络和 SSH 配置正常。
四、单节点本地验证—主机名、IP、SSH 服务(每个节点单独执行)
登录到 node1、node2、node3 的本地终端(或通过 MobaXterm 先密码登录),执行以下命令,确认当前节点的 主机名、IP、SSH 服务 配置正确:
1.验证主机名(必须显示对应节点名)
hostname # 执行后输出
# node1 应显示:node1
# node2 应显示:node2
# node3 应显示:node3
2.验证 IP 地址(必须包含目标静态 IP)
ip addr show ens33 | grep 'inet ' # 查看 ens33 网卡的 IP
- node1 正常输出:需包含
192.168.125.131/24 - node2 正常输出:需包含
192.168.125.129/24 - node3 正常输出:需包含
192.168.125.130/24
3.验证 SSH 服务状态(必须为 active)
systemctl status sshd | grep 'active'
- 正常输出:
active (running)(表示 SSH 服务已启动且能接受远程连接)。
上述三步执行界面如下,即为成功操作:

五、免密登录验证
1.以node1为例
在 node1 执行(已通过 ssh-keygen 和 ssh-copy-id 分发过公钥),CentOS终端分别输入:
# 1. 免密登录 node2
ssh root@192.168.125.129
# 无需输密码,直接进入 node2 后,执行 hostname 确认
hostname # 应输出 "node2"
exit # 退出 node2,返回 node1
# 2. 免密登录 node3
ssh root@192.168.125.130
hostname # 应输出 "node3"
exit # 退出 node3,返回 node1
成功执行界面如下:

- 若无需输入密码即可登录,说明免密配置生效;
- 若仍提示输密码,检查 node1 的公钥是否已添加到目标节点的
/root/.ssh/authorized_keys中(可执行cat /root/.ssh/authorized_keys查看)。
2.以node2为例
在 node2 执行(已通过 ssh-keygen 和 ssh-copy-id 分发过公钥),CentOS终端分别输入:
# 1. 免密登录 node1
ssh root@192.168.125.131
hostname # 应输出 "node1"
exit # 退出 node1,返回 node2
# 2. 免密登录 node3
ssh root@192.168.125.130
hostname # 应输出 "node3"
exit # 退出 node3,返回 node2
成功执行界面如下:

- 若无需输入密码即可登录,说明免密配置生效;
- 若仍提示输密码,检查 node2 的公钥是否已添加到目标节点的
/root/.ssh/authorized_keys中(可执行cat /root/.ssh/authorized_keys查看)。
2.以node3为例
在 node2 执行(已通过 ssh-keygen 和 ssh-copy-id 分发过公钥),CentOS终端分别输入:
# 1. 免密登录 node1
ssh root@192.168.125.131
hostname # 应输出 "node1"
exit # 退出 node1,返回 node3
# 2. 免密登录 node2
ssh root@192.168.125.129
hostname # 应输出 "node2"
exit # 退出 node2,返回 node3
成功执行界面如下:

- 若无需输入密码即可登录,说明免密配置生效;
- 若仍提示输密码,检查 node1 的公钥是否已添加到目标节点的
/root/.ssh/authorized_keys中(可执行cat /root/.ssh/authorized_keys查看)。
【个人实验总结】---本实验操作出现的错误及解决方案
1.错误现象
脚本执行错误:-bash: /root/setup_nodeX.sh: /bin/bash^M: 坏的解释器

执行脚本时提示:
/root/setup_node2.sh: /bin/bash^M: 坏的解释器: 文本文件忙 # 单独提示
/root/setup_node3.sh: /bin/bash^M: 坏的解释器 # 或单独提示
2.错误原因
- 格式问题:脚本在 Windows 环境下创建 / 编辑,换行符为
\r\n(DOS 格式),Linux 仅识别\n(Unix 格式),多余的^M字符导致解释器路径错误; - 文件占用:脚本被其他进程占用(如未关闭的编辑器、未结束的脚本进程),提示 “文本文件忙”。
3.解决步骤(按步骤查找,并修改存在的错误)
(1)释放文件占用:
① 查找占用进程:fuser /root/setup_nodeX.sh(X 为 2/3,输出如/root/setup_node2.sh: 2737,PID 为 2737);
② 杀死占用进程:kill -9 2737(替换为实际 PID);
③ 验证释放:再次执行fuser /root/setup_nodeX.sh,无输出则占用已释放。
(2)转换脚本格式:
① 在MobaXterm的.sh文件编辑文本中,找到上标的企鹅图标,点击即可一键消除格式问题【推荐】
②安装格式转换工具:yum install -y dos2unix;
③ 转换为 Linux 格式:dos2unix /root/setup_nodeX.sh;
④验证格式:cat -A /root/setup_nodeX.sh | head -1,正确输出应为#!/bin/bash$(无^M)。
(3)重新执行脚本:
赋予权限(若未赋予):chmod +x /root/setup_nodeX.sh;
执行脚本:/root/setup_nodeX.sh。
更多推荐



所有评论(0)