【本机已提前部署配置好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。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐