¿Cómo puedo comunicarme con un socket de dominio Unix a través del shell en Debian Squeeze?

99

Estoy ejecutando un servidor web Debian Squeeze. Instalé memcached en él y configuré memcached para escuchar en un socket de dominio Unix (at /tmp/memcached.sock), ya que solo necesita recibir mensajes del sitio web, que vive en el mismo servidor.

Parece estar funcionando bien, pero también me gustaría comunicarme con memcached a través del shell, para verificar que está haciendo lo que creo que está haciendo.

memcached acepta mensajes a través de un protocolo ASCII simple (si lo entiendo correctamente). Si estaba escuchando en TCP / IP, podría enviarle mensajes a través de, por ejemplo nc:

$ echo "stats settings" | nc localhost 11211

Pero no puedo entender cómo enviar ese texto al socket de dominio en su lugar.

En mi portátil (que se ejecuta OS X Lion), tanto ncy telnettienen opciones ( -Uy -urespectivamente) para utilizar sockets de dominio. Sin embargo, en mi servidor web Debian Squeeze, estas opciones no están presentes.

Paul D. Waite
fuente

Respuestas:

72

Con netcat-openbsd, hay una -Uopción. Si no lo tiene, probablemente lo haya netcat-traditionalinstalado; Sugeriría cambiar.

Comando de ejemplo: nc -U /var/run/socket

derobert
fuente
¿Entonces netcat creará un nuevo archivo en /var/run/socket? ¿Hay alguna manera de reutilizar un archivo existente?
Alexander Mills
1
@AlexanderMills Si le dice que escuche ( -l), creará el archivo. De lo contrario, espera que el socket ya exista (y ya tenga algo escuchando). Entonces, el comando de ejemplo en la respuesta no crea el archivo.
derobert
94

Con socat(un 'relé de datos bidireccional entre dos canales de datos') puede conectarse al socket de dominio Unix de esta manera:

$ socat - UNIX-CONNECT:/tmp/memcached.sock
maxschlepzig
fuente
19

netcat-openbsdadmite la conexión a sockets de dominio UNIX. Con esto, puede conectarse a un socket de flujo de dominio UNIX o a un socket de datagrama de dominio UNIX , y por lo tanto, debe indicar el tipo de socket a netcat.

por ejemplo, el /dev/logarchivo en Linux es un socket de socket de datagrama de dominio UNIX , por nc -U /dev/log lo tanto no funcionará . En lugar de usar nc -uU /dev/log. Usar -u junto con -U le dice a netcat que es un socket de datagrama de dominio UNIX.

nc -U /tmp/socket  #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket


Del mismo modo, durante el uso socat, use la opción UNIX-CLIENT. El uso de esta opción se puede conectar tanto a la corriente de dominio Unix y de datagramas de dominio UNIX sockets. Desde su página de manual (man socat) , " Primero intenta conectarse y, si eso falla, supone que es un socket de datagrama, por lo tanto, admite ambos tipos ".

socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
Sahil Singh
fuente
1
Es una herramienta sorprendentemente flexible y bien parametrizable.
user259412
15

Puedes usar socat en Debian. Para instalarlo:

# apt-get install socat
sendmoreinfo
fuente
Eso se ve bastante bien. Parece que no he socatinstalado en mi servidor, pero ciertamente está disponible: packages.debian.org/squeeze/socat
Paul D. Waite