たとえば、mysqlと対話するcronスクリプトを作成したいと思います。
#!/bin/bash
mysql -uroot -p
echo root
echo "CREATE DATABASE example"
しかし、うまくいきません。プロンプトのみが表示されます。
Enter password:
mysqlを終了すると、次のように表示されます。
root
"CREATE DATABASE example"
どんなアイデアがありますか?
答え1
次のように入力してください。
[client]
user=root
password="my-very-secret-password"
ファイル内の権限は、ファイルの読み取り権限を持つ人以外の人がファイルを読み取ることができないことを保証します。
そして、以下を実行してください:
#! /bin/sh -
mysql --defaults-extra-file=/path/to/that/file --batch << "EOF"
CREATE DATABASE example
EOF
バラよりMySQLセルフガイドより多くの情報を知りたいです。
スクリプトにパスワードを入力してスクリプト自体への読み取りアクセスを制限することはできますが、パスワードがどのコマンドの引数にも渡されないようにする必要があります。これにより、出力から誰にでもパスワードが表示されますps
。
次のことができます。
#! /bin/sh -
mysql --defaults-extra-file=/dev/fd/3 --batch 3<< "END_OF_AUTH" << "END_OF_SQL"
[client]
user=root
password="my-very-secret-password"
END_OF_AUTH
CREATE DATABASE example
END_OF_SQL
答え2
これはStéphane Chazelasの答えに似ていますが、プロセスの交換ユーザーとパスワードを提供するために、Heredocの代わりにシェル関数を使用します。
#!/bin/bash
printconf() {
cat <<-EOF
[mysql]
user=root
password=supersecretpassword
EOF
}
mysql --defaults-extra-file=<(printconf) -e 'CREATE DATABASE example'
Function( printconf
) は単に正しい形式の mysql conf ファイルを出力します。
IMO、これは1行に複数のheredocを持つよりも読みやすくなります。
それでもユーザーとパスワードの詳細がスクリプトに含まれているため(このような~/.my.cnf
外部ファイルは必要ありません)、まだカーネルプロセステーブルにパスワードが公開されるのを防ぎます(たとえば、などを介してps
)pgrep
。
メモ:bash
これには、プロセスの置き換え(たとえば、zsh
または)をサポートする最新のシェルが必要ですksh
。
スクリプトにはプレーンテキストパスワードが含まれており、所有権、グループ、権限、および/またはACLを介して適切に保護する必要があります。つまり、少なくとも世界中で読むことはできません。
答え3
次のコマンドを使用してSQL文を実行できる必要があります。
mysql -u root -p<password> -e "CREATE DATABASE example"
-pとパスワードの間にスペースはありません。
答え4
Stéphane Chazelasの回答と同様に、.my.cnf
スクリプトの実行に使用するユーザーの自宅で1つを作成し、資格情報を追加してからスクリプトを実行できます。
~/.my.cnf
[client]
user=root
password="This15MyPa55word"
スクリプト
#!/bin/bash
mysql -e "CREATE DATABASE example"
~からman mysql
--execute=文、-e文
Execute the statement and quit. The default output format is like that produced with --batch. See Section 4.2.4, “Using Options on the Command Line”, for some examples. With this option, mysql does not use the history file.