MySQL sugar语法,用于创建经过身份验证的所有特权用户及其数据库

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

这就是我如何通过Linux中的MySQL CLI(带Bash的Ubuntu)在MySQL中创建经过身份验证的、所有特权的用户及其数据库的方法:


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中,所有进程都是必须在数据库中定义,其默认值为
安全定义器
,因此无需明确说明。关于为选定用户授予
执行
,我在回答中已经说明了这一点。