2011-02-28 220 views
11

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

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

感谢,

+1

如果你想DNS解析,这通常是DHCP服务器配置的一部分 - 将信息传送到DNS服务器。 – 2011-02-28 16:37:21

+0

它不是一个真正的DNS解析。我想使用主机名,并且能够使用该主机名从相同的机器ping(而不是从该机器以外)。这就是为什么我依赖于/ etc/hosts。 – M99 2011-02-28 16:38:42

回答

5

的dhcpcd有-c/--script选项来运行一个外部脚本随时随地它配置或带来了一个接口。您可以使用它来手动更新具有配置的主机名的主机文件。

+0

我有一个进程'dhcpcpclient3'。这与dhcpd相同吗?如果是这样,我在哪里更改配置以指定脚本?谢谢。 – M99 2011-02-28 17:21:39

+0

'/ etc/dhcp3'具有它的所有配置文件。 -c选项用于直接从命令行调用它。对于基于配置文件的更改,它将是主dhclient.conf中的'script'选项 – 2011-02-28 18:46:44

+0

现在,/etc/dhcp3/dhclient.conf中的'script'部分被注释掉了。我将通过我自己的脚本来更新/ etc/hosts。这个'script'和/ sbin/dhclient-script之间有任何关系吗? /etc/dhcp3/dhclient.conf中的'脚本'条目是否需要遵循任何特殊约定或者它只是任何shell脚本?谢谢。 – M99 2011-02-28 19:07:00

1

使用avahi(这应该是在你的发行版的存储库),那么你可以

$ ping youhostname.local 
7

在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 
+0

我有一个问题,这将适用于哪个Linux版本我们可以为每个Linux/Mac/Windows系统创建多版本脚本? 对于跨平台来说,这是更好的选择。 – 2013-10-19 04:46:06

+0

我设法使用下面的一行来简化ipaddr声明:'ifconfig | awk -F“+ |:”'/ inet addr/&& $ 4!=“127.0.0.1”{print $ 4}'' – Yaron 2014-08-14 13:26:45

1

我把什么@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中应该去。

+0

不好,如果127的实际地址包含127(例如192.168.4.127) ,更好地改述或使用这一行:'ifconfig | awk -F“+ |:”'/ inet addr/&& $ 4!=“127.0.0.1”{print $ 4}'' – Yaron 2014-08-14 13:29:36

+1

好的。更新。谢谢! – 2014-08-15 13:45:11

0

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 
0

我个人使用这个剧本到我的主机名(现有的)+动态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 

亲切的问候,