使用 ssh 从远程主机访问本地主机 API
Access localhost API from a remote host using ssh
我在无头远程机器 (ubuntu) 上有一个应用程序 运行。此应用程序包含一个 API 在本地主机上通信,端口 4068。我可以通过端口 22 上的 ssh 连接到这台机器。
直接在远程机器上使用 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
。我想这不是最佳选择,当然它不适合我。我更喜欢使用 sockets-client 包或类似包的替代方法。
这是我的解决方案的示例代码
#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.
注意:我知道我应该在 expect 函数中使用正则表达式,然后打印匹配的字符串。无论哪种方式,与简单地使用 sockets-client 包相比,它都不优雅且非常复杂。
我考虑过但不太理想的其他解决方案:
我当然可以将 API 端口重定向到我的某个端口
switch/modem,但恐怕会导致安全问题(我不是
安全专家,实际上什至不是 IT 人员)。我也可以写
我可以在远程机器上安装我的 python 程序,但这似乎比通过 pxssh
使用 telnet 更复杂。这也意味着我需要进行包管理和诸如此类的事情,所以我的解决方案不可移植。
因为我不知道你在服务器端使用什么我正在使用 pythons 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
.
我在无头远程机器 (ubuntu) 上有一个应用程序 运行。此应用程序包含一个 API 在本地主机上通信,端口 4068。我可以通过端口 22 上的 ssh 连接到这台机器。
直接在远程机器上使用 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
。我想这不是最佳选择,当然它不适合我。我更喜欢使用 sockets-client 包或类似包的替代方法。
这是我的解决方案的示例代码
#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.
注意:我知道我应该在 expect 函数中使用正则表达式,然后打印匹配的字符串。无论哪种方式,与简单地使用 sockets-client 包相比,它都不优雅且非常复杂。
我考虑过但不太理想的其他解决方案:
我当然可以将 API 端口重定向到我的某个端口 switch/modem,但恐怕会导致安全问题(我不是 安全专家,实际上什至不是 IT 人员)。我也可以写
我可以在远程机器上安装我的 python 程序,但这似乎比通过
pxssh
使用 telnet 更复杂。这也意味着我需要进行包管理和诸如此类的事情,所以我的解决方案不可移植。
因为我不知道你在服务器端使用什么我正在使用 pythons 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
.