基于Python Shell获取hostname和fqdn释疑
一直以来被Linux的hostname和fqdn(FullyQualifiedDomainName)困惑了好久,今天专门抽时间把它们的使用细节弄清了。
一、设置hostname/fqdn
在Linux系统内设置hostname很简单,如:
$hostnameflorian
如果要设置fqdn的话,需要对/etc/hosts进行配置。
$cat/etc/hosts 127.0.0.1localhost 192.168.1.1florian.test.comflorian
/etc/hosts配置文件的格式是:
ipfqdn[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映射是否成功。
$pingflorian PINGflorian.test.com(192.168.1.1)56(84)bytesofdata. $pingflorian.test.com PINGflorian.test.com(192.168.1.1)56(84)bytesofdata.
也可以使用python命令获取hostname和fqdn。
$python Python2.6.6(r266:84292,Dec72011,20:48:22) [GCC4.4.620110731(RedHat4.4.6-3)]onlinux2 Type"help","copyright","credits"or"license"formoreinformation. >>>importsocket >>>socket.gethostname() 'florian' >>>socket.getfqdn() 'florian.test.com'
三、使用ip设置hostname带来的fqdn问题
以上描述了正常设置hostname和fqdn的方法,但是有时会使用ip地址直接作为hostname,此时会有些不同。
$hostname192.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 Python2.6.6(r266:84292,Dec72011,20:48:22) [GCC4.4.620110731(RedHat4.4.6-3)]onlinux2 Type"help","copyright","credits"or"license"formoreinformation. >>>importsocket >>>socket.gethostname() '192.168.1.1' >>>socket.getfqdn() 'florian.test.com'
即便是刷新dns缓存也无济于事:
$servicenscdreload
将/etc/hosts文件的第二行注释:
cat/etc/hosts 127.0.0.1localhost #192.168.1.1florian.test.comflorian
刷新dns缓存:
$servicenscdreload
我们发现fqdn恢复正常了。
$python Python2.6.6(r266:84292,Dec72011,20:48:22) [GCC4.4.620110731(RedHat4.4.6-3)]onlinux2 Type"help","copyright","credits"or"license"formoreinformation. >>>importsocket >>>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.1localhost 192.168.1.1192.168.1.1
这样,即便是之后有包含该ip的配置项也不会生效,python会优先解析第二行的配置项,并获取和ip地址完全一样的fqdn地址。当然,使用shell命令hostname获取fqdn也不会出错,因为hostname已经被设为ip地址形式了。
下面给大家介绍pythonshell根据ip获取hostname||根据hostname获取ip
利用socket模块里的gethostbyname函数
<codeclass="hljsperlhas-numbering"style="display:block;padding:0px;color:inherit;box-sizing:border-box;font-family:'SourceCodePro',monospace;font-size:undefined;white-space:pre;border-radius:0px;word-wrap:normal;background:transparent;">>>>import<spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">socket</span>>>><spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">socket</span>.<spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">gethostbyname</span>(<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">"www.baidu.com"</span>)<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">'61.135.169.125'</span>>>><spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">socket</span>.<spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">gethostbyname</span>(<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">"rs.xidian.edu.cn"</span>)<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">'202.117.119.1'</span></code><ulclass="pre-numbering"style="box-sizing:border-box;position:absolute;width:50px;top:0px;left:0px;margin:0px;padding:6px0px40px;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);"><listyle="box-sizing:border-box;padding:0px5px;">1</li><listyle="box-sizing:border-box;padding:0px5px;">2</li><listyle="box-sizing:border-box;padding:0px5px;">3</li><listyle="box-sizing:border-box;padding:0px5px;">4</li><listyle="box-sizing:border-box;padding:0px5px;">5</li></ul>
方法2利用shell中hostname命令
<codeclass="hljslivecodeserverhas-numbering"style="display:block;padding:0px;color:inherit;box-sizing:border-box;font-family:'SourceCodePro',monospace;font-size:undefined;white-space:pre;border-radius:0px;word-wrap:normal;background:transparent;">defgetHostName(ip):<spanclass="hljs-command"style="box-sizing:border-box;"><spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">command</span>=<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">'java-jar%s%s"hostname>%s.hostname"'</span>%(<spanclass="hljs-title"style="box-sizing:border-box;">remoteCmdLoca</span>,<spanclass="hljs-title"style="box-sizing:border-box;">ip</span>,<spanclass="hljs-title"style="box-sizing:border-box;">ip</span>)</span><spanclass="hljs-built_in"style="color:rgb(102,0,102);box-sizing:border-box;">result</span>=subprocess.call(<spanclass="hljs-command"style="box-sizing:border-box;"><spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">command</span>,<spanclass="hljs-title"style="box-sizing:border-box;">shell</span>=<spanclass="hljs-title"style="box-sizing:border-box;">True</span>)</span><spanclass="hljs-command"style="box-sizing:border-box;"><spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">command</span>=<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">'%s-q-r-pwSybase123%sroot@%s:/root'</span>%(<spanclass="hljs-title"style="box-sizing:border-box;">pscpLoca</span>,<spanclass="hljs-title"style="box-sizing:border-box;">pscpLoca</span>,<spanclass="hljs-title"style="box-sizing:border-box;">ip</span>)</span><spanclass="hljs-built_in"style="color:rgb(102,0,102);box-sizing:border-box;">result</span>=subprocess.call(<spanclass="hljs-command"style="box-sizing:border-box;"><spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">command</span>,<spanclass="hljs-title"style="box-sizing:border-box;">shell</span>=<spanclass="hljs-title"style="box-sizing:border-box;">True</span>)</span><spanclass="hljs-command"style="box-sizing:border-box;"><spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">command</span>=<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">'%s-q-r-pwSybase123root@%s:/root/%s.hostname%s'</span>%(<spanclass="hljs-title"style="box-sizing:border-box;">pscpLoca</span>,<spanclass="hljs-title"style="box-sizing:border-box;">ip</span>,<spanclass="hljs-title"style="box-sizing:border-box;">ip</span>,<spanclass="hljs-title"style="box-sizing:border-box;">sumAutoLoca</span>)</span><spanclass="hljs-built_in"style="color:rgb(102,0,102);box-sizing:border-box;">result</span>=subprocess.call(<spanclass="hljs-command"style="box-sizing:border-box;"><spanclass="hljs-keyword"style="color:rgb(0,0,136);box-sizing:border-box;">command</span>,<spanclass="hljs-title"style="box-sizing:border-box;">shell</span>=<spanclass="hljs-title"style="box-sizing:border-box;">True</span>)</span>fileName=sumAutoLoca+ip+<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">'.hostname'</span>readFile=<spanclass="hljs-built_in"style="color:rgb(102,0,102);box-sizing:border-box;">open</span>(fileName,<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">'r'</span>)hostnameInfo=str(readFile.readline().strip(<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">'\n'</span>))readFile.<spanclass="hljs-built_in"style="color:rgb(102,0,102);box-sizing:border-box;">close</span>()subprocess.call(<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">'rm'</span>+fileName,<spanclass="hljs-built_in"style="color:rgb(102,0,102);box-sizing:border-box;">shell</span>=True)print<spanclass="hljs-string"style="color:rgb(0,136,0);box-sizing:border-box;">"=========%shostnameis%s========"</span>%(ip,hostnameInfo)<spanclass="hljs-constant"style="box-sizing:border-box;">return</span>hostnameInfo</code><ulclass="pre-numbering"style="box-sizing:border-box;position:absolute;width:50px;top:0px;left:0px;margin:0px;padding:6px0px40px;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);"><listyle="box-sizing:border-box;padding:0px5px;">1</li><listyle="box-sizing:border-box;padding:0px5px;">2</li><listyle="box-sizing:border-box;padding:0px5px;">3</li><listyle="box-sizing:border-box;padding:0px5px;">4</li><listyle="box-sizing:border-box;padding:0px5px;">5</li><listyle="box-sizing:border-box;padding:0px5px;">6</li><listyle="box-sizing:border-box;padding:0px5px;">7</li><listyle="box-sizing:border-box;padding:0px5px;">8</li><listyle="box-sizing:border-box;padding:0px5px;">9</li><listyle="box-sizing:border-box;padding:0px5px;">10</li><listyle="box-sizing:border-box;padding:0px5px;">11</li><listyle="box-sizing:border-box;padding:0px5px;">12</li><listyle="box-sizing:border-box;padding:0px5px;">13</li><listyle="box-sizing:border-box;padding:0px5px;">14</li></ul>
设计思路##
有时候socket不太稳定,具体原因带查明
目的:根据ip获取hostname(适当改进也可逆转)
先设计了一个远程执行ssh命令jar,或者可以用plink,链接enterlinkdescriptionhere
利用subprocess.call命令在远程ip机器上执行hostname>%s.hostname命令,将hostname信息输出到文件
用pscp将本地的pscp文件复制到远程ip机器上/root目录下(后来发现这步不需要)
然后利用本地的pscp将远程机器上带有hostname的文本文件/root/%s.hostname复制到本地
利用python的文本读取功能读取信息,从中取出hostname字符串
再利用rm命令把远程机器和本地的文本文件都删除