Доступ к localhost API с удаленного хоста с использованием ssh
У меня есть приложение, работающее на удаленной машине без головы (Ubuntu). Это приложение содержит API для связи на локальном хосте, порт 4068. Я могу подключиться к этой машине по ssh на порт 22.
Работая непосредственно с 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.
Примечание: я знаю, что должен использовать регулярное выражение в функции ожидаемого, а затем печатать соответствующую строку. В любом случае, это не элегантно и очень сложно, если сравнивать с простым использованием пакета sockets-client.
Другие решения, которые я рассмотрел, но менее оптимальны:
Конечно, я мог бы перенаправить порт API на определенный порт моего коммутатора / модема, но я боюсь, что это приводит к проблемам с безопасностью (я не эксперт по безопасности, на самом деле даже не ИТ-специалист). Я мог бы также написать
Я мог бы иметь свою программу Python на удаленной машине, но это кажется более сложным, чем использование Telnet через
pxssh
, Кроме того, это означает, что мне нужно управлять пакетами и прочее, поэтому мое решение не переносимо.
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()
Для взаимодействия с оболочкой типа telnet вы можете использовать встроенный в Python telnetlib
,