2009-12-15 85 views
23

我找到了this,我正在使用它作爲我的基礎,但它在開箱時並不能正常工作。我的目標也是將其視爲一個包而不是命令行實用程序,所以我的代碼更改將反映這一點。Netcat在Python中的實現

class Netcat: 
    def __init__(self, hostname, port): 
     self.hostname = hostname 
     self.port = port 
    def send(self, content): 
    self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.socket.connect((self.hostname, self.port)) 
    self.socket.setblocking(0) 
    result = ''; 
    read_ready, write_ready, in_error = select.select([self.socket], [], [self.socket], 5) 
    if(self.socket.sendall(content) != None): 
     return 
    while(1): 
     buffer = '' 
     try:     
      buffer = self.socket.recv(128) 
      while(buffer != ''): 
       result += buffer 
       try: 
        buffer = self.socket.recv(128) 
       except socket.error as err: 
        print (err, type(err)) 
        buffer = '' 
      if(buffer == ''): 
       break 
     except socket.error as err: 
      print (err, type(err)) 
     if(buffer == ''): 
      break 
    return result 

當我發送一個基本的命令到我的設備,它返回以下內容。

50PMA-019 Connection Open 
Atten #1 = 63dB 

我的代碼讀取第一行,但後來我得到一個錯誤說連接暫時不可用,並沒有得到第二行。如果我將其更改爲阻止,它會阻止並永不返回。有什麼想法嗎?

回答

40

如果您只是使用nc,它會工作嗎?

我想你應該嘗試一些簡單的一點:

import socket 

def netcat(hostname, port, content): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((hostname, port)) 
    s.sendall(content) 
    s.shutdown(socket.SHUT_WR) 
    while 1: 
     data = s.recv(1024) 
     if data == "": 
      break 
     print "Received:", repr(data) 
    print "Connection closed." 
    s.close() 

我加入了shutdown調用,因爲也許你的設備正等着你說你完成發送數據。 (這將是一個有點怪異,但它是可能的。)

+2

將關機行添加到我原來的代碼使它工作,我會借用你的代碼來修剪我的代碼。 – unholysampler 2009-12-15 18:36:50

+0

我有問題,我的mac os不會發送數據包,直到我關閉連接。有沒有辦法解決,因爲我不能再次建立連接。 – 2016-03-07 17:25:50

+0

鮑勃,你應該考慮點擊提問並詢問這個,如果你還沒有。 – 2016-03-11 23:17:44

3

如果你不介意完全廢除該代碼,你可能會喜歡看scapy--它基本上就是Python中包工具的瑞士軍刀。看看interactive tutorial看看它是否適合您的需求。

如果你想要比數據包更高級別的東西twisted是python網絡的前往圖書館...不幸的是學習曲線是一個有點陡峭。

+1

我沒什麼特別的。我只需要一個簡單的界面讓我發送幾個字符並接收設備的響應。我會檢查你給我的鏈接。 – unholysampler 2009-12-15 18:08:59

7

下面是關於python3工作實施:

import socket 

def netcat(host, port, content): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((host, int(port))) 
    s.sendall(content.encode()) 
    s.shutdown(socket.SHUT_WR) 
    while True: 
     data = s.recv(4096) 
     if not data: 
      break 
     print(repr(data)) 
    s.close() 

它可以用於「內容」發送到「主機」端口」 「(這一切都可能被視爲刺痛)。

Regards

+0

我發現我在這裏也需要在shutdown之前添加'time.sleep(0.5)'。 – tripleee 2016-01-29 06:43:46