У меня есть приложение, работающее на безголовой удаленной машине (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
. Также это означает, что мне нужно управлять пакетами и еще много чего, поэтому мое решение не переносимо.