Como eu pode mapear um socket unix local para uma tomada inet?
-
23-08-2019 - |
Pergunta
Estou curioso para saber se é possível mapear um soquete de UNIX para uma tomada INET. A situação é, simplesmente, que eu gostaria de conectar a um servidor MySQL. Infelizmente ele tem INET soquetes desativado e, portanto, só pode se conectar com soquetes UNIX. As ferramentas que estou usando / escrita têm de se conectar a uma tomada INET, então eu estou tentando ver se eu pode mapear um para o outro.
Levou uma quantidade razoável de pesquisa, mas eu fiz encontrar socat , que supostamente faz O que estou olhando. Eu queria saber se alguém tem alguma sugestão sobre como fazer isso. A linha de comando Eu tenho usado (com sucesso parcial) é:
socat -v UNIX-CONNECT:/var/lib/mysql/mysql.sock TCP-LISTEN:6666,reuseaddr
Agora eu posso fazer conexões e falar com o servidor. Infelizmente quaisquer tentativas de fazer múltiplas conexões falhar como eu preciso usar a opção garfo, mas esta opção parece tornar as conexões não-funcionais.
Eu sei que posso resolver o problema com Perl (meu idioma preferido), mas eu prefiro evitar escrever toda a implementação do mesmo. I familiarizado com as bibliotecas IO :: Socket, estou simplesmente esperando que alguém tem experiência fazendo este tipo de coisa. Aberto a sugestões / ideias.
Graças.
Solução
Inverter a ordem dos seus argumentos para socat
, e ele funciona.
socat -v tcp-l:6666,reuseaddr,fork unix:/var/lib/mysql/mysql.sock
Esta instrui socat
para
- Ouça na porta TCP 6666 (com
SO_REUSEADDR
) - Espere para aceitar uma conexão
- Quando a conexão é feita, garfo. Na criança, continue os passos abaixo. No pai, ir para 2.
- Abrir uma conexão de domínio UNIX à tomada
/var/lib/mysql/mysql.sock
. - Os dados de transferência entre os dois pontos de extremidade, em seguida, saia.
Escrevê-lo o contrário
socat -v unix:/var/lib/mysql/mysql.sock tcp-l:6666,reuseaddr,fork
não trabalho, porque isso instrui socat
para
- Abrir uma conexão de domínio UNIX à tomada
/var/lib/mysql/mysql.sock
. - Ouça na porta TCP 6666 (com
SO_REUSEADDR
) - Espere para aceitar uma conexão
- Quando a conexão é feita, gerar uma criança trabalhador para transferir dados entre os dois endereços.
- O pai continua a aceitar conexões no segundo endereço, mas não tem mais o primeiro endereço disponível: foi dado ao primeiro filho. Então, nada de útil pode ser feito a partir deste ponto.
Outras dicas
Sim, você pode fazer isso em Perl.
perlipc , IO :: Select , IO :: socket e de Beej Guia de Rede programação.
Você pode querer considerar fazê-lo em POE -. É biblioteca assíncrona para lidar com eventos, de modo que parece ótimo para a tarefa
Não é 100% relevante, mas eu uso POE para o proxy de gravação entre o protocolo sem estado (HTTP) e protocolo statefull (sessão de telnet, e mais especificamente - sessão MUD), e foi bastante simples - Você pode verificar o código em aqui: http: / /www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/ .
No alguém comentários também sugeriu Coro / AnyEvent -. Eu não tenho jogado com ele ainda, mas você pode querer verificá-lo