在 Linux 系统中,可以通过编写脚本来批量修改多个主机的 hostname。以下是一个使用 Bash 脚本的示例,该脚本可以在多台主机上同时修改 hostname。
hosts_list.txt
。ssh
连接到每台主机执行修改 hostname 的命令。创建一个名为 hosts_list.txt
的文件,内容示例如下:
192.168.1.10 new-hostname-1
192.168.1.11 new-hostname-2
192.168.1.12 new-hostname-3
每一行包含目标主机的 IP 地址和新的 hostname,使用制表符或空格分隔。
创建一个名为 batch_rename_hostname.sh
的脚本文件,内容如下:
#!/bin/bash
# 检查是否提供了主机列表文件
if [ $# -ne 1 ]; then
echo "用法: $0 hosts_list.txt"
exit 1
fi
HOST_LIST=$1
# 检查文件是否存在
if [ ! -f "$HOST_LIST" ]; then
echo "错误: 文件 $HOST_LIST 不存在."
exit 1
fi
# 读取主机列表并修改 hostname
while IFS=$'\t' read -r ip new_hostname
do
echo "正在修改主机 $ip 的 hostname 到 $new_hostname ..."
# 使用 SSH 执行远程命令
ssh "$ip" << EOF
# 更新 /etc/hostname
echo "$new_hostname" > /etc/hostname
# 更新 /etc/hosts 文件中的 hostname(如果有)
sed -i "s/^$(hostname)/$new_hostname/g" /etc/hosts
# 重启网络服务或 hostname 服务
# 根据不同的 Linux 发行版,可能需要不同的命令
# 例如,对于基于 systemd 的系统:
systemctl restart systemd-hostnamed
# 或者对于使用 /etc/init.d 的系统:
# /etc/init.d/networking restart
# /etc/init.d/hostname restart
# 退出 SSH
EOF
echo "主机 $ip 的 hostname 已成功修改为 $new_hostname."
done < "$HOST_LIST"
echo "所有主机的 hostname 修改完成."
脚本说明:
while
循环逐行读取主机列表文件,每行解析出 IP 地址和新的 hostname。/etc/hostname
文件。sed
命令更新 /etc/hosts
文件中所有旧的主机名。为了使脚本能够自动在多台主机上执行命令,需要在执行脚本的主机上配置对目标主机的 SSH 无密码登录。以下是配置步骤:
生成 SSH 密钥对(如果尚未生成):
ssh-keygen -t rsa
按提示操作,默认情况下会生成 ~/.ssh/id_rsa
和 ~/.ssh/id_rsa.pub
。
将公钥复制到目标主机:
使用 ssh-copy-id
命令将公钥复制到每台目标主机的 authorized_keys
文件中。可以在脚本中自动化这一过程:
#!/bin/bash
HOST_LIST=$1
if [ $# -ne 1 ]; then
echo "用法: $0 hosts_list.txt"
exit 1
fi
if [ ! -f "$HOST_LIST" ]; then
echo "错误: 文件 $HOST_LIST 不存在."
exit 1
fi
while IFS=$'\t' read -r ip new_hostname
do
echo "正在配置 SSH 无密码登录到 $ip ..."
ssh-copy-id -i ~/.ssh/id_rsa.pub user@$ip
if [ $? -ne 0 ]; then
echo "错误: 无法配置 SSH 无密码登录到 $ip."
exit 1
fi
echo "SSH 无密码登录已配置到 $ip."
done < "$HOST_LIST"
echo "所有主机的 SSH 无密码登录配置完成."
注意:替换 user
为目标主机上的实际用户名。如果目标主机使用不同的端口或需要指定密钥文件,可以使用 -p
和 -i
选项,例如:
ssh-copy-id -p 2222 -i ~/.ssh/id_rsa.pub user@$ip
测试 SSH 无密码登录:
手动测试是否可以通过 SSH 无密码登录到目标主机:
ssh user@192.168.1.10
如果无需输入密码即可登录,则配置成功。
确保脚本具有执行权限,然后运行脚本:
chmod +x batch_rename_hostname.sh
./batch_rename_hostname.sh hosts_list.txt
示例输出:
正在配置 SSH 无密码登录到 192.168.1.10 ...
正在配置 SSH 无密码登录到 192.168.1.11 ...
正在配置 SSH 无密码登录到 192.168.1.12 ...
SSH 无密码登录已配置到 192.168.1.10.
SSH 无密码登录已配置到 192.168.1.11.
SSH 无密码登录已配置到 192.168.1.12.
正在修改主机 192.168.1.10 的 hostname 到 new-hostname-1 ...
主机 192.168.1.10 的 hostname 已成功修改为 new-hostname-1.
正在修改主机 192.168.1.11 的 hostname 到 new-hostname-2 ...
主机 192.168.1.11 的 hostname 已成功修改为 new-hostname-2.
正在修改主机 192.168.1.12 的 hostname 到 new-hostname-3 ...
主机 192.168.1.12 的 hostname 已成功修改为 new-hostname-3.
所有主机的 hostname 修改完成.
权限问题:确保执行脚本的用户在目标主机上有足够的权限来修改 /etc/hostname
和 /etc/hosts
文件,通常需要 root 权限。因此,可能需要使用 sudo
。
修改脚本中的 SSH 命令,添加 sudo
:
ssh "$ip" << EOF
sudo sh -c 'echo "$new_hostname" > /etc/hostname'
sudo sh -c 'sed -i "s/^$(hostname)/$new_hostname/g" /etc/hosts'
sudo systemctl restart systemd-hostnamed
EOF ```
并确保目标主机允许通过 SSH 使用 `sudo` 而无需密码。可以在 `/etc/sudoers` 文件中添加相应的配置,例如:
```
your_username ALL=(ALL) NOPASSWD: /bin/systemctl restart systemd-hostnamed, /bin/echo *, /bin/sed *
```
使用 `visudo` 编辑 `/etc/sudoers` 文件以确保语法正确。
网络连通性:确保执行脚本的主机能够通过网络访问所有目标主机,并且防火墙设置允许 SSH 连接。
Hostname 格式:新的 hostname 应符合系统的命名规范,避免使用特殊字符或过长。
服务依赖:某些服务可能依赖于 hostname,修改 hostname 后可能需要重启这些服务以确保正常运行。
备份配置:在执行批量修改之前,建议备份 /etc/hostname
和 /etc/hosts
文件,以便在出现问题时恢复。
日志记录:可以将脚本的输出重定向到日志文件,以便后续查看。
./batch_rename_hostname.sh hosts_list.txt > rename_log.txt 2>&1
并行执行:如果主机数量较多,可以使用 GNU parallel
工具来并行执行脚本,提高效率。
首先安装 parallel
:
sudo apt-get install parallel # 对于基于 Debian 的系统
sudo yum install parallel # 对于基于 RHEL 的系统
修改脚本以使用 parallel
:
#!/bin/bash
HOST_LIST=$1
if [ $# -ne 1 ]; then
echo "用法: $0 hosts_list.txt"
exit 1
fi
if [ ! -f "$HOST_LIST" ]; then
echo "错误: 文件 $HOST_LIST 不存在."
exit 1
fi
cat "$HOST_LIST" | parallel -j 10 'ssh {} sh -c '\''echo "$2" > /etc/hostname'\'' && sed -i "s/^$(hostname)/$2/g" /etc/hosts && systemctl restart systemd-hostnamed'
运行脚本时传递新的 hostname 作为第二个参数:
./batch_rename_hostname.sh hosts_list.txt new-hostname
这里 -j 10
表示同时并行执行 10 个任务,可以根据实际情况调整。
通过以上步骤,您可以高效地批量修改多台 Linux 主机的 hostname。根据实际需求和环境,您可能需要调整脚本中的命令和服务重启方式。