python - 使用 ssh 从远程主机访问 localhost API

标签 python sockets ssh pexpect python-sockets

我有一个在 headless 远程机器(ubuntu)上运行的应用程序。此应用程序包含一个在 localhost 端口 4068 上通信的 API。我可以通过端口 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 端口重定向到我的某个端口
    交换机/调制解调器,但我担心它会导致安全问题(我不是
    安全专家,实际上甚至不是 IT 人员)。我也可以写
  • 我可以在远程机器上安装我的 python 程序,但这似乎比通过 pxssh 使用 telnet 更复杂。 .这也意味着我需要做包管理和诸如此类的事情,所以我的解决方案是不可移植的。
  • 最佳答案

    因为我不知道你在服务器端使用什么,所以我使用 python 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 .

    关于python - 使用 ssh 从远程主机访问 localhost API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46694151/

    相关文章:

    linux - shell 脚本中与用户的 SSH 连接

    python - 将 int 的十进制字符串表示形式转换为 "bytes"

    python - 如何实现rust-cpython as_object()和into_object()?

    c - socket() 失败 - errno EPERM - ubuntu

    ssh - 从 Docker 容器添加 Ruby SDK 作为 RubyMine 上的远程 SDK

    Eclipse 远程调试预启动脚本?

    python - Numpy 的 linalg.norm() 在非零向量上返回 0?

    python - pandas 分组中日期之间差异的标准差

    java - 查看网络上的多个服务器

    python - 在 python 中通过 TCP 服务器网络发送对象