linux hostname命令

提示:hostname命令用于显示和设置系统的主机名,主机名在网络中用于标识计算机的唯一名称。

命令简介

hostname 是Linux系统中用于显示或设置系统主机名的命令。主机名在网络环境中非常重要,它用于标识网络中的计算机,使其他设备能够通过名称而不是IP地址来访问该计算机。主机名分为三种类型:静态主机名(static)、临时主机名(transient)和灵活主机名(pretty)。

命令语法

# 显示主机名
hostname [选项]

# 设置主机名
hostname [选项] 新主机名

常用选项

选项 说明
-a, --alias 显示主机的别名
-A, --all-fqdns 显示所有FQDN(完全限定域名)
-b, --boot 如果未设置主机名,则设置默认主机名
-d, --domain 显示DNS域名
-f, --fqdn, --long 显示FQDN(完全限定域名)
-F, --file 文件 从指定文件读取主机名
-h, --help 显示帮助信息
-i, --ip-address 显示主机的IP地址
-I, --all-ip-addresses 显示主机的所有IP地址
-s, --short 显示短主机名(不显示域名部分)
-V, --version 显示版本信息
-y, --yp, --nis 显示NIS域名

主机名类型

类型 说明 配置文件
静态主机名
static
系统启动时从配置文件读取的主机名,由系统管理员设置,存储在配置文件中 /etc/hostname
临时主机名
transient
运行时动态设置的主机名,系统重启后会丢失,通常由DHCP或mDNS设置 运行时内核参数
灵活主机名
pretty
可以包含特殊字符和空格的主机名,用于显示给用户 /etc/machine-info

使用示例

示例1:基本使用

查看当前系统的主机名:

# 显示当前主机名
hostname

# 显示短主机名(不包含域名)
hostname -s

# 显示FQDN(完全限定域名)
hostname -f

# 显示DNS域名部分
hostname -d

示例2:显示网络信息

查看与主机名相关的网络信息:

# 显示主机的IP地址
hostname -i

# 显示所有IP地址
hostname -I

# 显示所有FQDN
hostname -A

# 显示主机别名
hostname -a

示例3:临时设置主机名

临时修改主机名(重启后失效):

# 查看当前主机名
hostname

# 临时设置新主机名
sudo hostname new-server-name

# 验证修改
hostname

示例4:永久设置主机名

不同Linux发行版的永久主机名设置方法:

# 方法1:使用hostnamectl命令(systemd系统)
sudo hostnamectl set-hostname new-server-name

# 方法2:直接修改配置文件
echo "new-server-name" | sudo tee /etc/hostname

# 方法3:使用sysctl命令(旧系统)
sudo sysctl kernel.hostname=new-server-name

# 方法4:使用hostname命令并保存到文件
sudo hostname new-server-name
sudo hostname > /etc/hostname

示例5:使用hostnamectl命令

systemd系统推荐使用hostnamectl管理主机名:

# 查看所有主机名信息
hostnamectl

# 设置静态主机名
sudo hostnamectl set-hostname "server.example.com"

# 设置灵活主机名(可包含空格和特殊字符)
sudo hostnamectl set-hostname --pretty "Production Server #1"

# 只设置临时主机名
sudo hostnamectl set-hostname --transient "temp-server"

# 查看特定类型的主机名
hostnamectl status --static
hostnamectl status --transient
hostnamectl status --pretty

示例6:从文件读取主机名

# 创建包含主机名的文件
echo "my-new-hostname" > /tmp/new-hostname.txt

# 从文件读取并设置主机名
sudo hostname -F /tmp/new-hostname.txt

# 验证
hostname

示例7:网络配置相关

# 显示NIS域名
hostname -y

# 如果未设置主机名,则设置默认主机名
sudo hostname -b

# 显示与主机名解析相关的信息
getent hosts $(hostname)

# 查看DNS解析
nslookup $(hostname)
dig $(hostname)

配置文件说明

/etc/hostname 文件

存储静态主机名的主配置文件:

# 查看文件内容
cat /etc/hostname
# 输出:server01

# 编辑文件(需要root权限)
sudo nano /etc/hostname
# 或
sudo vim /etc/hostname

/etc/hosts 文件

本地主机名解析文件,将主机名映射到IP地址:

# 典型配置示例
cat /etc/hosts
# 输出:
# 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
# ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# 192.168.1.100 server01.example.com server01

/etc/machine-info 文件

存储灵活主机名和其他机器信息:

# 查看文件内容
cat /etc/machine-info
# 可能包含:
# PRETTY_HOSTNAME="Production Web Server"
# ICON_NAME=computer-server
# CHASSIS=server

系统启动流程中的主机名设置

  1. 系统启动时,内核从/proc/sys/kernel/hostname读取初始主机名
  2. init系统(如systemd)读取/etc/hostname文件
  3. 如果/etc/hostname存在,则设置静态主机名
  4. 网络服务(如NetworkManager或systemd-networkd)可能根据DHCP响应设置主机名
  5. 最终主机名是静态主机名、临时主机名和灵活主机名的组合

注意事项

  1. 设置主机名后,需要更新/etc/hosts文件以确保本地解析正常工作
  2. 在DNS服务器中也需要添加相应的A记录或PTR记录
  3. 主机名应遵循RFC 1123标准:只包含字母、数字和连字符,不以连字符开头或结尾
  4. 对于生产服务器,建议使用FQDN(完全限定域名)作为主机名
  5. 使用hostname命令临时修改的主机名在重启后会丢失
  6. 在多网络接口的系统中,hostname -I会显示所有接口的IP地址
  7. 修改主机名后,某些服务可能需要重启才能识别新主机名
  8. 在容器环境中,主机名通常由容器运行时管理

故障排查

# 1. 检查当前所有类型的主机名
hostnamectl

# 2. 检查主机名解析
hostname -f
getent hosts $(hostname)

# 3. 检查DNS解析
nslookup $(hostname)
dig $(hostname) A

# 4. 检查相关配置文件
cat /etc/hostname
cat /etc/hosts
cat /etc/machine-info

# 5. 检查内核参数
sysctl kernel.hostname
cat /proc/sys/kernel/hostname

# 6. 检查网络服务是否覆盖主机名
# 对于NetworkManager
nmcli general hostname
# 对于systemd-networkd
networkctl status

# 7. 重启主机名服务(旧系统)
sudo service hostname restart
# 或
sudo systemctl restart systemd-hostnamed

在脚本中使用hostname

#!/bin/bash

# 获取主机名并存储在变量中
HOSTNAME=$(hostname)
SHORT_HOSTNAME=$(hostname -s)
FQDN=$(hostname -f)

echo "当前主机名: $HOSTNAME"
echo "短主机名: $SHORT_HOSTNAME"
echo "FQDN: $FQDN"

# 根据主机名执行不同操作
case $(hostname -s) in
    web*)
        echo "这是Web服务器"
        ;;
    db*)
        echo "这是数据库服务器"
        ;;
    *)
        echo "这是其他类型服务器"
        ;;
esac

# 检查主机名是否有效
if [[ ! $(hostname) =~ ^[a-zA-Z0-9.-]+$ ]]; then
    echo "错误: 主机名包含无效字符"
    exit 1
fi

# 自动生成基于主机名的配置
CONFIG_FILE="/etc/app/config-$(hostname -s).conf"
echo "生成配置文件: $CONFIG_FILE"

相关命令

  • hostnamectl - systemd系统的主机名管理工具
  • domainname - 显示或设置系统的NIS域名
  • dnsdomainname - 显示系统的DNS域名
  • sysctl - 查看和修改内核参数,包括主机名
  • uname - 显示系统信息,包括节点名(主机名)
  • nmcli - NetworkManager命令行工具,可管理主机名