web-dev-qa-db-ja.com

bashを使用して1つのスクリプトから別のスクリプトに入力を渡す方法

mysql_secure_installationスクリプトを起動し、各プロンプトで適切な回答を提供するスクリプトを書いています。私はこのようにエコーを使ってみました:

echo -e "\n\n$db_pass\n$db_pass\n\n\n\n\n" | /usr/bin/mysql_secure_installation

完全には機能しません。それは最後の5つの質問には正しく答えているようですが、最初の3つの質問には正しく答えていません(これはCentOS 6.5ボックスにあります)。出力は次のとおりです。

In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

stty: standard input: Invalid argument
Enter current password for root (enter for none):
stty: standard input: Invalid argument
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n]  ... skipping.

Rootパスワードを要求された場合は、リターンを送信する必要があります。次に、ルートパスワードを設定するように求められたときに、もう一度リターンを送信する必要があります。ただし、出力からわかるように、発生していません。

これを期待どおりに機能させるには、何をする必要がありますか?

7
user5013

この MySQL開発サイトのバグレポート は、インタラクティブなユーザーセッションを必要とするmysql_secure_installationの問題に対処します。

そこでは、回避策として expect を使用するいくつかのヒントと例を含むいくつかの良い議論があります。スクリプトを非対話的に(つまり、ユーザーの直接の対話なしで)実行したいという要望に対処するための最良のアドバイスは、次のexpectスクリプトを提供するDaniëlvan Eedenによる回答です。

#!/usr/bin/expect --
spawn /usr/local/mysql/bin/mysql_secure_installation

expect "Enter current password for root (enter for none):"
send "\r"

expect "Set root password?"
send "y\r"

expect "New password:"
send "password\r"

expect "Re-enter new password:"
send "password\r"

expect "Remove anonymous users?"
send "y\r"

expect "Disallow root login remotely?"
send "y\r"

expect "Remove test database and access to it?"
send "y\r"

expect "Reload privilege tables now?"
send "y\r"

puts "Ended expect script."

また、ベースのMySQLインストールの包括的な問題のように、安全でないものが適切に配置されているようです MySQL 5.6.8で対処されているようです RPMを介した新規インストール、または--random-passwordオプション:

新しいRPMインストール操作(アップグレードではない)は、-random-passwordsオプションを指定してmysql_install_dbを呼び出します。その結果、このバージョン以降のRPMインストールでは、ルートアカウントが保護され、匿名ユーザーアカウントはありません。 (Unbreakable Linux NetworkのRPMを使用したインストール操作は、mysql_install_dbを使用しないため影響を受けません。)

バイナリ.tar.gzディストリビューションまたはソースディストリビューションを使用したインストール操作の場合、--random-passwordsオプションを指定してmysql_install_dbを手動で呼び出して、 MySQLのインストールはより安全です。これは、特に機密データのあるサイトに推奨されます。

6
JakeGould

それはできません。スクリプトとやり取りしたい場合は、 expect(1) のようなものを使用する必要があります。SFの例と、これを行う方法のより広いインターネット上に例があります。

mysql_secure_Installation の多くをエミュレートできます

/usr/bin/mysql -uroot -e "DELETE FROM mysql.user WHERE User=\'\'; DELETE FROM mysql.user WHERE User=\'root\' AND Host NOT IN (\'localhost\', \'127.0.0.1\', \'::1\'); DROP DATABASE IF EXISTS test; FLUSH PRIVILEGES;"

その後、ルートパスワードを設定するだけで済みます。

7
user9517