Я запускаю Ubuntu 16.04, и я пытаюсь написать скрипт python, который делает запрос GET указанному файлу изображения с учетом URL-адреса. В качестве примера, в коде ниже:Использование скрипта python для отправки запроса GET на сервер с netcat
host
является www.google.com
port
является 80
u.path
является /images/srpr/logo3w.png
proc = Popen(["netcat {} {}".format(host, port)], shell= True)
proc = Popen(["GET {} HTTP/1.1".format(u.path)], shell= True)
proc = Popen(["Host: {}".format(host)], shell= True)
proc = Popen(["Connection: close"], shell= True)
proc = Popen(["\n"], shell= True)
Моя проблема заключается в том, что я могу выполнить это нормально в терминале, но когда я пытаюсь запустить скрипт, похоже, отправляет запрос GET
на номер www.google.com
. он принимает спецификацию u.path
. Я знаю, что это делается по двум причинам. Во-первых, как раз перед ответом сервера приходит я получаю следующее:
/bin/sh: 1: Host:: not found /bin/sh: 1: Connection:: not found
Во-вторых, я знаю, что ответ сервера данных изображения является куча уродливых вещей истолковано как странные символы Unicode на терминале, но я явно получаю текст HTML www.google.com
на сервере.
Я думал, что мне может потребоваться, чтобы он дождался запроса HTTP до тех пор, пока не будет открыто STDIN netcat
, но я не знаю, как это сделать. Или, может быть, это просто завершение запроса, потому что он как-то отправляет \n
? Я действительно не знаю.
EDIT: Кажется, он фактически не отправляет запрос на www.google.com
. Я сохранил ответ сервера как файл .html
, и он выглядит как облачный веб-сайт.
EDIT2: После дополнительных исследований кажется, что проблема заключается в том, что, поскольку netcat является интерактивным, и поэтому это «взаимоблокировки» или что-то в этом роде. Я пытался использовать proc.communicate()
, но так как мне нужно отправить несколько строк, это не позволяет видеть, так как communicate
позволяет только записывать начальный ввод в STDIN
, а затем он отправляет EOF
или что-то в этом роде. Это привело меня к попытке использовать proc.stdin.write
, но это, по-видимому, также, как известно, вызывает тупик с чем-то связанным с тем, что команды Popen
используют subprocess.PIPE
для STDIN
, STDOUT
и STDERR
. Он также требует, чтобы вход был закодирован как объект bytes-like
, который я сделал, но когда я отправляю \r\n\r\n
в конце, чтобы попытаться закрыть соединение, он ничего не делает, а STDOUT
просто содержит b''
, который я понимаю как пустой строка в виде bytes
есть ли причина, почему вы используете 'netcat' сделать запрос GET? Там гораздо больше простых способов сделать это. –
Это часть задания для сетевого класса, и мы должны использовать только «netcat». Нет библиотек или чего-либо, что может скрывать, что происходит в фоновом режиме. –
Попробуйте выполнить GET напротив сайта, кроме google.com. Google может возражать против того, чтобы ваш робот-скрипт получал свои данные, не используя свой API. – boardrider