2016-11-19 74 views
1

我已經嘗試過用各種方法將主機名的變量替換爲socket.connect調用,但我無法使其工作。我正在做替換B/C我想從文件中讀取主機IP列表並連接到它們中的每一個。我有可變格式正確與它周圍的單引號字符串,但它不會連接:用於主機名的Python套接字替換變量

# Connect to the Servers LOOP 
    with open(sys.argv[2], 'r') as f1: 
     for server in f1: 
      s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

      server = server.strip('\n') 
      server = "'%s'" % server 
      print 'Connecting to ' + server 

      #connect=s.connect(('10.11.1.229',25)) 
      connect=s.connect((server,25)) 

      # Receive the banner 
      banner=s.recv(1024) 
      print banner 

      s.close 

如果我硬編碼的主機名,它工作正常。執行結果:

Connecting to '10.11.1.8' 
Traceback (most recent call last): 
    File "./connect-loop.py", line 19, in <module> 
    connect=s.connect((server,25)) 
    File "/usr/lib/python2.7/socket.py", line 228, in meth 
    return getattr(self._sock,name)(*args) 
socket.gaierror: [Errno -2] Name or service not known 

欣賞任何幫助......

+1

刪除單個滴答聲「server =」%s「%server'或雙滴答聲」server ='%s'%server' – dahrens

回答

1

的問題是,你加蜱服務器名稱(我猜,爲了在印刷時正確格式化),然後將其在解析主機名時解釋。

嘗試:

with open(sys.argv[2], 'r') as f1: 
    for server in f1: 
     s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

     server = server.strip('\n') 
     print 'Connecting to {} ...'.format(repr(server)) 

     connect=s.connect((server,25)) 

     banner=s.recv(1024) 
     print repr(banner) 

     s.close() 

變化:

  • 格式直接在print線的主機名,並使用repr引用它。
  • 刪除不需要的主機名格式化行
  • 在末尾添加缺少的括號到close()

關於repr的注意事項:它返回給定值的「人類表示形式」,對於字符串值,它是引用相同的字符串。

+0

就是這樣。最初的問題只是我閱讀的行中的'\ n'。然後,我在故障排除中添加了刻度。應該清理那個。謝謝! –