自己写:找出对全世界开门的那个账号

👁️ 0 人浏览 💬 0 人评论 ❤️ 添加收藏

把 TODO 补完,打出 GRANTS来源写成 % 的那个账号名

题面里已经准备好四份**真实形状**的运维文本(都是字符串)
GRANTS  5 行 SHOW GRANTS 的输出(app / root / ro / bak 四个账号)
DUMP    一份 mysqldump 的产物(两张表 goods 和 orders)
SLOW    5 条慢查询记录,每条两行:一行统计、一行语句
MYCNF   一份 my.cnf 的 [mysqld] 段

两个现成的工具函数
slow_rows()  → 把慢日志拆成 (用了几秒, 等锁几秒, 扫了多少行, 语句) 的列表
cnf(key)     → my.cnf 里某一项现在配的是什么(找不到返回"没配")
GRANTS = """GRANT USAGE ON *.* TO `app`@`10.0.%`
GRANT SELECT, INSERT, UPDATE ON `shop`.* TO `app`@`10.0.%`
GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` WITH GRANT OPTION
GRANT SELECT ON `shop`.`orders` TO `ro`@`%`
GRANT SELECT, INSERT, UPDATE, DELETE ON `shop`.* TO `bak`@`10.0.5.7`"""

DUMP = """-- MySQL dump 10.13  Distrib 8.0.36
-- Host: db-1    Database: shop
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `price` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `goods` VALUES (1,'a',10),(2,'b',20),(3,'c',30);
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `id` int NOT NULL AUTO_INCREMENT,
  `gid` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `orders` VALUES (1,1),(2,1),(3,2),(4,3),(5,3);
-- Dump completed"""

SLOW = """# Query_time: 0.80  Lock_time: 0.00  Rows_sent: 12  Rows_examined: 1200
SELECT * FROM goods WHERE price > 5;
# Query_time: 12.40  Lock_time: 12.10  Rows_sent: 1  Rows_examined: 3
UPDATE goods SET price = 99 WHERE id = 1;
# Query_time: 7.60  Lock_time: 0.00  Rows_sent: 250  Rows_examined: 480000
SELECT * FROM orders WHERE gid = 7;
# Query_time: 3.10  Lock_time: 0.02  Rows_sent: 40  Rows_examined: 9000
SELECT * FROM goods WHERE name = 'x';
# Query_time: 0.50  Lock_time: 0.00  Rows_sent: 5  Rows_examined: 300
SELECT COUNT(*) FROM orders;"""

MYCNF = """[mysqld]
bind-address = 0.0.0.0
skip-name-resolve = ON
max_connections = 500
slow_query_log = ON
long_query_time = 10
local_infile = ON
sql_mode = STRICT_TRANS_TABLES"""


def slow_rows():
    """把慢日志拆成一条一条:(用了几秒, 等锁几秒, 扫了多少行, 语句)。"""
    out = []
    ls = SLOW.split("\n")
    for i in range(0, len(ls), 2):
        f = ls[i].replace(":", " ").split()
        out.append((float(f[2]), float(f[4]), int(f[8]), ls[i + 1]))
    return out


def cnf(key):
    """my.cnf 里某一项现在配的是什么(找不到返回"没配")。"""
    for line in MYCNF.split("\n"):
        if line.startswith(key):
            return line.split("=")[1].strip()
    return "没配"
# TODO:找出来源是 `%` 的那一行,把账号名打出来
print("")
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论