2012-01-20 14 views
0

これは、PythonでのTCPベースの通信の初心者の質問です。私は、SSHトンネルとPythonソケットモジュールを介して2つの* NIXシステム間でTCPベースの通信を確立しようとしています。私はこのPython MOTW Webサイトの最初の2つの例「echo server」と「echo client」を使用しました:http://www.doughellmann.com/PyMOTW/socket/tcp.htmlPython経由のTCP-IP通信とSSH接続のオープンポート

同じ* NIXシステム(HOST1)で通信は正常に機能しましたが、sshトンネルでは失敗しました。

ssh -L 10000:HOST2:10000 [email protected]で2番目の* NIXシステムにログインしました。それから、私はHOST2上のサーバー用のpythonスクリプトとHOST1上のクライアント用のスクリプトを開始することによって、同じ方法で通信を行い、通信を確立しようとしました。これは私が標準エラー出力に乗っ:

python test_socket_client.py 
connecting to localhost port 10000 
Traceback (most recent call last): 
File "test_socket_client.py", line 10, in <module> 
sock.connect(server_address) 
File "<string>", line 1, in connect 
socket.error: [Errno 111] Connection refused 

私はそれぞれHOST1とHOST2上のサーバーとクライアントその逆を、始めたとき、私は同じメッセージが表示されました。

私は間違っていますか?

答えて

0

サーバがサーバホストでリッスンしていることと、sshクライアントがクライアントホストでリッスンしていることを確認します。これを確認するにはnetstat -tnlpを実行してください。

クライアントを実行しているときにsshクライアントが開いていることを確認してください。ある端末ではshhを実行し、別のクライアントではクライアントを実行するか、またはssh -Nfを実行すると、sshは認証後にバックグラウンドに移動します。

1

サーバーはソケットをlocalhost:10000にバインドします。つまり、ループバックインターフェイスからの接続のみをリッスンします。 SSHコマンドラインは、ポート10000へのローカル接続をHOST2:10000への接続にトンネリングするようSSHに指示します。クライアントのPythonプログラムがlocalhost:10000に接続し、SSHリンクのリモートエンドがHOST2:10000に接続しようとします。それはあなたのソケットと同じポートと同じマシンですが、それはソケットが聞いていない別のインターフェイスです。

SSHコマンドラインをssh -L 10000:localhost:10000 [email protected]に変更するか、サーバーのリスニングソケットをすべてのインターフェイス:server_address = ('', 10000)にバインドします。空の文字列はINADDR_ANYとして機能します。

Gary van der Merweが言ったことは言うまでもなく、クライアントPythonプログラムをHOST1で実行するときにSSHを実行する必要があります。

+0

これは私を助けました。ヒントをありがとう。 – user1160335

関連する問題