Как я могу общаться с доменным сокетом Unix через оболочку в Debian Squeeze?


99

Я использую веб-сервер Debian Squeeze. Я установил memcached на нем и настроил memcached для прослушивания на доменном сокете Unix (at /tmp/memcached.sock), так как ему нужно только получать сообщения с веб-сайта, который находится на том же сервере.

Кажется, все работает нормально, но я бы также хотел пообщаться с memcached через оболочку, чтобы убедиться, что он делает то, что, я думаю, он делает.

memcached принимает сообщения через простой протокол ASCII (если я правильно понимаю). Если бы он прослушивал TCP / IP, я мог бы отправлять ему сообщения, например nc:

$ echo "stats settings" | nc localhost 11211

Но я не могу понять, как отправить этот текст в сокет домена вместо этого.

На моем ноутбуке (который работает под управлением OS X Lion) оба ncи telnetимеют параметры ( -Uи -uсоответственно) для использования доменных сокетов. Однако на моем веб-сервере Debian Squeeze этих опций нет.

Ответы:


72

С netcat-openbsd, есть -Uвариант. Если у вас его нет, скорее всего, вы netcat-traditionalустановили его; Я бы предложил переключиться.

Пример команды: nc -U /var/run/socket


так netcat создаст новый файл в /var/run/socket? Есть ли способ повторно использовать существующий файл?
Александр Миллс

1
@AlexanderMills Если вы скажете ему слушать ( -l), он создаст файл. В противном случае он ожидает, что сокет уже существует (и уже что-то слушает). Таким образом, пример команды в ответе не создает файл.
Дероберт

94

С помощью socat(«двунаправленной передачи данных между двумя каналами данных») вы можете подключиться к сокету домена Unix следующим образом:

$ socat - UNIX-CONNECT:/tmp/memcached.sock

20

netcat-openbsdподдерживает подключение к сокетам UNIX-домена. Используя это, вы можете подключиться либо к потоковому сокету домена UNIX, либо к датаграмме сокета домена UNIX , и, следовательно, вы должны указать тип сокета netcat.

например, /dev/logфайл в Linux является сокетом сокета дейтаграммы UNIX-домена , поэтому nc -U /dev/log не будет работать . Вместо этого используйте nc -uU /dev/log. Использование -u вместе с -U говорит netcat, что это сокет дейтаграммы UNIX-домена.

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


Аналогично, при использовании socatиспользуйте параметр UNIX-CLIENT. С помощью этой опции можно подключить как к потоку UNIX-домен и UNIX-домен датаграмм сокетов. Со страницы руководства (man socat) : « Сначала он пытается подключиться и, в случае неудачи, предполагает, что это сокет дейтаграммы, поддерживая оба типа ».

socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type

1
Это удивительно гибкий, хорошо параметризуемый инструмент.
user259412

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.