linux

如何用脚本批量修改Linux hostname

小樊
49
2025-04-25 09:34:11
栏目: 智能运维

在 Linux 系统中,可以通过编写脚本来批量修改多个主机的 hostname。以下是一个使用 Bash 脚本的示例,该脚本可以在多台主机上同时修改 hostname。

步骤概述

  1. 准备主机列表:将所有需要修改的主机名和对应的 IP 地址(或主机名)保存在一个文件中,例如 hosts_list.txt
  2. 创建脚本:编写一个 Bash 脚本,读取主机列表并使用 ssh 连接到每台主机执行修改 hostname 的命令。
  3. 配置 SSH 无密码登录:为了自动化脚本执行,需要在执行脚本的主机上配置对目标主机的 SSH 无密码登录。

详细步骤

1. 准备主机列表

创建一个名为 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,使用制表符或空格分隔。

2. 创建 Bash 脚本

创建一个名为 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 修改完成."

脚本说明:

3. 配置 SSH 无密码登录

为了使脚本能够自动在多台主机上执行命令,需要在执行脚本的主机上配置对目标主机的 SSH 无密码登录。以下是配置步骤:

  1. 生成 SSH 密钥对(如果尚未生成):

    ssh-keygen -t rsa
    

    按提示操作,默认情况下会生成 ~/.ssh/id_rsa~/.ssh/id_rsa.pub

  2. 将公钥复制到目标主机

    使用 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
    
  3. 测试 SSH 无密码登录

    手动测试是否可以通过 SSH 无密码登录到目标主机:

    ssh user@192.168.1.10
    

    如果无需输入密码即可登录,则配置成功。

4. 执行脚本

确保脚本具有执行权限,然后运行脚本:

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 修改完成.

注意事项

  1. 权限问题:确保执行脚本的用户在目标主机上有足够的权限来修改 /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` 文件以确保语法正确。
  1. 网络连通性:确保执行脚本的主机能够通过网络访问所有目标主机,并且防火墙设置允许 SSH 连接。

  2. Hostname 格式:新的 hostname 应符合系统的命名规范,避免使用特殊字符或过长。

  3. 服务依赖:某些服务可能依赖于 hostname,修改 hostname 后可能需要重启这些服务以确保正常运行。

  4. 备份配置:在执行批量修改之前,建议备份 /etc/hostname/etc/hosts 文件,以便在出现问题时恢复。

扩展功能

通过以上步骤,您可以高效地批量修改多台 Linux 主机的 hostname。根据实际需求和环境,您可能需要调整脚本中的命令和服务重启方式。

0
看了该问题的人还看了