2016-10-29 8 views
0

私はUbuntu 16.04を実行していますが、URLを指定して指定した画像ファイルにGET要求を行うPythonスクリプトを作成しようとしています。一例として、以下のコードで:Pythonスクリプトを使用してnetcatを使ってサーバーにGETリクエストを送信する

hostwww.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の指定が必要です。私はそれが2つの理由でこれをしていることを知っています。サーバーの応答が私に来る直前に、以下を得るまず、:

/bin/sh: 1: Host:: not found /bin/sh: 1: Connection:: not found

第二に、私は、画像データのサーバーの応答が端末上で奇妙なUnicodeの記号として解釈醜い原料の束であることを知っています私は明らかにサーバーの応答にwww.google.com HTMLテキストを取得しています。

netcat STDINが開かれるまでHTTPリクエストを待つ必要があるかもしれないと思っていましたが、私はどのようにわかっていません。どういうわけか\nを送信しているので、リクエストを完了しているだけかもしれませんか?私は本当に知らない。

EDIT:実際にはwww.google.comにリクエストを送信していないようです。私はサーバーの応答を.htmlファイルとして保存しました。クラウドフロントのWebサイトのように見えます。

EDIT2:さらに調査した結果、netcatはインタラクティブで、デッドロックなどの問題があるようです。私はproc.communicate()を使用しようとしましたが、複数の行を送信する必要があるため、communicateは最初の入力がSTDINに書き込まれてから、EOFまたはそれらの行に何かが送信されます。これにより、私はproc.stdin.writeを使用しようとしましたが、これはまた、PopenコマンドにSTDINSTDOUT、およびSTDERRのためにsubprocess.PIPEを使用することに関するデッドロックを引き起こすことも明らかです。また、私が行ったbytes-likeオブジェクトとして符号化する必要がありますが、最後に\r\n\r\nを送信して接続を終了しようとすると、何もしません。STDOUTには、私が空であると理解しているb''同様の問題を抱えている人のためbytes

+0

はあなたがGETリクエストを行うには、 'netcat'を使用している理由はありますか?それを行うもっと簡単な方法がたくさんあります。 –

+0

これはネットワーククラスの割り当ての一部であり、 'netcat'だけを使用する必要があります。バックグラウンドで何かを隠すことができるライブラリや何もありません。 –

+0

google.com以外のサイトの反対側でGETを実行してください。 Googleでは、ロボットスクリプトがAPIを使用せずにデータを取得することを拒否することがあります。 – boardrider

答えて

0

の形式の文字列は、ここで私が見つけた解決策は以下のとおりです。

#begin the interactive shell of netcat 
proc = Popen(['netcat -q -1 {} {}'.format(host, port)], shell=True, stdout=PIPE, stdin=PIPE, stderr=PIPE) 

#set file status flags on stdout to non-blocking reads 
fcntl.fcntl(proc.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK) 

#each time we write a diffrent line to the interactive shell 
#we need to flush the buffer just to be safe 
#credit to http://nigelarmstrong.me/2015/04/python-subprocess/ 
proc.stdin.write(str.encode('GET %s HTTP/1.1\n' %(path+filename))) 
proc.stdin.flush() 
proc.stdin.write(str.encode('Host: {}\n'.format(host))) 
proc.stdin.flush() 
proc.stdin.write(str.encode('Connection: close\n')) 
proc.stdin.flush() 
proc.stdin.write(str.encode('\r\n\r\n')) 
proc.stdin.flush() 

#give the server time to respond 
proc.wait() 

#store the server response (which is bytes-like) 
#attempting to decode it results in error since we're recieving data as a mix of text/image 
serv_response = proc.stdout.read() 
関連する問題