2017-10-11 183 views
0

我有一個運行在無頭遠程機器(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,所以我的解決方案是不可移植的。

回答

1

因爲我不知道你用的是什麼在服務器端,我使用蟒蛇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