基于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/hosts127.0.0.1 localhost192.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/networkNETWORKING=yesHOSTNAME=test.com |
二、查看hostname/fqdn
配置完成后,可以使用shell命令查看hostname和fqdn:
|
1
2
3
|
$ hostname && hostname -f florianflorian.test.com |
使用ping去测试hostname的ip映射是否成功。
|
1
2
3
4
|
$ ping florianPING florian.test.com (192.168.1.1) 56(84) bytes of data.$ ping florian.test.comPING 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 linux2Type "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 -f192.168.1.1192.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
|
$ pythonPython 2.6.6 (r266:84292, Dec 7 2011, 20:48:22) [GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2Type "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/hosts127.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
|
$ pythonPython 2.6.6 (r266:84292, Dec 7 2011, 20:48:22) [GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2Type "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/hosts127.0.0.1 localhost192.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; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 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: |
基于Python Shell获取hostname和fqdn释疑的更多相关文章
- 使用shell/python获取hostname/fqdn释疑
一直以来被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天专门抽时间把它们的使用细节弄清了. 一.设置hostname/fqdn 在Li ...
- 使用shell/python获取hostname/fqdn释疑(转)
一直以来被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天专门抽时间把它们的使用细节弄清了. 一.设置hostname/fqdn 在Li ...
- python执行shell获取硬件参数写入mysql
最近要获取服务器各种参数,包括cpu.内存.磁盘.型号等信息.试用了Hyperic HQ.Nagios和Snmp,它们功能都挺强大的,但是于需求不是太符,亦或者太heavy. 于是乎想到用python ...
- ShutIt:一个基于 Python 的 shell 自动化框架
ShutIt是一个易于使用的基于shell的自动化框架.它对基于python的expect库(pexpect)进行了包装.你可以把它看作是“没有痛点的expect”.它可以通过pip进行安装. Hel ...
- Python 基于python实现ADSL宽带帐号,密码的获取及宽带拨号
基于python实现ADSL宽带帐号的获取及宽带拨号 基本思想: 1.研究上网方式(实验环境为电信网线接入式ADSL,拨号方式PPPOE) 2.研究宽带帐号和密码生成规律(实验环境,宽带帐号为 ...
- 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)
目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构 前言 学习Python也有一个半月时间了,学到现在感觉 ...
- 基于Python的Flask的开发实战(第二节程序的基本结构)
1.初始化 所有的flask程序都必须创建一个程序实例 web服务器使用wsgi接口协议,把接收客户端的请求都转发给这个程序实例来进行处理.这个程序实例就是flask对象 from flask imp ...
- Python 基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现
基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现 by:授客 QQ:1033553122 测试环境 功能需求 实现思路 代码实践(关键技术点实现) 代码模块组织 ...
- 性能测试 基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程
基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程 By: 授客 QQ:1033553122 1. 测试环境 2. 实现功能 3. 使用前提 4. ...
随机推荐
- [UE4]目标是Pawn、Get Player Character
“目标是Pawn”表示这一个定义继承与Pawn类的方法. 这样可以很清楚的看到这个是方法是在什么地方定义的 “Get Player Character”可以获得当前控制的角色实例,可以转换成真正具体的 ...
- Oracle中分页查询和联表查询
1.使用ROWNUM伪列查询 1.1.查询十条数据(rownum<=n) SELECT ROWNUM,A.* FROM v_sjjx_unit_info A WHERE ROWNUM<=1 ...
- BCGcontrolBar(一) MFC界面库简介
原帖地址:http://blog.csdn.net/zw514159799/article/details/9148385 英文原文:http://www.bcgsoft.com/bcgcontrol ...
- 运行inetmgr提示“找不到文件”无法打开IIS管理器的解决办法
运行inetmgr提示“找不到文件”无法打开IIS管理器的解决办法 不知道什么时候开始运行inetmgr就提示找不到文件了,本以为是IIS坏了,这两天发现IIS服务还是可以运行的,只是运行inetmg ...
- php 流程控制switch实例
switch允许对一个标量(表达式)的多个可能结果做选择. 语法: switch (expr) { case result1: statement1 break; case result2: stat ...
- virtualenv之python虚拟环境
virtualEnv可以方便的解决不同项目中,对类库的依赖问题.首先将常用的类库安装在系统环境中,然后为每个项目安装独立的类库环境.这样子可以保证每个项目都运行在独立的类库环境中. virtualen ...
- python对象转字典
1.基础实现 class TestDict: name = "wyb" age = " def __init__(self): self.gender = 'male' ...
- java基础:关于java流与文件操作
1.描述:流是字节数据或字符数据序列.Java采用输入流对象和输出流对象来支持程序对数据的输入和输出.输入流对象提供了数据从源点流向程序的管道,程序可以从输入流对象读取数据:输出流对象提供了数据从程序 ...
- msq_table's methods
-- 查看有哪些用户 host: % 代表任意地址都可以登录 host: localhost 代表仅本地可以连接select host,user from mysql.user; -- 建库 crea ...
- uva-10050-模拟水题
一个社会研究组织决定通过一组简单的参数来模拟国家政党的行为.第一个参数一个正整数h(叫做罢工参数),用于指示在对应的政党在俩个连续休假之间的平均天数.虽然这个参数太简单了,它不是最完美的参数.但是它还 ...