使用ssh从远程主机访问本地主机API

问题描述:

我有一个运行在无头远程机器(ubuntu)上的应用程序。此应用程序包含一个在本地主机上通信的API,端口4068.我可以通过端口22上的ssh连接到此机器。使用ssh从远程主机访问本地主机API

直接在远程机器上使用python,我可以使用sockets-client软件包并获取一对行什么,我想:

#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程序,但这似乎比使用telnet通过pxssh更复杂。另外它意味着我需要做包管理和whatnots,所以我的解决方案是不可移植的。

因为我不知道你用的是什么在服务器端,我使用蟒蛇http.server这里开始像

python3 -m http.server 

在我使用sshtunnel用下面的代码客户端:

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() 

为了使用shell之类的telnet进行交互,你可以使用python内建的telnetlib

+0

这是美丽的,谢谢!我在服务器端没有控制权,但它的工作原理是一样的(除了我发送“帮助”,而不是“GET ...”)。 – Wli

+0

@Wli我会去为https://docs.python.org/3.6/library/telnetlib.html – uphill

+0

不,SSHTunnelForwarder正是我所需要的,并没有意识到。我不喜欢使用telnet,太麻烦了。 – Wli