一直以来被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地址形式了。

四、参考资料

  • Linux下配置FQDN: https://onebitbug.me/2014/06/25/settings-fqdn-in-linux/
  • linux基础:设置FQDN和Hostname: http://www.chenshake.com/linux-foundation-set-fqdn-hostname/
  • Is it valid for a hostname to start with a digit?: http://serverfault.com/questions/638260/is-it-valid-for-a-hostname-to-start-with-a-digit

http://www.cnblogs.com/fanzhidongyzby/p/5154443.html

转载于:https://www.cnblogs.com/softidea/p/5155895.html

使用shell/python获取hostname/fqdn释疑(转)相关推荐

  1. python+shell 批量获取服务器信息并且生成excel表

    我们工作中,经常需要获取服务器的一些信息,包括软件的和硬件的.例如刚刚接收的服务器,需要批量获取信息确认硬件配置是否符合我们需求,或者维护很长时间的服务器,中间变动了很多,但是服务器信息没有更改,这个 ...

  2. python获取主机ip_Python 获取本地主机 hostname 和 IP 地址的简单方法

    Python 获取本地主机 hostname 很简单,一行代码就能搞定.获取 IP 地址也一样简单,下面分享一下这些方法.都很简单,基本都是通过 Python 的 socket 库来进行获取的.Pyt ...

  3. Python 获取windows桌面路径的5种方法小结

    今天小编就为大家分享一篇Python 获取windows桌面路径的5种方法小结,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 这里介绍了5中python获取window桌面路径的方法 ...

  4. 在Linux上利用python获取本机ip

    下面介绍在Linux上利用python获取本机ip的方法. 经过网上调查, 发现大致有两种方法, 一种是调用shell脚本,另一种是利用python中的socket等模块来得到,下面是这两种方法的源码 ...

  5. 使用 Python 获取 Linux 系统信息的代码

    From: http://www.jb51.net/article/52107.htm 在本文中,我们将会探索使用Python编程语言工具来检索Linux系统各种信息,需要的朋友可以参考下 哪个Pyt ...

  6. 使用Python获取Linux系统的各种信息

    From: http://www.jb51.net/article/52058.htm 这篇文章主要介绍了使用Python获取Linux系统的各种信息,例如系统类型.CPU信息.内存信息.块设备等,需 ...

  7. python相对路径下的shell_shell,python获取当前路径(脚本的当前路径) (aso项目记录)...

    一.shell获取脚本当前路径 cur_dir=$(cd "$(dirname "$0")"; pwd) #获取当前脚本的绝对路径,参数$0是当前脚本对象 等同 ...

  8. python自动保存ping结果_利用python获取Ping结果示例代码

    前言 本文主要跟大家分享了关于利用python获取Ping结果的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧. 示例代码: # -*- coding: utf-8 -*- i ...

  9. linux下载python的地址_Linux下Python获取IP地址的代码

    <lnmp一键安装包>中需要获取ip地址,有2种情况:如果服务器只有私网地址没有公网地址,这个时候获取的IP(即私网地址)不能用来判断服务器的位置,于是取其网关地址用来判断服务器在国内还是 ...

最新文章

  1. JavaScript脚本中 getElementById 返回值总是为空
  2. Python 读取接口数据 返回JSON
  3. 笨办法学python47 原理_41:学会说面向对象
  4. python那么慢为什么还有人用-Python执行效率慢,为什么还这么火?【黑马程序员】...
  5. 【noiOJ】P1996
  6. Java 求分段函数g(x)的值
  7. Eclipse设定文件的默认打开方式
  8. 函数 devm_kzalloc()
  9. python编程入门到实践笔记习题_Python编程从入门到实践笔记——列表简介
  10. 中断处理函数_ARM的中断处理 [二]
  11. MySQL_数据类型
  12. Dubbo基础知识总结
  13. SQL Server中并行执行计划的基础
  14. 大数据“重磅炸弹”:实时计算框架 Flink
  15. mysql 相关记录
  16. enum是java关键字吗_enum是java关键字吗?
  17. android 包名工具,查看包名(安卓应用包名查看工具)
  18. 谷歌最新版本浏览器如何兼容flash插件
  19. 夏天摆地摊,卖什么产品赚钱比较快呢?
  20. 2022年全球及中国多功能压力锅市场份额预测与投资竞争格局调查报告

热门文章

  1. 二进制补码以及为什么要使用补码
  2. LINUX下的LVM逻辑卷管理器
  3. 自动化部署之git merge和git rebase的区别
  4. phalapi-进阶篇3(自动加载和拦截器)
  5. C++添加一个头文件和extern以及全局变量和局部变量问题(清C++蓝书16.3.19上机的一小题)...
  6. Header First设计模式学习笔记——单例模式
  7. linux软件安装方法
  8. 修改jupyter notebook的默认工作目录
  9. Leetcode 261.以图判树
  10. h5 宽度全屏自适应