使用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地址形式了。

四、参考资料

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

时间: 2024-10-26 12:44:35

使用shell/python获取hostname/fqdn释疑(转)的相关文章

使用python获取webservice数据并输出到文件

上头要求设置TCP备案检查,给了个WEBSERVICE接口.查了2天,才确认还是python比较好用,我这水平也就写个脚本把数据导出,过滤检索还是用的shell.写此文备忘.WEBSERVICE接口脚本如下: #! /usr/bin/python #coding:utf-8 import codecs import suds def main(file_name, out_file): url = 'http://121.14.4.210:8088/icpautobj/ws/getIcp?wsd

python 获取linux的内存信息

1.安装psutil源码 https://pypi.python.org/pypi?:action=display&name=psutil#downloads 找到psutil-5.2.2.tar.gz 点击即可下载 shell # tar xzvf psutil-5.2.2.tar.gz shell # cd psutil-5.2.2 shell # python setup.py install 2.使用psutil获取内存信息 终端输入python shell # python Pytho

Linux 项目 shell 自动获取报告本机IP (1) | 通过shell 自动获取报告本机IP

由于电脑设置静态IP经常出现链接不上网络,动态IP又非常不方便,故有了这个想法并实现 原理: Linux,包含PC机器,树莓派等,通过shell 自动获取报告本机IP  | 通过 Mutt+Msmtp邮箱发送 此次使用树莓派3B实现步骤: 1.安装mutt 和 Msmtp $ sudo apt -get install mutt //安装mutt,其他系统使用相应包管理 $ sudo apt-get install msmtp //安装msmtp,其他系统使用相应包管理 2.在/etc/Mutt

Python获取内网IP

Python 获取本机内网IP 本文记录使用Python获取本机IP的两种方法. 通过hostname来获取本机IP import socket print(socket.gethostbyname(socket.gethostname())) 此方法是先获取hostname,然后在通过hostname来查看本机的IP.不推荐此方法,因为若是在/etc/hosts中将hostnam设置为127.0.0.1,那么获取到的就是127.0.0.1,而非本机的真实IP. 通过UDP获取本机IP impo

python获取微信公共平台消息列表和用户头像

转载需注明原文地址:http://blog.csdn.net/btyh17mxy/article/details/25207889 刚写的模拟登陆的方式从获取微信公众平台消息列表和用户头像的库,之后还会继续增加相关功能,github地址https://github.com/btyh17mxy/wxwall #!/usr/bin/env python # coding: UTF-8 import json import hashlib import re import random import

Python网络编程小例子:使用python获取网站域名信息

Whois简介 whois(读作"Who is",非缩写)是用来查询域名的IP以及所有者等信息的传输协议.简单说,whois就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人.域名注册商).通过whois来实现对域名信息的查询.早期的whois查询多以命令列接口存在,但是现在出现了一些网页接口简化的线上查询工具,可以一次向不同的数据库查询.网页接口的查询工具仍然依赖whois协议向服务器发送查询请求,命令列接口的工具仍然被系统管理员广泛使用.whois通常

python 获取当前日期 星期

from datetime import datetime d =datetime.today()     #获取当前日期时间 d.isoweekday()           #获取时间周几 python 获取当前日期 星期,布布扣,bubuko.com

Python获取当地的天气和任意城市的天气

先从中国天气网得到数据('http://www.weather.com.cn/data/cityinfo/'+城市编码),每个城市都有各自的编码,如何得到用户所在地的城市编码呢?用一个网页就是专门干这个的!http://61.4.185.48:81/g/ 附录:所有城市的编码 101010100=北京 101010200=海淀 101010300=朝阳 101010400=顺义 101010500=怀柔 101010600=通州 101010700=昌平 101010800=延庆 1010109

Python 获取接口数据,解析JSON,写入文件

Python 获取接口数据,解析JSON,写入文件 用于练手的例子,从国家气象局接口上获取JSON数据,将它写入文件中,并解析JSON: 总的来说,在代码量上,python代码量要比java少很多.而且python看起来更直观一些: 以下是代码: import types import urllib2 import json duan ="--------------------------" #在控制台断行区别的 #利用urllib2获取网络数据 def registerUrl():