2017-10-26 11 views
0

ドッカーCLIで実行するシェルスクリプトを作成し、コマンドライン変数として渡されたホストIPを使用してMySQLユーザーを作成します。mysqlにユーザー定義変数を挿入するCREATE USER

#!/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 

これは私が試したいくつかの他の人と一緒に、構文エラーになり: だから私のスクリプトでそれは私がSQL文の一部にのみ変数を挿入し、このようなものを使用して開始しようとした./create_user.sh 172.17.0.1

だろう:

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

これはもちろん、スクリプトのSQL文の部分内の変数だけです。シェルスクリプト全体で変数を使用し、それをsql bashに渡すことは、まだ私がまだ来ていないという問題です。

ありがとうございました!

を更新し

私はレイモンドNijlandのソリューションを試してみましたが、それがSQL可変部分のために働きました。しかし、まだ次のスクリプトのために失敗しているコマンドラインを使用して変数の値を渡そうと:出力

$ ./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 

#!/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 [email protected]",@ip,"IDENTIFIED BY'mypass'")'; 
PREPARE smtpCreateUser FROM @createUser; 
EXECUTE smtpCreateUser;"; 
exit 
EOF 

私はいつものアプローチは、別の.sqlスクリプトを実行することですunderstad -eハンドル付きのファイルですが、残念なことに、このファイルをデフォルトのmariadbコンテナにバインドマウントしたり、カスタムイメージを作成したりすることは、現在の要件では不可能です。

+0

mysql workbenchのようなエディタでクエリを実行しようとしましたか?エラー出力は何ですか? – T30

答えて

2

CONCAT、PREPAREを使用して動的SQL文を生成して実行できるはずです。あなたはそれがクエリで使用することができます前に、シェルから変数を取得する必要があり

クエリ

SET @ip = '172.17.0.1'; 

SET @createUser = CONCAT(
      "CREATE USER [email protected]",@ip, " IDENTIFIED BY 'mypass'" 
     ); 

PREPARE smtpCreateUser FROM @createUser; 
EXECUTE smtpCreateUser; 
0

。私はあなたが何かのようなものを探していると思います(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 
+0

私はこれを試してみましたが、私は得る: '$ ./create_user.sh のbash:4行目:GRANT:5行目:GRANT:6行目::SELECT:コマンドコマンドは bashのを見つけていないコマンドが bashのが見つかりません見つからない mysql -uroot -pmypass CREATE USERエクスポータ@ IDENTIFIED BY mypass' –

関連する問題