37

これを見つけてベースとして使用していますが、そのままでは機能しませんでした。私の目標は、コマンド ライン ユーティリティではなくパッケージとして扱うことでもあるため、コードの変更はそれを反映しています。

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

私のコードは最初の行を読み取りますが、接続が一時的に利用できず、2 行目を取得できないというエラーが表示されます。ブロッキングに変更すると、ブロックするだけで戻りません。何かご意見は?

4

3 に答える 3

25

以下は、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()

「コンテンツ」を「ポート」の「ホスト」に送信するために使用できます (すべて文字列として入力できます)。

よろしく

于 2015-01-04T16:17:49.520 に答える
5

そのコードを完全に破棄してもかまわない場合は、scapyを参照してください。これは基本的に、Python のパケット ツールのスイス アーミー ナイフです。インタラクティブなチュートリアルを見て、ニーズに合っているかどうかを確認してください。

ツイストパケットよりも高レベルなものが必要な場合は、Python でのネットワーク用の頼りになるライブラリです... 残念ながら、学習曲線は少し急です。

于 2009-12-15T17:56:30.213 に答える