Estoy tratando de crear un programa que abra un puerto en la máquina local y permita que otros se conecten a través de netcat. Mi código actual es.
s = socket.socket() host = '127.0.0.1' port = 12345 s.bind((host, port)) s.listen(5) while True: c, addr = s.accept() print('Got connection from', addr) c.send('Thank you for connecting') c.close()Soy nuevo en Python y sockets. Pero cuando ejecuto este código, me permitirá enviar una conexión netcat con el comando:
nc 127.0.0.1 12345Pero luego, en mi secuencia de comandos de Python, aparece el error para c.send:
TypeError: a bytes-like object is required, not 'str'Básicamente, solo estoy tratando de abrir un puerto, permitir que netcat se conecte y tener un shell completo en esa máquina.
El motivo de este error es que en Python 3, las cadenas son Unicode, pero cuando se transmiten en la red, los datos deben ser bytes. Entonces... un par de sugerencias:
c.sendall() en lugar de c.send() para evitar posibles problemas en los que es posible que no haya enviado el mensaje completo con una sola llamada (ver documentos ).'b' para la cadena de bytes: c.sendall(b'Thank you for connecting')La mejor solución (debería funcionar tanto con 2.x como con 3.x):
output = 'Thank you for connecting' c.sendall(output.encode('utf-8'))Epílogo/fondo : esto no es un problema en Python 2 porque las cadenas ya son cadenas de bytes: su código OP funcionaría perfectamente en ese entorno. Las cadenas Unicode se agregaron a Python en las versiones 1.6 y 2.0, pero pasaron a un segundo plano hasta la 3.0, cuando se convirtieron en el tipo de cadena predeterminado. También vea esta pregunta similar así como esta .
Puede decodificarlo en str con receive.decode('utf_8') .
Puede cambiar la línea de envío a esto:
c.send(b'Thank you for connecting') La b lo convierte en bytes en su lugar.