0

我正在尝试使用 mysql-proxy 来替换身份验证凭据,如下所示:

proxy.queries:append(1,
        proto.to_response_packet({
                username = "connect",
                response = password.scramble(s.scramble_buffer, password.hash("cpass!1")),
                charset  = 8, -- default charset
                database = c.default_db,
                max_packet_size = 1 * 1024 * 1024
        })
)

它因此错误而失败:

(关键)(read_auth)[字符串“/home/aabbcc/test.lua”]:51:必须设置.server_capabilities

如何正确设置“.server_capabilities”?

4

1 回答 1

0

examples/tutorial-scramble.lua 文件有很多问题——我认为它与当前的 mysql-proxy 已经过时了。proto.to_response_packet 调用需要一些常量和另一个参数:

...
local CLIENT_PROTOCOL_41       = 512    -- New 4.1 protocol
local CLIENT_SECURE_CONNECTION = 32768  -- New 4.1 authentication
local MYSQL_AUTH_CAPABILITIES  = ( CLIENT_PROTOCOL_41 + CLIENT_SECURE_CONNECTION )
...
proxy.queries:append(1,
        proto.to_response_packet({
                username = "connect",
                response = password.scramble(s.scramble_buffer, password.hash("cpass!1")),
                charset  = 8, -- default charset
                database = c.default_db,
                max_packet_size = 1 * 1024 * 1024,
                server_capabilities = MYSQL_AUTH_CAPABILITIES
        })
)

感谢这个 GitHub 项目的常量 - https://github.com/obrun/map-schema/blob/master/map-schema.lua

在此之后,您可能会收到另一个类似这样的错误:

network_mysqld_proto_password_scramble: assertion `20 == challenge_len' failed

出于某种原因,加扰缓冲区比它应该的要长——如果你把它打印出来,你会在最后看到空值——我们需要将它修剪到 20 个字符才能使用它:

...
response = password.scramble((s.scramble_buffer):sub(1,20), password.hash("cpass!1")),
...
于 2013-11-25T15:56:45.997 回答