2017-10-11 10 views
0

私はヘッドレスリモートマシン(ubuntu)上で動作するアプリケーションを持っています。このアプリケーションにはlocalhost(ポート4068)で通信するAPIが含まれています。このマシンには、ポート22のsshで接続できます。sshを使用してリモートホストからlocalhost APIにアクセス

リモートマシンでPythonを直接使用すると、ソケットクライアントパッケージを使用してラインの私が何をしたい:私が欲しいもの

#From within remote machine! 
import socket 
s = socket.socket() 
s.connect(("127.0.0.1",4068)) 
s.send("help") 
print(s.recv(1024)) 
#prints the API help 

は(ないローカルネットワーク内で、実際に遠隔である)リモートAPIと通信することで、私のローカルマシン上でいくつかの分析を行うことです。

私がこれまで行ったことは、pxsshと電話telnetを使用していました。私はそれが最適ではないと確信しています、確かに私のためではありません。私は、ソケットクライアントパッケージまたはそれに類するものを使用する代わりの方法を好むでしょう。私は、一致する文字列を印刷し、次に期待する機能で正規表現を使用する必要があります知っている:ここで

は、私の解決策のサンプルコード

#From my local machine. 
from pexpect import pxssh 
import pexpect 
#hostname, username and password are information to connect to ssh 
p = pxssh.pxssh() 
p.login(hostname,username,password) 
query = r"telnet 127.0.0.1 4068" 
p.sendline(query) 
p.sendline("help") 
p.expect("help") 
p.expect([p.PROMPT,pexpect.EOF,pexpect.TIMEOUT]) 
print(p.before) 
#prints the API help together with waste. 

注意です。いずれにしても、単純にソケットクライアントパッケージを使用する場合と比べると、それほどエレガントではなく、非常に複雑です。私はと考え、あまり最適で

他のソリューション:

  • (私はもちろん、私の スイッチ/モデムの特定のポートへのAPIポートをリダイレクトすることもできますが、私はそれがセキュリティ上の問題につながる恐れている私はいいえ セキュリティ専門家、実際にはITマンでもない)。私も書くことができます

  • 私はリモートマシン上で私のpythonプログラムを持つことができましたが、これはpxssh経由でtelnetを使うよりも複雑です。また、私はパッケージ管理やその他のことをする必要があるので、私のソリューションは移植性がありません。私はあなたが私がここにニシキヘビhttp.serverを使用していますサーバー側で使用しているのか分からないので

答えて

1

は、私は次のコードでsshtunnelを使用していますクライアント側で

python3 -m http.server 

のように開始しました:

from sshtunnel import SSHTunnelForwarder 
import socket 

# open ssh tunnel 
server = SSHTunnelForwarder(
    '', 
    ssh_username="", 
    ssh_password="", 
    remote_bind_address=('127.0.0.1', 8000) 
) 

server.start() 

print('local port:', server.local_bind_port) # show assigned local port 
# work with `SECRET SERVICE` through `server.local_bind_port`. 

#create an INET, STREAMing socket 
s = socket.socket(
    socket.AF_INET, socket.SOCK_STREAM) 
#now connect to the web server on port 8080 
s.connect(('127.0.0.1', server.local_bind_port)) 
s.send(b'GET/HTTP/1.0 \r\n\r\n') 
print(s.recv(1000)) 
s.close() 

server.stop() 

シェルのようなtelnetとやりとりするために、python組み込みのtelnetlibを使用できます。

+0

これは美しいです、ありがとうございます!私はサーバー側でコントロールはありませんが、同じことをしています(「GET ...」ではなく「help」を送信する以外は同じです)。 – Wli

+0

@Wli私はhttps://docs.python.org/3.6/library/telnetlib.htmlに行きます – uphill

+0

いいえ、SSHTunnelForwarderは私が必要としていたものであり、気づいていないものです。私はtelnetを使いたくない、あまりにも面倒です。 – Wli

関連する問題