Подтвердить что ты не робот

Злоупотреблять cURL, чтобы общаться с Redis

Я хочу отправить PING в Redis, чтобы проверить, работает ли соединение, теперь я могу просто установить redis-cli, но я не хочу, и curl уже существует. Итак, как я могу злоупотреблять curl, чтобы сделать это? В основном мне нужно отключить, что отправить здесь:

> GET / HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:6379
> Accept: */*
> 
-ERR wrong number of arguments for 'get' command
-ERR unknown command 'User-Agent:'
-ERR unknown command 'Host:'
-ERR unknown command 'Accept:'

Мне удалось полностью избавиться от User-Agent, добавив -A "", но я ничего не могу найти для остальных. Любая идея, как я могу это сделать?

4b9b3361

Ответ 1

Если вы хотите использовать curl, вам нужен REST поверх RESP, например webdis, tinywebdis или turbowebdis. См. Https://github.com/markuman/tinywebdis#turbowebdis-tinywebdis--cherrywebdis.

$ curl -w '\n' http://127.0.0.1:8888/ping
{"ping":"PONG"}

Без интерфейса REST для redis, вы можете использовать netcat, например.

$ (printf "PING\r\n";) | nc localhost 6379 
+PONG

С Netcat вы должны создать протокол RESP самостоятельно. Смотрите http://redis.io/topics/protocol

обновление 2018-01-09

Я построил мощную функцию bash, которая пингует экземпляр Redis любой ценой по TCP

    function redis-ping() {
            # ping a redis server at any cost
            redis-cli -h $1 ping 2>/dev/null || \
                    echo $((printf "PING\r\n";) | nc $1 6379 2>/dev/null || \
                    exec 3<>/dev/tcp/$1/6379 && echo -e "PING\r\n" >&3 && head -c 7 <&3)
    }

использование redis-ping localhost

Ответ 2

Не скручивается, но не требует интерфейса HTTP или nc (отлично подходит для чего-то вроде контейнера, где вы не установили nc)

exec 3<>/dev/tcp/127.0.0.1/6379 && echo -e "PING\r\n" >&3 && head -c 7 <&3

Должен дать вам

+PONG

Вы можете узнать больше о том, что происходит от этой фантастической статьи.

Ответ 3

Мне нужно было добавить сон к nc, предоставленному @Markus, чтобы заставить его работать из удаленной системы:

(printf "PING\r\n"; sleep 1) | nc remote.redis.hostname 6379

Подробнее см. Протоколы запроса/ответа и RTT: Redis Pipelining.