MySQL sugar语法,用于创建经过身份验证的所有特权用户及其数据库
这就是我如何通过Linux中的MySQL CLI(带Bash的Ubuntu)在MySQL中创建经过身份验证的、所有特权的用户及其数据库的方法:MySQL sugar语法,用于创建经过身份验证的所有特权用户及其数据库,mysql,sql,Mysql,Sql,这就是我如何通过Linux中的MySQL CLI(带Bash的Ubuntu)在MySQL中创建经过身份验证的、所有特权的用户及其数据库的方法: cat我不知道有任何内置命令可以同时执行所有这些任务,但您可以轻松定义自己的命令: CREATE PROCEDURE addNewDomain(domain VARCHAR(32), password VARCHAR(32)) BEGIN DECLARE db VARCHAR(66) DEFAULT CONCAT('`', REPLACE(domai
cat我不知道有任何内置命令可以同时执行所有这些任务,但您可以轻松定义自己的命令:
CREATE PROCEDURE addNewDomain(domain VARCHAR(32), password VARCHAR(32))
BEGIN
DECLARE db VARCHAR(66) DEFAULT CONCAT('`', REPLACE(domain, '`', '``'), '`');
DECLARE ac VARCHAR(76) DEFAULT CONCAT(db, '@localhost');
SET
@a := CONCAT('CREATE USER ', ac, ' IDENTIFIED BY ', QUOTE(password)),
@b := CONCAT('CREATE DATABASE ', db),
@c := CONCAT('GRANT ALL PRIVILEGES ON ', db, '.* TO ', ac)
;
PREPARE stmt FROM @a; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PREPARE stmt FROM @b; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PREPARE stmt FROM @c; EXECUTE stmt; DEALLOCATE PREPARE stmt;
END
然后用一个调用语句调用:
CALL addNewDomain('foobar', 's3cr3t')
DELIMITER ;;
CREATE PROCEDURE addNewDomain(domain VARCHAR(32), password VARCHAR(32))
BEGIN
-- etc
END;;
DELIMITER ;
这种方法的一个优点是,该过程可以由具有完整CREATE
和GRANT
权限的用户定义,但是执行
的权限可以授予没有这些权限的用户,然后您的shell脚本可以使用较低权限的帐户连接到MySQL(这会造成较少的损害,如仅在受损情况下设置新域)
请注意,为了发出创建过程
命令(包含;
字符)您需要确保MySQL客户端的语句分隔符设置为除;
之外的其他值,否则在发送到服务器时,它会将命令拆分为多个单独的语句。MySQL CLI使用分隔符语句执行此操作:
CALL addNewDomain('foobar', 's3cr3t')
DELIMITER ;;
CREATE PROCEDURE addNewDomain(domain VARCHAR(32), password VARCHAR(32))
BEGIN
-- etc
END;;
DELIMITER ;
MySQL文档没有组合语法,大概是因为-
CREATE USER
和CREATE DATABASE
执行一次,而GRANT
执行多次
减少语法开销的一种方法是将SQL构造封装在shell函数中。对于bash,这可能如下所示:
grant_sql() {
local user pass
user="${1:?Missing argument #1: MySQL user name}"
pass="${2:?Missing argument #2: password for MySQL user}"
cat <<EOSQL
CREATE USER "${user}"@"localhost" IDENTIFIED BY "${pass}";
CREATE DATABASE ${user};
GRANT ALL PRIVILEGES ON ${user}.* TO "${user}"@"localhost";
EOSQL
}
我建议这没关系。这个脚本很少运行(当然不是每秒钟运行一次)。将您的时间花在其他脚本上。同时,使用bash函数和存储过程的答案是完成任务的“更干净”的方法,并使您只需“一行”@RickJames:而且,正如我在回答中所描述的,也可以更安全。将proc创建为root
,并添加SECURITY INVOKER
。这可以防止非特权用户运行该proc。@RickJames:我想说的全部要点是,如果您不这样做,而是通过授予权限来控制谁运行该proc在其上的EXECUTE
权限中,您可以允许选择的非特权用户运行进程,而无需授予他们使用CREATE
和GRANT
命令的更广泛权限。这比要求root
运行进程要好得多,因此在eve中可能会受到root攻击nt表示调用脚本已被破坏。因此,也许您需要将进程放入数据库中,并限制该数据库选择用户的EXECUTE
权限?并使用SECURITY DEFINER
?请在回答中明确说明安全设置和所需的其他步骤。@RickJames:在MySQL中,所有进程都是必须在数据库中定义,其默认值为安全定义器
,因此无需明确说明。关于为选定用户授予执行
,我在回答中已经说明了这一点。