2015-10-20 14 views
13

Voglio inviare uno PING a Redis per verificare se la connessione funziona, ora potrei semplicemente installare redis-cli, ma non voglio e curl è già lì. Quindi, come posso abusare di curl per farlo? Fondamentalmente ho bisogno di spegnere quello di inviare qui:Abuso cURL per comunicare con Redis

> 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:' 

ero in grado di sbarazzarsi del User-Agent del tutto con l'aggiunta di -A "", ma non riesco a trovare niente altro per il resto. Qualche idea su come posso farlo?

+0

Redis è un server TCP, quindi utilizzare netcat o impostare un'interfaccia HTTP come https://github.com/voidfiles/lark o https://github.com/nicolasff/webdis (se si vuole veramente fare quella!). – deltheil

risposta

16

Quando si desidera utilizzare l'arricciatura, è necessario REST su RESP, come webdis, tinywebdis o turbowebdis. Vedere https://github.com/markuman/tinywebdis#turbowebdis-tinywebdis--cherrywebdis

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

Senza un'interfaccia REST per Redis, è possibile utilizzare netcat per esempio.

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

Con netcat è necessario creare il protocollo RESP da soli. Vedi http://redis.io/topics/protocol

+0

Netcat è perfetto! – Mahoni

+2

L'intera cosa di printf non ha fatto nulla per me, ma quando ho appena eseguito il comando nc e ho digitato il PING ho ricevuto il mio PONG. – snetch

+3

Just 'echo PING | nc localhost 6379' ha funzionato bene per me. –

11

avevo bisogno di aggiungere un sonno al CN fornito da @Markus per farlo funzionare da un sistema remoto:

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

Vedi Request/Response protocols and RTT: Redis Pipelining per i dettagli.

+0

In AWS EC2 in AWS ElastiCache Redis, il 'sleep 1' era necessario per me, anche se' echo PING' funziona ugualmente bene come 'printf' – davur

16

Non curl, ma non richiede un'interfaccia HTTP o NC (ottimo per qualcosa come un contenitore in cui non si ha installata nc)

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

dovrebbe darvi

+PONG

Ulteriori informazioni su cosa succede a this fantastic article.

+3

fantastico! questo mi ha reso la mia giornata –

+0

Questo ha funzionato per me, super utile. Puoi spiegare cosa sta succedendo con quelle parentesi angolari? Non sono sicuro di cosa iniziare a googling per scoprire cosa sono. –

+2

@EricHu '3 <>' Sta aprendo il descrittore di file 3 come read-write al file '/ dev/tcp/127.0.0.1/6379', quindi'> & 3' reindirizza lo stdout dall'eco a FD3 e reindirizzamenti <& 3' stdin dalla FD3 alla testa. –