【问题标题】:Adding host name to /etc/hosts in Linux在 Linux 中将主机名添加到 /etc/hosts
【发布时间】:2011-07-05 21:49:32
【问题描述】:

有没有一种简单的方法可以在系统启动时自动将 DHCP 发布的 IP 地址和 Linux 机器的主机名添加到 /etc/hosts 中?

背景:
我的 Linux 机器在 /etc/hostname 中有一个主机名,当我 ping 时它不会解析任何内容。我在 /etc/hosts 中手动添加了我的主机名和 IP 地址,以便我的网络相关 Java 程序能够正常工作。

【问题讨论】:

  • 如果您需要 DNS 解析,这通常是 DHCP 服务器配置的一部分——将信息传送到 DNS 服务器。
  • 它不是真正的 DNS 解析。我想使用一个主机名,并且能够使用该主机名从同一台机器上 ping 通(而不是从该机器外部)。这就是我依赖 /etc/hosts 的原因。

标签: linux networking ubuntu


【解决方案1】:

在 Ubuntu 中,将可执行文件添加到 /etc/network/if-up.d 目录中。此目录中的文件在网络管理器配置网络接口后执行。

您可以修改以下脚本:

#!/bin/sh

set -e

if [ "$IFACE" = lo ]; then
    exit 0
fi

myHostName=`hostname`

# Remove current line with hostname at the end of line ($ means end of line)
sed -i '/'$myHostName'$/ d' /etc/hosts

ipaddr=$(ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}')
echo "$ipaddr $myHostName" >>/etc/hosts

【讨论】:

  • 我有一个问题,这适用于哪个 Linux 版本 我们可以为每个 Linux/Mac/Windows 系统创建多版本脚本吗?为跨平台做更好的想法。
  • 我设法使用以下单行代码简化了 ipaddr 断言:ifconfig | awk -F" +|:" '/inet addr/ && $4 != "127.0.0.1" {print $4}'
【解决方案2】:

dhcpcd 有一个-c/--script 选项,可以在配置或启动界面时运行外部脚本。您可以使用它来使用配置的主机名手动更新主机文件。

【讨论】:

  • 我有一个进程'dhcpcpclient3'。这和dhcpd一样吗?如果是这样,我在哪里更改配置以指定脚本?谢谢。
  • /etc/dhcp3 有它的所有配置文件。 -c 选项用于直接从命令行调用它。对于基于配置文件的更改,它将是主 dhclient.conf 中的 script 选项
  • 现在 /etc/dhcp3/dhclient.conf 中的“脚本”部分已被注释掉。我将在那里传递我自己的脚本来更新 /etc/hosts。这个“脚本”和/sbin/dhclient-script 之间有什么关系吗? /etc/dhcp3/dhclient.conf 中的“脚本”条目是否需要遵循任何特殊约定,还是只是任何 shell 脚本?谢谢。
  • 脚本应该只是一个普通的 shell 脚本,它的参数是来自新的 dhcp 设置的数据。至于其余的,不确定 - 以前不需要 dhcp 覆盖脚本。我的 /sbni/dhclient-script 似乎是初始 dhcp 设置的一部分,并且有一堆帮助脚本 - 不过不确定它是从哪里调用的。
  • 我终于找到了一个好方法。 dhcp 退出挂钩。我编写了一个脚本并将其放在 exit-hooks 目录中,并在 dhcp 租约后执行。谢谢。
【解决方案3】:

使用avahi(应该在您的发行版存储库中),然后您可以

$ ping youhostname.local

【讨论】:

    【解决方案4】:

    我把@Markus 所做的事情放到了一个普通的脚本中。这适用于我的 Fedora 20 盒子:

    #!/bin/sh
    
    MYHOST=firtree
    
    echo "before:"
    cat /etc/hosts
    
    # Remove current line with hostname at the end of line ($ means end of line)
    sed -i '/'$MYHOST'$/ d' /etc/hosts
    
    echo "after remove: "
    cat /etc/hosts
    
    IPADDR=$(ifconfig | awk -F" +|:" '/inet addr/ && $4 != "127.0.0.1" {print $4}')
    echo "$IPADDR $MYHOST" >>/etc/hosts
    
    echo "ip: " $IPADDR
    echo "final: "
    cat /etc/hosts
    

    这必须以 root 身份运行,并且可能应该放在 init.d 文件夹中。

    【讨论】:

    • 不好,如果 127 包含 127(例如 192.168.4.127),则 ungrepping 127 可能会丢弃实际地址,更好地改写或使用这个单行:ifconfig | awk -F" +|:" '/inet addr/ && $4 != "127.0.0.1" {print $4}'
    • 好收获。更新。谢谢!
    【解决方案5】:

    来自

    ipaddr=$(ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}’)
    host=`hostname`
    fhost=`hostname -f`
    
    echo "$ipaddr $fhost $host" >> /etc/hosts
    
    cat /etc/hosts
    

    【讨论】:

      【解决方案6】:

      我个人使用这个脚本来设置我的主机名(现有的)+动态IP为/etc/hosts文件:

      #!/bin/bash
      ipaddr=$(/sbin/ifconfig eth0| grep 'inet addr' | cut -d: -f2 | awk '{print $1}')
      hn=$(hostname)
      hnd=$(hostname -f)
      sed -i '2s/.*/'$ipaddr'  '$hnd'   '$hn'/' /etc/hosts
      

      亲切的问候,

      【讨论】:

        【解决方案7】:

        您可以使用下面的独特命令来执行此操作:

        sudo sh -c -e "echo '$(hostname -I | awk '{print $1}') youhostname.local' >> /etc/hosts"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-10
          • 2020-07-01
          • 2014-10-06
          • 2019-04-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多