Como passar dados através da conexão SSH existente?

0

Eu tenho um script PHP que precisa entrar em contato com outro servidor para obter informações sobre algo.
Atualmente estou usando o SSH (via ControlMaster auto ) para isso, que funciona corretamente.

No entanto, o problema é que a latência é muito alta - simplesmente shell_exec 'ing ssh example.com leva 80 milissegundos, o que é muito maior do que a latência real entre os servidores (0,2 ms, já que eles estão conectados por um Cabo Ethernet).

Então, agora estou pensando em simplesmente passar dados através da conexão SSH existente em vez de tentar multiplexar uma nova conexão SSH em uma existente.

No entanto, não tenho certeza de como fazer isso. Qual é a melhor maneira de passar dados para a stdin de uma conexão SSH existente para example.com e, em seguida, ler a saída resultante de seu stdout ?
(A solução BASH está bem aqui - eu não preciso de nada específico ao PHP.)

    
por Mehrdad 23.09.2017 / 22:14

2 respostas

1

Se você estiver usando ControlMaster auto , você está já reutilizando a conexão TCP existente , mas o estabelecimento da conexão TCP é muito rápido de qualquer maneira.

O atraso de 80 ms é provavelmente introduzido por uma combinação de:

  1. php shell_exec iniciando um novo shell (tente exec ?)
  2. a sobrecarga adicional de configurar o novo canal ssh através da conexão existente
  3. Executando seu comando no servidor remoto através de seu novo canal ssh

Se você precisar de respostas mais rápidas, primeiro avalie cada uma delas individualmente e trabalhe para reduzir a latência na parte que está lenta. Se você descobrir que # 2 está atrasando você como você suspeita, você pode tentar enviar seus comandos através de um canal ssh permanente existente, possivelmente através de um pipe nomeado com seu comando remoto em um read- while loop (as advertências levantadas por @symcbean serão aplicadas).

Algo parecido com isto

mkfifo /tmp/f_in
mkfifo /tmp/f_out
tail -f /tmp/f_in | ssh [email protected] 'bash -c "while read name; do echo hello \$name; done"' > /tmp/f_out &
time response=$(head -n 1 /tmp/f_out & echo dwurf > /tmp/f_in); echo $response

Nada disso será tão rápido quanto criar um serviço de rede para consultar informações. Eu também espero que não seja confiável.

    
por 25.09.2017 / 08:40
0

Se você tivesse uma conexão ssh "estática", como uma instância de um script php se ligaria a ela para usá-la?

Muito em breve começamos a falar sobre semântica de bloqueio (difícil de implementar em php). Então há o problema de escalar. Sua solução atual será muito bem dimensionada, já que cada conexão ssh é discreta.

Estou assumindo por enquanto que você controla o código em execução nas duas caixas. Se o motivo pelo qual você está usando o ssh é porque o servidor ssh está executando algum código proprietário, isso elimina muitos padrões para a solução.

Se eles estão conectados via ethernet, então devemos assumir que a rede é confiável? Por que não usar algo como rsh?

A separação de privilégios entre o cliente e o servidor é importante?

Isso cheira a um problema XY.

As únicas soluções práticas são:

1) para escrever um servidor para executar na extremidade do cliente ssh que mantém a conexão ssh aberta e para compartilhar seu acesso aos clientes conectando-se a partir do host local sem a sobrecarga do ssh. Isso não é trivial e não será escalável.

2) implemente um cliente e um servidor usando um protocolo de baixa latência e qualquer autenticação / integridade / confidencialidade associada. Isso também não é trivial. E você omitiu nos dizer como e porque você está usando ssh.

    
por 24.09.2017 / 01:16