使用ssh

时间:2017-10-11 17:22:18

标签: python sockets ssh pexpect python-sockets

我在无头远程计算机(ubuntu)上运行应用程序。此应用程序包含在localhost,端口4068上通信的API。我可以通过端口22上的ssh连接到此计算机。

直接在远程计算机上使用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.

注意:我知道我应该在expect函数中使用正则表达式然后打印匹配的字符串。无论哪种方式,与简单地使用套接字 - 客户端软件包相比,它都不优雅且非常复杂。

我考虑过但不太理想的其他解决方案:

  • 我当然可以将API端口重定向到我的某个端口 交换机/调制解调器,但我担心它会导致安全问题(我不是 安全专家,实际上甚至不是IT人员。我也可以写

  • 我可以将我的python程序放在远程计算机上,但这似乎比通过pxssh使用telnet更复杂。这也意味着我需要进行包管理和诸如此类的东西,因此我的解决方案不可移植。

1 个答案:

答案 0 :(得分:1)

由于我不知道你在服务器端使用的是什么我使用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