Wie kann ich mit einem Unix-Domain-Socket über die Shell unter Debian Squeeze kommunizieren?

99

Ich betreibe einen Debian Squeeze-Webserver. Ich habe memcached darauf installiert und memcached so konfiguriert, dass es auf einem Unix-Domain-Socket (at /tmp/memcached.sock) lauscht , da es nur Nachrichten von der Website empfangen muss, die sich auf demselben Server befindet.

Es scheint gut zu funktionieren, aber ich möchte auch über die Shell mit memcached kommunizieren, um zu überprüfen, ob es das tut, was ich denke.

memcached akzeptiert Nachrichten über ein einfaches ASCII-Protokoll (wenn ich das richtig verstehe). Wenn es TCP / IP abhört, kann ich ihm Nachrichten senden über zB nc:

$ echo "stats settings" | nc localhost 11211

Aber ich kann nicht herausfinden, wie ich diesen Text stattdessen an den Domain-Socket senden soll.

Auf meinem Laptop (die OS X Lion läuft), die beide ncund telnethaben Optionen ( -Uund -ujeweils) Domain - Sockets zu verwenden. Auf meinem Debian Squeeze-Webserver sind diese Optionen jedoch nicht vorhanden.

Paul D. Waite
quelle

Antworten:

72

Mit netcat-openbsdgibt es eine -UOption. Wenn Sie es nicht haben, haben Sie es wahrscheinlich netcat-traditionalstattdessen installiert. Ich würde vorschlagen, zu wechseln.

Beispielbefehl: nc -U /var/run/socket

derobert
quelle
wird netcat also eine neue datei erstellen um /var/run/socket? Gibt es eine Möglichkeit, eine vorhandene Datei wiederzuverwenden?
Alexander Mills
1
@AlexanderMills Wenn Sie ihm mitteilen, dass er zuhören soll ( -l), wird die Datei erstellt. Andernfalls wird davon ausgegangen, dass der Socket bereits vorhanden ist (und bereits etwas zum Abhören vorhanden ist). Der Beispielbefehl in der Antwort erstellt die Datei also nicht.
Derobert
94

Mit socat(einem 'bidirektionalen Daten-Relay zwischen zwei Datenkanälen') können Sie sich wie folgt mit dem Unix-Domain-Socket verbinden:

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

netcat-openbsdunterstützt das Verbinden mit UNIX-Domain-Sockets. Mit dieser Option können Sie eine Verbindung zu einem UNIX-Domain-Stream-Socket oder einem UNIX-Domain-Datagramm-Socket herstellen . Daher müssen Sie den Socket-Typ Netcat mitteilen.

zum Beispiel /dev/logDatei in Linux ist eine Datagramm - Socket UNIX-Domain - Buchse, so nc -U /dev/log wird nicht funktionieren . Verwenden Sie stattdessen nc -uU /dev/log. Wenn Sie -u zusammen mit -U verwenden, wird netcat mitgeteilt, dass es sich um einen UNIX-Domain-Datagramm-Socket handelt.

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


Verwenden Sie während der Verwendung socatdie Option UNIX-CLIENT. Mit dieser Option können Sie eine Verbindung zu UNIX-Domain-Stream- und UNIX-Domain-Datagram- Sockets herstellen. Auf der Manpage (man socat) wird " zuerst versucht, eine Verbindung herzustellen , und wenn dies fehlschlägt, wird davon ausgegangen , dass es sich um einen Datagramm-Socket handelt, der beide Typen unterstützt ".

socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
Sahil Singh
quelle
1
Es ist überraschend flexibel und gut parametrierbar.
user259412
15

Sie können socat unter Debian verwenden. So installieren Sie es:

# apt-get install socat
sendmoreinfo
quelle
Das sieht ziemlich gut aus. Ich scheine nicht socatauf meinem Server installiert zu haben , aber es ist auf jeden Fall verfügbar: packages.debian.org/squeeze/socat
Paul D. Waite