web-dev-qa-db-ja.com

PythonでのNetcatの実装

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

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行目が取得されないというエラーが表示されます。ブロックするように変更すると、ブロックするだけで戻りません。何かご意見は?

28
unholysampler

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呼び出しを追加しました。 (それは少し奇妙ですが、それは可能です。)

48
Jason Orendorff

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

「コンテンツ」を「ポート」上の「ホスト」に送信するために使用できます(すべてがスティングとして入力される可能性があります)。

よろしく

11
d0n

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

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

4
Autoplectic