静态主机名不会改变 Ubuntu 20.04

静态主机名不会改变 Ubuntu 20.04

我从 18.04 升级到了 20.04。我的主机名有一个下划线 ( My_PC)。现在,在我的终端中,它显示sudo: unable to resolve host MyPC: Name or service not known

我试过:

hostnamectl set-hostname My_PC

那没有用。

My_PC在我的 /etc/hosts 文件中,不是 MyPC

127.0.0.1 localhost My_PC

cat /etc/hostname显示: My_PC

me@MyPC:~$ hostnamectl
  Static hostname: MyPC <--- WHY??????
  Pretty hostname: My_PC
  Icon name: computer-laptop
  Chassis: laptop

直到我升级后,我的终端才出现此错误。发生了什么?

答案1

_是主机名中的非法字符。请参阅此关联 我不确定为什么 18.04 没有拒绝它。

答案2

请勿在生产环境或无法轻松物理访问的系统上尝试此操作。

如果你不介意将来某个随机时间点破坏某些东西,那么我在容器 (22.04 guest) 中就是这样做的:(
请参阅下面的一种稍微简单一点的方法,该方法仅在容器外部有效)

  • 编写一个小的 C 程序来调用sethostname()系统调用包装器:
#include <stdio.h>
#include <unistd.h>

int main()
{
    char hostname[] = "hostname_with_underscores";
    sethostname(hostname, sizeof(hostname));
}
  • 编译它:gcc -Wall -Wextra fix_hostname.c -o fix_hostname

  • 尝试一下是否可行:sudo ./fix_hostname。您应该在新打开的终端或新执行的 shell 中看到新设置的主机名。如果不行:不要继续,这只会破坏一些东西。

  • 如果它确实有效:将程序复制到例如 /usr/sbin/fix_hostname

  • 编写一个服务以在系统启动时运行该程序,例如 /etc/systemd/system/fix_hostname.service:(源自“/etc/rc.local Compatibility”单元文件。请参阅https://www.freedesktop.org/software/systemd/man/systemd.service.html用于一般的单元文件文档。)

[Unit]
Description=run fix_hostname on startup
After=networkd-dispatcher.service

[Service]
Type=oneshot
ExecStart=/usr/sbin/fix_hostname

[Install]
WantedBy=multi-user.target
  • 启用服务:sudo systemctl enable fix_hostname

  • 禁用与主机名相关的所有内容(我的系统似乎需要):systemctl disable systemd-hostnamed.service; systemctl disable dbus-org.freedesktop.hostname1.service

  • 重启。希望它能正常工作。


如果你的系统不在容器内,那么可以使用以下名为 fix_hostname 的 shellscript,而不是编译 C 程序:

#!/bin/sh

echo "hostname_with_underscores" > /proc/sys/kernel/hostname

chmod +x fix_hostaname如果可行,不要忘记使其可执行( )并将其复制到例如 /usr/sbin/fix_hostname;继续上述说明。

相关内容