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行目が取得されないというエラーが表示されます。ブロックするように変更すると、ブロックするだけで戻りません。何かご意見は?
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
呼び出しを追加しました。 (それは少し奇妙ですが、それは可能です。)
以下は、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()
「コンテンツ」を「ポート」上の「ホスト」に送信するために使用できます(すべてがスティングとして入力される可能性があります)。
よろしく
そのコードを完全に破棄することを気にしない場合は、 scapy を参照してください。これは基本的に、Pythonのパケットツールのスイスアーミーナイフです。 インタラクティブチュートリアル を見て、ニーズに合っているかどうかを確認してください。
パケットよりも高レベルなものが必要な場合 twisted は、Pythonのネットワーキング用のライブラリです...残念ながら、学習曲線は少し急です。