基於Python Shell擷取hostname和fqdn釋疑

來源:互聯網
上載者:User
一直以來被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天專門抽時間把它們的使用細節弄清了。

一、設定hostname/fqdn

在Linux系統內設定hostname很簡單,如:

$ hostname florian

如果要設定fqdn的話,需要對/etc/hosts進行配置。

$ 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配置保持一致:

$ cat /etc/sysconfig/networkNETWORKING=yesHOSTNAME=test.com

二、查看hostname/fqdn

配置完成後,可以使用shell命令查看hostname和fqdn:

$ hostname && hostname -f florianflorian.test.com 

使用ping去測試hostname的ip映射是否成功。

$ 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。

$ 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,此時會有些不同。

$ 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!!!

$ 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檔案的第二行注釋:

cat /etc/hosts127.0.0.1 localhost# 192.168.1.1 florian.test.com florian 

重新整理dns緩衝:

$ service nscd reload

我們發現fqdn恢複正常了。

$ 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內儘可能靠前的位置添加如下配置:

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 函數

>>> import socket >>> socket.gethostbyname("www.baidu.com") '61.135.169.125' >>> socket.gethostbyname("rs.xidian.edu.cn") '202.117.119.1'
 
  • 1
  • 2
  • 3
  • 4
  • 5

方法2 利用 shell 中 hostname 命令

def getHostName(ip): command = 'java -jar %s %s "hostname > %s.hostname"' %(remoteCmdLoca,ip,ip) result = subprocess.call(command, shell=True) command = '%s -q -r -pw Sybase123 %s root@%s:/root' % (pscpLoca, pscpLoca, ip) result = subprocess.call(command, shell=True) command = '%s -q -r -pw Sybase123 root@%s:/root/%s.hostname %s' %(pscpLoca,ip,ip,sumAutoLoca) result = subprocess.call(command, shell=True) fileName = sumAutoLoca + ip + '.hostname' readFile = open(fileName,'r') hostnameInfo = str(readFile.readline().strip('\n')) readFile.close() subprocess.call('rm '+ fileName, shell=True) print "=========%s hostname is %s========" %(ip,hostnameInfo) return hostnameInfo
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

設計思路 ##

有時候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 命令把遠程機器和本地的文字檔都刪除

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.