基于Python Shell获取hostname和fqdn释疑


Posted in Python onJanuary 25, 2016

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

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

利用 socket 模块 里的 gethostbyname 函数

<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; background-color: rgb(238, 238, 238);"><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 命令

<code class="hljs livecodeserver 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;">def getHostName(ip): <span class="hljs-command" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">command</span> = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'java -jar %s %s "hostname > %s.hostname"'</span> %(<span class="hljs-title" style="box-sizing: border-box;">remoteCmdLoca</span>,<span class="hljs-title" style="box-sizing: border-box;">ip</span>,<span class="hljs-title" style="box-sizing: border-box;">ip</span>)</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">result</span> = subprocess.call(<span class="hljs-command" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">command</span>, <span class="hljs-title" style="box-sizing: border-box;">shell</span>=<span class="hljs-title" style="box-sizing: border-box;">True</span>)</span> <span class="hljs-command" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">command</span> = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'%s -q -r -pw Sybase123 %s root@%s:/root'</span> % (<span class="hljs-title" style="box-sizing: border-box;">pscpLoca</span>, <span class="hljs-title" style="box-sizing: border-box;">pscpLoca</span>, <span class="hljs-title" style="box-sizing: border-box;">ip</span>)</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">result</span> = subprocess.call(<span class="hljs-command" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">command</span>, <span class="hljs-title" style="box-sizing: border-box;">shell</span>=<span class="hljs-title" style="box-sizing: border-box;">True</span>)</span> <span class="hljs-command" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">command</span> = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'%s -q -r -pw Sybase123 root@%s:/root/%s.hostname %s'</span> %(<span class="hljs-title" style="box-sizing: border-box;">pscpLoca</span>,<span class="hljs-title" style="box-sizing: border-box;">ip</span>,<span class="hljs-title" style="box-sizing: border-box;">ip</span>,<span class="hljs-title" style="box-sizing: border-box;">sumAutoLoca</span>)</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">result</span> = subprocess.call(<span class="hljs-command" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">command</span>, <span class="hljs-title" style="box-sizing: border-box;">shell</span>=<span class="hljs-title" style="box-sizing: border-box;">True</span>)</span> fileName = sumAutoLoca + ip + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'.hostname'</span> readFile = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">open</span>(fileName,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'r'</span>) hostnameInfo = str(readFile.readline().strip(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'\n'</span>)) readFile.<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">close</span>() subprocess.call(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'rm '</span>+ fileName, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>=True) print <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"=========%s hostname is %s========"</span> %(ip,hostnameInfo) <span class="hljs-constant" style="box-sizing: border-box;">return</span> hostnameInfo</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; background-color: rgb(238, 238, 238);"><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><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

设计思路 ##

有时候socket不太稳定, 具体原因带查明

目的: 根据 ip 获取 hostname (适当改进也可逆转)

先设计了一个远程执行 ssh 命令jar, 或者可以用plink, 链接enter link description here

利用subprocess.call命令在远程ip机器上执行hostname > %s.hostname命令, 将hostname 信息输出到文件

用pscp将本地的pscp文件复制到远程ip机器上 /root 目录下(后来发现这步不需要)

然后利用本地的 pscp 将远程机器上带有hostname的文本文件/root/%s.hostname 复制到本地

利用 python 的文本读取功能读取信息, 从中取出hostname字符串

再利用 rm 命令把远程机器和本地的文本文件都删除

Python 相关文章推荐
Python求算数平方根和约数的方法汇总
Mar 09 Python
使用Python微信库itchat获得好友和群组已撤回的消息
Jun 24 Python
python实现给scatter设置颜色渐变条colorbar的方法
Dec 13 Python
python使用matplotlib画柱状图、散点图
Mar 18 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
python+rsync精确同步指定格式文件
Aug 29 Python
Python使用Numpy模块读取文件并绘制图片
May 13 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
python 数据类型强制转换的总结
Jan 25 Python
pytorch常用数据类型所占字节数对照表一览
May 17 Python
Python 数据结构之十大经典排序算法一文通关
Oct 16 Python
21行Python代码实现拼写检查器
Jan 25 #Python
Python字符串、元组、列表、字典互相转换的方法
Jan 23 #Python
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 #Python
Python爬虫模拟登录带验证码网站
Jan 22 #Python
Fiddler如何抓取手机APP数据包
Jan 22 #Python
Python爬虫抓取手机APP的传输数据
Jan 22 #Python
Python 列表排序方法reverse、sort、sorted详解
Jan 22 #Python
You might like
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
js 简易版滚动条实例(适用于移动端H5开发)
2017/06/26 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
python操作xml文件示例
2014/04/07 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
python selenium操作cookie的实现
2020/03/18 Python
Python类及获取对象属性方法解析
2020/06/15 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
小学生竞选班干部演讲稿
2014/04/24 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL