Erstellen Sie einen benannten Unix-Socket über die Befehlszeile

29

Gibt es einen Befehl ähnlich wie mkfifo, aber für Domain-Sockets?

benmmurphy
quelle

Antworten:

21

Es gibt kein genaues Äquivalent zu mkfifo für Socket, dh es gibt keinen Befehl, der nur einen "hängenden" Socket erzeugt. Dies hat historische Gründe: Die Serverfunktion bind (), die einen Socket-Namen / Inode im Dateisystem erstellt, schlägt fehl, wenn der Name bereits verwendet wird. Mit anderen Worten, der Server kann nicht mit einem bereits vorhandenen Socket arbeiten.

Wenn Sie also früher einen Socket erstellt hätten, müsste dieser ohnehin zuerst vom Server entfernt werden. Kein Vorteil. Wie Sie anhand der Antwort von Gregory sehen, können Sie einen Socket erstellen, wenn Sie einen Server dafür haben, z. B. netcat. Sobald ein Server weg ist, ist der alte Socket weg. Ein neuer Server hat einen neuen Socket, und alle Clients müssen erneut eine Verbindung herstellen, obwohl der Name des Sockets identisch ist.

kubanczyk
quelle
15

Die neuesten Netcat- (nc) und ähnlichen Programme (so weit ich weiß socat) haben Domain-Socket-Optionen.
Ansonsten können Sie sich ucspi-unix ansehen

Gregory MOUSSAT
quelle
1
+1 für ncBSD.
Clint Pachl
1
Über Debian:# sudo apt-get install netcat-openbsd
Dr. Koutheir Attouchi
2
ok wenn du das installiert hast, wie erstelle ich eine "Socket-Datei"
Alexander Mills
8

Sie können Python verwenden:

python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/test.sock')"

Siehe auch C diese Antwort .

akostadinov
quelle
mksock() { SOCK="$1" python -c "import os, socket as s; s.socket(s.AF_UNIX).bind(os.environ['SOCK'])"; }für einfache Shell-Nutzung: mksock /tmp/test.sock
Tino
0

Ich benutze netcatund höre in einem solchen Fall einfach weiter :

nc -lkU aSocket.sock

du solltest netcat-openbsd verwenden . netcat-traditional hat keinen -USwitch für Unix Domain Sockets.

Karimai
quelle
-k Erzwingt, dass nc nach Abschluss der aktuellen Verbindung weiterhin auf eine andere Verbindung wartet. Es ist ein Fehler, diese Option ohne die Option -l zu verwenden. -U Gibt an, dass Sockets für UNIX-Domänen verwendet werden sollen.
Johan Boulé