在mysql中插入用户定义的variablesCREATE USER

我想创build一个shell脚本在docker CLI中运行,并创build一个MySQL用户,并将主机IP作为命令行variables传递。 所以用我的脚本将是./create_user.sh 172.17.0.1

我试着开始只在sql语句部分插入variables,并使用这样的东西:

 #!/bin/sh docker exec -i atb-mariadb bash <<'EOF' mysql -uroot -pmypass set @ip='172.17.0.1'; CREATE USER 'exporter'@@ip IDENTIFIED BY 'mypass'; GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'172.17.0.1'; GRANT SELECT ON performance_schema.* TO 'exporter'@'172.17.0.1'; SELECT user, host FROM mysql.user; exit EOF 

这导致语法错误,以及一些其他的我试过:

 CREATE USER CONCAT_WS('exporter','@',@ip) IDENTIFIED BY 'mypass'; CREATE USER 'exporter'@CONCAT_WS('',@ip) IDENTIFIED BY 'mypass'; 

这当然只是脚本的sql语句部分中的variables。 在整个shell脚本中使用一个variables,并将其传入到sql bash中是一个我甚至还没有能够完成的问题。

提前感谢任何帮助!

更新

我尝试了Raymond Nijland的解决scheme,它为sqlvariables部分工作。 但是,尝试通过命令行传递variables值对于以下脚本仍然失败:

 #!/bin/sh echo script received $1 docker exec -e ipa=$1 -i atb-mariadb bash <<'EOF' echo exec received $ipa mysql -uroot -pmypass -e " SET @ip='${ipa}'; SET @createUser = 'CONCAT("CREATE USER exporter@",@ip,"IDENTIFIED BY'mypass'")'; PREPARE smtpCreateUser FROM @createUser; EXECUTE smtpCreateUser;"; exit EOF 

与输出

 $ ./create_user.sh 172.18.0.5 script received 172.18.0.5 exec received 172.18.0.5 mysql Ver 15.1 Distrib 10.2.9-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Usage: mysql [OPTIONS] [database] Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf The following groups are read: mysql client client-server client-mariadb The following options may be given as the first argument: --print-defaults Print the program argument list and exit. ......and so on 

我不知道通常的做法是使用-e句柄运行一个单独的.sql脚本文件,但不幸的是,将该文件绑定到默认的mariadb容器或创build一个自定义映像都是不可能的,考虑到当前的需求。

您应该能够使用CONCAT生成dynamicSQL语句,并执行它们。

询问

 SET @ip = '172.17.0.1'; SET @createUser = CONCAT( "CREATE USER exporter@",@ip, " IDENTIFIED BY 'mypass'" ); PREPARE smtpCreateUser FROM @createUser; EXECUTE smtpCreateUser; 

在查询中使用之前,您需要从shell中获取variables。 我想你正在寻找类似的东西(确保从EOF删除引号):

 #!/bin/sh docker exec -i atb-mariadb bash <<EOF ip="${1:-127.0.0.1}" echo mysql -uroot -pmypass echo CREATE USER 'exporter'@'${ip}' IDENTIFIED BY 'mypass'; GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'172.17.0.1'; GRANT SELECT ON performance_schema.* TO 'exporter'@'172.17.0.1'; SELECT user, host FROM mysql.user; exit EOF