zoukankan      html  css  js  c++  java
  • 使用shell/python获取hostname/fqdn释疑

    一直以来被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天专门抽时间把它们的使用细节弄清了。

    一、设置hostname/fqdn

    在Linux系统内设置hostname很简单,如:

    $ hostname florian
    

    如果要设置fqdn的话,需要对/etc/hosts进行配置。

    $ cat /etc/hosts
    127.0.0.1 localhost
    192.168.1.1 florian.test.com florian
    

    /etc/hosts配置文件的格式是:

    ip fqdn [alias]...
    

    即第一列为主机ip地址,第二列为主机fqdn地址,第三列以后为别名,可以省略,否则至少要包含hostname。

    上述配置文件的配置项的第一行为localhost的配置,第二行为主机名florian配置fqdn=florian.test.com,ip=192.168.1.1。
    至于fqdn的域名后缀,最好和文件/etc/sysconfig/network的HOSTNAME配置保持一致:

    $ cat /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=test.com
    

    二、查看hostname/fqdn

    配置完成后,可以使用shell命令查看hostname和fqdn:

    $ hostname && hostname -f 
    florian
    florian.test.com
    

    使用ping去测试hostname的ip映射是否成功。

    $ ping florian
    PING florian.test.com (192.168.1.1) 56(84) bytes of data.
    
    $ ping florian.test.com
    PING florian.test.com (192.168.1.1) 56(84) bytes of data.
    

    也可以使用python命令获取hostname和fqdn。

    $ python 
    Python 2.6.6 (r266:84292, Dec  7 2011, 20:48:22) 
    [GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import socket
    >>> socket.gethostname()
    'florian'
    >>> socket.getfqdn()    
    'florian.test.com'
    

    三、使用ip设置hostname带来的fqdn问题

    以上描述了正常设置hostname和fqdn的方法,但是有时会使用ip地址直接作为hostname,此时会有些不同。

    $ hostname 192.168.1.1
    $ hostname && hostname -f
    192.168.1.1
    192.168.1.1
    

    我们发现使用ip作为hostname后,使用shell命令查询hostname和fqdn都是ip地址!!!这是因为DNS协议会解析hostname的内容,当发现其为ip地址时,则不会再去查询/etc/hosts文件。

    再使用python查看一下,会发现python获取的fqdn竟然还是florian.test.com!!!

    $ python
    Python 2.6.6 (r266:84292, Dec  7 2011, 20:48:22) 
    [GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import socket 
    >>> socket.gethostname()
    '192.168.1.1'
    >>> socket.getfqdn()
    'florian.test.com'
    

    即便是刷新dns缓存也无济于事:

    $ service nscd reload
    

    将/etc/hosts文件的第二行注释:

    cat /etc/hosts
    127.0.0.1 localhost
    # 192.168.1.1 florian.test.com florian
    

    刷新dns缓存:
    $ service nscd reload

    我们发现fqdn恢复正常了。

    $ python
    Python 2.6.6 (r266:84292, Dec  7 2011, 20:48:22) 
    [GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import socket 
    >>> socket.gethostname()
    '192.168.1.1'
    >>> socket.getfqdn()
    '192.168.1.1'
    

    之所以会有这样的行为,是因为python解析fqdn的逻辑和DNS并不完全一致,它会根据hostname查询对应的ip地址,然后在/etc/hosts内获取ip地址对应的配置行(第一行有效),然后解析fqdn列和alias列,并返回第一个包含字符'.'的对应列的值。

    因此,使用ip设置hostname时,需要注意两点:

    • 首先,将hostname设置为ip地址
    • 其次,将/etc/hosts内包含该ip的配置项移除

    为了保险起见,我们可以在/etc/hosts内尽可能靠前的位置添加如下配置:

    cat /etc/hosts
    127.0.0.1 localhost
    192.168.1.1 192.168.1.1
    

    这样,即便是之后有包含该ip的配置项也不会生效,python会优先解析第二行的配置项,并获取和ip地址完全一样的fqdn地址。当然,使用shell命令hostname获取fqdn也不会出错,因为hostname已经被设为ip地址形式了。

    四、参考资料

  • 相关阅读:
    显示Unicode 字节的对应字符的小技巧
    apktool 打包解包apk的总结
    Android Studio下载新的AVD映像把C盘给占满了
    微信开发记录
    node.js版本升级
    Cordova+FrameWork7开发简单教程
    centos安装 Falcon+
    centos7安装 go
    bash: /home/aprilpeng/.bashrc: Permission denied
    git push问题 objects/pack/tmp_pack_XXXXXX': Permission denied
  • 原文地址:https://www.cnblogs.com/fanzhidongyzby/p/5154443.html
Copyright © 2011-2022 走看看