• 基于Python Shell获取hostname和fqdn释疑


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

    一、设置hostname/fqdn

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

    $ hostname florian

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

    1
    2
    3
    $ 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配置保持一致:

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

    二、查看hostname/fqdn

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

    1
    2
    3
    $ hostname && hostname -f
    florian
    florian.test.com

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

    1
    2
    3
    4
    $ 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。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ 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,此时会有些不同。

    1
    2
    3
    4
    $ 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!!!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ 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文件的第二行注释:

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

    刷新dns缓存:

    $ service nscd reload

    我们发现fqdn恢复正常了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ 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内尽可能靠前的位置添加如下配置:

    1
    2
    3
    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地址形式了。

    下面给大家介绍python shell 根据ip 获取 hostname || 根据hostname 获取 ip

    利用 socket 模块 里的 gethostbyname 函数

    1
    <code class="hljs perl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">>>> import <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">socket</span> >>> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">socket</span>.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">gethostbyname</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"www.baidu.com"</span>) <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'61.135.169.125'</span> >>> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">socket</span>.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">gethostbyname</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"rs.xidian.edu.cn"</span>) <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'202.117.119.1'</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right- 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

     

    方法2 利用 shell 中 hostname 命令

    1
    <code class="hljs livecodeserver has-numbering" style="display: block; padding:
  • 相关阅读:
    [BZOJ1143/2718]祭祀river/毕业旅行
    [BZOJ4403]序列统计
    [BZOJ2006][NOI2010]超级钢琴
    [BZOJ2005][NOI2010]能量采集
    [BZOJ3631][JLOI2014]松鼠的新家
    第一个spring,总结!
    第一个spring,第五天。
    第一次spring,第三天。
    第一个spring,第一天。
    软件工程课程设计——第一个Spring
  • 原文地址:https://www.cnblogs.com/sthu/p/10598940.html
Copyright © 2020-2023  润新知