Comment puis-je communiquer avec un socket de domaine Unix via le shell sous Debian Squeeze?

99

J'utilise un serveur Web Debian Squeeze. J'ai installé memcached sur celui-ci et je l'ai configuré pour écouter sur un socket de domaine Unix (at /tmp/memcached.sock), car il n'a besoin que de recevoir des messages du site Web, qui réside sur le même serveur.

Cela semble bien fonctionner, mais j'aimerais également communiquer avec memcached via le shell pour vérifier que tout se passe comme prévu.

memcached accepte les messages via un simple protocole ASCII (si je comprends bien). S'il écoutait sur TCP / IP, je pourrais lui envoyer des messages via, par exemple nc:

$ echo "stats settings" | nc localhost 11211

Mais je ne peux pas comprendre comment envoyer ce texte à la place.

Sur mon ordinateur portable (qui exécute OS X Lion), les deux ncet telnetont des options ( -Uet -urespectivement) pour utiliser les sockets de domaine. Cependant, sur mon serveur Web Debian Squeeze, ces options ne sont pas présentes.

Paul D. Waite
la source

Réponses:

72

Avec netcat-openbsd, il y a une -Uoption. Si vous ne l'avez pas, vous avez probablement netcat-traditionalinstallé à la place; Je suggère de changer.

Exemple de commande: nc -U /var/run/socket

derobert
la source
alors netcat va créer un nouveau fichier sur /var/run/socket? Existe-t-il un moyen de réutiliser un fichier existant?
Alexander Mills le
1
@AlexanderMills Si vous lui dites d'écouter ( -l), le fichier sera créé. Sinon, il attend que le socket existe déjà (et qu'il y ait déjà quelque chose à l'écoute). Ainsi, l'exemple de commande dans la réponse ne crée pas le fichier.
derobert
94

Avec socat(un "relais de données bidirectionnel entre deux canaux de données"), vous pouvez vous connecter au socket de domaine Unix comme ceci:

$ socat - UNIX-CONNECT:/tmp/memcached.sock
maxschlepzig
la source
20

netcat-openbsdprend en charge la connexion aux sockets du domaine UNIX. En utilisant cela, vous pouvez vous connecter à un socket de flux de domaine UNIX ou à un socket de datagramme de domaine UNIX. Par conséquent, vous devez indiquer le type de socket à netcat.

Par exemple, un /dev/logfichier sous Linux est un socket socket de datagramme de domaine UNIX et nc -U /dev/log ne fonctionnera donc pas . Utilisez plutôt nc -uU /dev/log. L'utilisation de -u avec -U indique à netcat qu'il s'agit d'un socket de datagramme de domaine UNIX.

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


De même, lors de l'utilisation socat, utilisez l'option UNIX-CLIENT. En utilisant cette option, vous pouvez vous connecter à un flux de domaine UNIX et à des sockets de datagramme de domaine UNIX . Dans sa page de manuel (man socat) , " Il essaie d'abord de se connecter et, en cas d'échec, suppose qu'il s'agit d'un socket de datagramme, prenant ainsi en charge les deux types ".

socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
Sahil Singh
la source
1
C'est un outil étonnamment flexible, bien paramétrable.
user259412
15

Vous pouvez utiliser socat sur Debian. Pour l'installer:

# apt-get install socat
sendmoreinfo
la source
Cela a l'air bien. Je ne semble pas avoir socatinstallé sur mon serveur, mais il est certainement disponible: packages.debian.org/squeeze/socat
Paul D. Waite