次のBASHコマンドを実行するスクリプトを作成したいと思います。
mysqldump -u [username] -p [db_name] > [path to backup file]
これにより、バックアップファイルが作成されます。これをBASHで実行すると、続行する前にパスワードの入力を求められます。
パスワードが自動的に入力されるように、BASHスクリプトでこれを作成するにはどうすればよいですか?
これは安全に行うことができますか?
ここでの最善のアプローチは、次のようなことです。
mysqldump --defaults-extra-file=/path/to/auth.cnf ...
どこ auth.cnf
は次のようになります。
[client]
user=the-user
password=the-password
次に、そのスクリプトを実行するユーザーだけがファイルを読み取れるようにします。スクリプト自体は誰でも読み取り可能にすることができます。
システムが危険にさらされた場合に備えて、プレーンテキストのパスワードをファイルに残すことは常に悪い考えです。時にはそれは避けられない。これを「安全」にするには、このアクティビティを非常に限られたユーザーに制限し、これらの重要なオプションをデフォルトファイルに残しておく必要があります。
問題を具体的に解決するには、mysql
のmanページから:
If you use the short option form (-p), you cannot have a space
between the option and the password. If you omit the password
value following the --password or -p option on the command line,
mysql prompts for one.
これを修正するには、次を実行する必要があります。
mysqldump -u [username] -p[password] [db_name] > [path to backup file]
または
mysqldump -u [username] -password=[password] [db_name] > [path to backup file]
オプションが私が覚えているものと同じである場合、以下を実行できるはずです。
mysqldump -opt [db_name] -u [username] -p [password]> [path to backup file]
-pと実際のパスワードの間にスペースを入れないでください。
ステファンの答えは、mysqlの場合の最善の方法です。そして、ほとんどの場合、プログラムの「独自の」方法を使用するのが最善です。
ただし、質問のBashの部分に答えるには:
mysqldump -u joe -p <<<"joe's pasword" > /path/to/backup/file
または(安全性が低い)
mysqldump -u joe -p </path/to/file/with/joes/password > /path/to/backup/file
このアプローチでは、文字列をmysqldumpプロセスに渡すだけです。次の条件が満たされていれば機能します。
パスワードはそれが要求するものだけです、
すなわち。他のプロンプトはありません(ほとんどのコマンドはかなり予測可能です)。
インタラクティブでない場合でも、STDINからパスワードを受け入れます。
すなわち。プログラムは、入力時のファイルが対話型端末であるかどうかを意図的に確認し、中止することができます。
これは本当に他の人への補足的な答えです。許可されたらコメントとして追加します。
また、パスワードがプレーンテキストで表示されるため、あまり良い方法ではありません。これは、回避できる場合は絶対に行わないでください。 mysql構成ファイルは、少なくともスクリプトよりも簡単に保護されます。
私が避けている答えは、スクリプトを期待することです。 Expectスクリプトを使用すると、bashスクリプトはExpect内で実行され、ルールに一致する(Expected)入力を待機してから、(desired)出力で応答します。
実際には、「password:」を期待してから「myplaintextpassword\r」で応答するだけです。あるサーバー上のスクリプトが別のサーバー上でインタラクティブなsshセッションを実行できるように設計されています。
このトピックをカバーする質問は次のとおりです: Expect Scripting 。
ExpectはどのLinuxディストリビューションにも簡単にインストールできます。