根据您的需求,我将提供几种在不同环境下批量修改主机名的方法。
#!/bin/bash
# 定义新主机名列表,格式: IP或当前主机名 新主机名
HOSTS=(
"192.168.1.10 server01"
"192.168.1.11 server02"
"192.168.1.12 server03"
)
# SSH凭据
USER="your_username"
PASS="your_password" # 建议使用SSH密钥而非密码
for entry in "${HOSTS[@]}"; do
read -r ip new_hostname <<< "$entry"
echo "正在修改 $ip 的主机名为 $new_hostname"
# 使用sshpass传递密码(不推荐生产环境使用)
sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no $USER@$ip "
sudo hostnamectl set-hostname $new_hostname
echo '127.0.1.1 $new_hostname' | sudo tee -a /etc/hosts
echo '主机名已修改为: $(hostname)'
"
if [ $? -eq 0 ]; then
echo "$ip 修改成功!"
else
echo "$ip 修改失败!" >&2
fi
done
---
- hosts: all
become: yes
tasks:
- name: Set hostname
hostname:
name: "{{ new_hostname }}"
when: new_hostname is defined
- name: Ensure hostname is in /etc/hosts
lineinfile:
path: /etc/hosts
regexp: '^127\.0\.1\.1'
line: '127.0.1.1 {{ new_hostname }}'
state: present
when: new_hostname is defined
执行命令:
ansible-playbook -i inventory.ini change_hostname.yml -e "new_hostname=desired_hostname"
# 定义计算机名映射表
$computerMap = @{
"192.168.1.20" = "win-pc01"
"192.168.1.21" = "win-pc02"
"192.168.1.22" = "win-pc03"
}
$credential = Get-Credential
foreach ($entry in $computerMap.GetEnumerator()) {
$ip = $entry.Key
$newName = $entry.Value
try {
$session = New-PSSession -ComputerName $ip -Credential $credential -ErrorAction Stop
Invoke-Command -Session $session -ScriptBlock {
param($newName)
Rename-Computer -NewName $newName -Force -Restart:$false
} -ArgumentList $newName
Write-Host "$ip 的主机名已修改为 $newName" -ForegroundColor Green
Remove-PSSession $session
}
catch {
Write-Host "无法连接到 $ip 或修改失败: $_" -ForegroundColor Red
}
}
您需要根据实际环境调整上述脚本,特别是认证方式和主机名列表部分。