为什么netcat不会转储响应?

use*_*328 4 unix shell command-line-interface netcat redis

$ cat mass_insert.txt 
*3
$3
SET
$4
key1
$6
value1
*3
$3
SET
$4
key2
$6
value2
$ cat mass_insert.txt | nc localhost 6379
Run Code Online (Sandbox Code Playgroud)

如果你看到,我有redis命令用于在文件中进行大量插入mass_insert.text,我将cat它用于netcat并且命令可以很好地发送到redis但是响应不会被转储.问题是为什么?

工作得很好的简单google.comHEAD请求netcat,即转储响应 -

$ printf "HEAD / HTTP/1.0\r\n\r\n" | nc google.com 80
HTTP/1.0 302 Found
Location: http://www.google.co.in/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=cac6fac8de9b5d0c:FF=0:TM=1365352115:LM=1365352115:S=CVuSzOK8mrsfFczI; expires=Tue, 07-Apr-2015 16:28:35 GMT; path=/; domain=.google.com
Set-Cookie: NID=67=K5KjAFxuDP5epZKDdvSf4oCe4FRP1AL8LG_9MEdsArn4Oz_UBG69H0KOMUiKLuVN-hH4NIUvHOLgmfh_82P5v6Nh-sGFrGXyCnQz0zD-Sj_QbzxQ6NIK0rahsxjvyTn7; expires=Mon, 07-Oct-2013 16:28:35 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Date: Sun, 07 Apr 2013 16:28:35 GMT
Server: gws
Content-Length: 221
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Run Code Online (Sandbox Code Playgroud)

Did*_*zia 6

您可能需要检查以下几点.

首先,Redis协议中的行分隔符是\ r \n(而不仅仅是\n).因此,您需要确保输入文件包含这些字符.

然后,netcat关闭输入文件末尾的连接(因此可能不会等待Redis回复).它可能取决于netcat的版本.在我的系统上:

$ od -c toto.txt
0000000   *   3  \n   $   3  \n   S   E   T  \n   $   4  \n   k   e   y
0000020   1  \n   $   6  \n   v   a   l   u   e   1  \n   *   3  \n   $
0000040   3  \n   S   E   T  \n   $   4  \n   k   e   y   2  \n   $   6
0000060  \n   v   a   l   u   e   2  \n

$ ( sed 's/$/\r/' < toto.txt ; sleep 1 ) | netcat localhost 6379
+OK
+OK
Run Code Online (Sandbox Code Playgroud)

额外的秒数使netcat有机会阅读Redis回复.

请注意,-pipe模式下的redis-cli比netcat更适合通过Redis协议执行大量注入.