Połączenie Netcat zamyka się po połączeniu przez python

0

Więc zainstalowałem Netcat na moim Raspberry Pi i Macu i mogę zmusić ich do bardzo łatwego połączenia. Problem polega na tym, że jeśli chcę, aby skrypt Pythona na moim komputerze Mac nawiązał połączenie, gdy Raspberry Pi już oczekuje na połączenie. Połączy się, ale wtedy natychmiast zamknie połączenie. Używam tego kodu.

Import os os.popen("nc -v [MY IP] [Port]")

Powodem, dla którego chcę to zrobić, jest to, że mogę wysyłać polecenia przez python przez Netcat Eg

os.popen("Hello other computer")

Jak mogę to naprawić? Dzięki.

ferret249
źródło

Odpowiedzi:

0

Problem polega na tym, że ncjest to połączenie dwukierunkowe, ale popen()wykorzystuje tylko jeden sposób. Kiedy zdalny serwer próbuje odczytać z połączenia, nc będzie czytał ze swojego standardowego wejścia, którego nie ustawiasz, więc prawdopodobnie dostanie eof i połączenie zostanie zamknięte.

Zamiast popen()używać dwukierunkowego subprocess.Popen().

import subprocess
cmd = "nc -v [MY IP] [Port]"
p = subprocess.Popen(cmd,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

Następnie możesz wykonać msg = p.stdout.readline()lub p.stdin.write("reply\n"), p.communicate(...)jak opisano w dokumentach online lub przez pydoc subprocess.Popen.


Alternatywnie i prościej, możesz zastąpić nci używać gniazd natywnie w Pythonie. To nie jest szczególnie trudne. Na przykład jako klient:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((MY_IP, PORT))
s.send('Hello, world')
print s.recv(1024) # read reply
s.close()
meuh
źródło
Dziękuję Ci. Myślę, że nadal mogę używać podprocesu nad natywnymi gniazdami Pythona, ponieważ na drugim końcu jest raspberry pi przy użyciu serwoblastera. Tak więc w podprocesie nie muszę używać Pythona po stronie pi. Również w nc naprawdę łatwo jest zapisać do pliku urządzenia servoblaster za pomocą '> / dev / servoblaster', ale przy gniazdach musiałbym otworzyć plik urządzenia, a następnie napisać do niego, a następnie opróżnić go lub zamknąć lub coś.
ferret249,