Acesse o D-Bus remotamente usando socat

5

Descrição:

Gostaria de acessar um serviço do sistema D-Bus de outra máquina, conhecendo apenas o endereço IP da máquina e o serviço para conexão.

O que eu encontrei recentemente é Gabriel (D-Bus sobre SSH). Eu compilei sua versão do GIT (hospedada no Sourceforge) e isso parece funcionar, mas eu continuo tendo um problema com a falta de "keep-alive". Isso significa que, após algum período de inatividade, o túnel SSH não encaminha as solicitações do D-Bus para o PC remoto e eu preciso reiniciar o Gabriel.

Desde que o Gabriel usa o socat no PC que ele conecta, eu só tive uma idéia de usar o socat também no PC local (substituindo Gabriel por ele).

Perguntas:

  • Alguém mais familiarizado com a configuração de "socat" pode confirmar essa solução?
  • Essa solução poderia lidar com muitos aplicativos clientes se conectando ao mesmo serviço D-Bus remoto de uma só vez?
  • Como não é necessário ter a conexão segura - usar "socat" nos dois lados torna a conexão significativamente mais rápida (ao contrário do túnel SSH de Gabriel, se o SSH der muita sobrecarga)?
  • Alguém tem alguma solução melhor para acessar o D-Bus remotamente, talvez?

Quaisquer comentários apreciados.

    
por schedar 05.08.2012 / 00:41

2 respostas

5

Vou postar uma resposta para minha própria pergunta, já que desenvolvi uma solução de trabalho.

Observação: sacrifiquei toda a segurança via SSH, pois não era necessário para o desenvolvimento em minha própria LAN. Mudar o DBus para escutar em sockets unix TCP também não foi possível.

Etapa 1

No host remoto com um endereço IP de exemplo 192.168.1.100 (e ao qual o D-Bus gostaria de ter acesso) eu corro:

   socat TCP-LISTEN:7272,reuseaddr,fork UNIX-CONNECT:/var/run/dbus/system_bus_socket

Agora o socat escuta conexões na porta 7272 e cria um thread separado para cada cliente. Isso permite várias conexões ao mesmo tempo.

Etapa 2

Na máquina local (que eu gostaria de conectar ao D-Bus remoto) eu corro:

   socat ABSTRACT-LISTEN:/tmp/custom_dbus_name,fork TCP:192.168.1.100:7272

Isso se conecta à porta exposta remotamente com o socat e cria um soquete abstrato local ao qual podemos nos conectar.

Uso de amostra

Python:

import dbus

sysbus = dbus.bus.BusConnection("unix:abstract=/tmp/custom_dbus_name")
proxy_obj = sysbus.get_object('com.some.service.name', '/com/some/service/name')
my_interface = dbus.Interface(proxy_obj, dbus_interface = 'com.some.interface.name')

my_interface.SomeDBusExposedMethod()
my_interface.OtherRemoteMethod()

D-Pés

Também é possível usar D-Feet para procurar serviços D-Bus remotos e seus métodos. Isso pode ser feito com a opção de menu "Arquivo / Conectar a outro barramento" e colocando seu nome de soquete abstrato personalizado definido no segundo passo.

    
por 31.08.2012 / 16:18
0

O SSH tem dentro do mecanismo keep alive . Pode ser que você use isso para garantir que sua sessão não seja encerrada?

Para ativar o keep alive em ssh,

Adicione a seguinte linha ao arquivo / etc / ssh / ssh_config para configuração global :

ServerAliveInterval 60

Ou adicione as seguintes linhas a ~ / .ssh / config (criar se necessário) para configuração do usuário

Host *
 ServerAliveInterval 60

Você também pode usar a configuração por host anexando nome do host ao *, por exemplo:

Host *hostname.com
 ServerAliveInterval 60

Onde o 60, representa o intervalo em segundos após o qual o código keep alive / no-op é enviado. Além disso, o espaço na segunda linha é importante.

    
por 05.08.2012 / 01:02