我想设置密码以连接到Redis服务器。
执行此操作的适当方法是在配置文件中使用requirepass
指令。
http://redis.io/commands/auth
然而,在设置值之后,我在重启Redis时得到了这个:
Stopping redis-server: redis-server.
Starting redis-server: Segmentation fault (core dumped)
failed
为什么?
答案 0 :(得分:3)
密码长度限制为512个字符。
在redis.h中:
#define REDIS_AUTHPASS_MAX_LEN 512
在config.c中:
} else if (!strcasecmp(argv[0],"requirepass") && argc == 2) {
if (strlen(argv[1]) > REDIS_AUTHPASS_MAX_LEN) {
err = "Password is longer than REDIS_AUTHPASS_MAX_LEN";
goto loaderr;
}
server.requirepass = zstrdup(argv[1]);
}
现在,配置文件的解析机制非常基础。使用sds(字符串管理)库的sdssplitargs函数拆分所有行。此函数解释特定的字符序列,例如:
这里的问题是你的密码包含一个双引号字符。解析失败,因为字符串末尾没有匹配的双引号。在这种情况下,sdssplitargs函数返回一个NULL指针。发生核心转储是因为未在config.c代码中正确检查此指针:
/* Split into arguments */
argv = sdssplitargs(lines[i],&argc);
sdstolower(argv[0]);
这是一个应该提交给IMO的错误。
一个简单的解决方法是用十六进制序列替换双引号字符或任何其他解释字符(即双引号的。\ x22)。
答案 1 :(得分:2)
虽然没有记录,但似乎密码值存在限制,特别是包含的字符,而不是长度。
我尝试了160个字符(只是数字),它工作正常。 此
9hhNiP8MSHZjQjJAWE6PmvSpgVbifQKCNXckkA4XMCPKW6j9YA9kcKiFT6mE
太。但是这个
@hEpj6kNkAeYC3}@:M(:$Y,GYFxNebdH<]8dC~NLf)dv!84Z=Tua>>"A(=A<
没有。
因此,Redis不支持部分或全部“特殊字符”。
答案 2 :(得分:0)
刚刚用以下内容钉牢:
然后它可以通过(通常)tcp
发送到redis服务器的任何地方使用