Доступ к 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,

Другие вопросы по тегам