Подпроцесс приводит к ошибке «Сломанная труба» - PullRequest
0 голосов
/ 21 сентября 2019

Я играю с программированием сокетов.В следующем фрагменте кода я пытаюсь подключиться к клиенту, и если его ввод содержит «hack», он удалит его, запустит команду оболочки и отправит обратно выходные данные.

сторона сервера:

import socket

class SP:

    def server(self):
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.bind(('127.0.0.1', 9999))
            s.listen(1)
            while True:
                try:
                    c, addr = s.accept()
                    print('Got connection from ', addr)
                    while True:
                        data = c.recv(1024)
                        if data:
                            if 'hack' in data.decode('utf-8'):
                                import subprocess
                                data = data.decode('utf-8')
                                data = data.strip('hack').lstrip().rstrip()
                                output = subprocess.call(data, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
                                s.send(str(output).encode('utf-8'))

                            else:
                                d = data.decode('utf-8')
                                print('Got data: '+str(d))
                                c.send(str('ACK: '+str(d)+' ...').encode('utf-8'))

                        else:
                            print('No more data from client: '+str(addr))
                            break
                finally:
                    s.close()
        except Exception as e:
            print('Caught Exception: '+str(e))
            s.close()

obj = SP()
obj.server()

на стороне клиента:

import socket

class CS:

    def client(self):
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect(('127.0.0.1', 9999))
            while True:
                data = input('Enter data to be sent to server: \n')
                if not data:
                    break
                else:
                    s.send(data.encode('utf-8'))
                    reply = s.recv(1024).decode('utf-8')
                    print(str(reply))
            else:
                s.close()
        except Exception as e:
            print('Caught Exception: '+ str(e))
            s.close()

obj = CS()
obj.client()

Как я могу устранить эту ошибку?Caught Exception: [Errno 32] Broken pipe мне мало что говорит.

обновление:

import socket

class SP:

    def server(self):
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.bind(('127.0.0.1', 9999))
            s.listen(1)
            while True:
                try:
                    c, addr = s.accept()
                    print('Got connection from ', addr)
                    while True:
                        data = c.recv(1024)
                        if data:

                            if 'hack' in data.decode('utf-8'):
                                import subprocess
                                data = data.decode('utf-8')
                                data = data.strip('hack').lstrip().rstrip()
                                print(data)
                                #output = subprocess.call(data, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
                                s.send(data.encode('utf-8'))

                            else:
                                d = data.decode('utf-8')
                                print('Got data: '+str(d))
                                c.send(str('ACK: '+str(d)+' ...').encode('utf-8'))

                        else:
                            print('No more data from client: '+str(addr))
                            break
                finally:
                    s.close()
        except Exception as e:
            print('Caught Exception: '+str(e))
            s.close()

obj = SP()
obj.server()

Даже когда я закомментирую строку, где я звоню subprocess.call, я все равно получаю "Broken Pipe ", поэтому ошибка не возникает из вызова subprocess.

1 Ответ

0 голосов
/ 21 сентября 2019

Вы используете серверный сокет s вместо клиентского сокета c для отправки данных клиенту:
s.send(data.encode('utf-8'))

как насчет его изменения на:
c.send(data.encode('utf-8'))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...