mariadbをインストールするためのexpectスクリプトを書く方法は?


11

環境:centos7 + mariadb5.5.64。
実行するときに画面にインストール情報を表示しますmysql_secure_installation

# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

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

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

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

Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

私は、mariadbをインストールするためのオートメーション期待スクリプトを記述します。

  vim secure.exp
  set timeout 60
  spawn mysql_secure_installation
  expect {
      "Enter current password for root (enter for none): " {send "\r";exp_continue}
      "Set root password? [Y/n] " {send "y\r";exp_continue}
      "New password:" {send "123456\r";exp_continue}
      "Re-enter new password:" {send "123456\r";exp_continue}
      "Remove anonymous users? [Y/n]" {send "y\r";exp_continue}
      "Disallow root login remotely? [Y/n]" {send "y\r";exp_continue}
      "Remove test database and access to it? [Y/n]" {send "y\r";exp_continue}
      "Reload privilege tables now? [Y/n]" {send "y\r";exp_continue}
  }

を実行するに/usr/bin/expect secure.expは、エラーに遭遇します:

spawn mysql_secure_installation
invalid command name "Y/n"
    while executing
"Y/n"
    invoked from within
"expect {
          "Enter current password for root (enter for none): " {send "\r";exp_continue}
          "Set root password? [Y/n] " {send "y\r";exp..."
    (file "secure.exp" line 3)

以下のように書くのは無駄です。

  set timeout 60
  spawn mysql_secure_installation
  expect {
      "Enter current password for root (enter for none): " {send "\r";exp_continue}
      "Set root password? \\[Y/n] " {send "y\r";exp_continue}
      "New password:" {send "123456\r";exp_continue}
      "Re-enter new password:" {send "123456\r";exp_continue}
      "Remove anonymous users? \\[Y/n]" {send "y\r";exp_continue}
      "Disallow root login remotely? \\[Y/n]" {send "y\r";exp_continue}
      "Remove test database and access to it? \\[Y/n]" {send "y\r";exp_continue}
      "Reload privilege tables now? \\[Y/n]" {send "y\r";exp_continue}
  }

同じエラー:

invalid command name "Y/n"
    while executing
"Y/n"
    invoked from within
"expect {
      "Enter current password for root (enter for none): " {send "\r";exp_continue}
      "Set root password? \\[Y/n] " {send "y\r";exp_conti..."
    (file "secure.exp" line 3)

私のexpスクリプトをどのように修正するのですか?


ExpectはTcl拡張です。Tclで、[ ... ]あるコマンド置換シェルのようなものです$( ... )。したがって、"Set root password? [Y/n] "と書く必要があります"Set root password? \\[Y/n] "
pynexj

回答:


5

これらのスクリプトは、オプションの出力(timeout -1「タイムアウトなし」を意味します)を受け取るまで待機し、yum installおよび で必要とされるため、さまざまな応答を区別できますmysql_secure_installation#!/bin/expect -fそれらが設定された場合など、シェバング、スクリプトは、実行することができますchmod +x

A)まず、mariadb_yum.expsuまたはが必要sudo):

#!/bin/expect -f
set timeout 30
if {[llength $argv] == 0} {
    send_user "Usage: mariadb_yum.exp \[linux sudo password\]\n"
    exit 1
}
set USERNAME "[exec whoami]"
set PASSWORD [lindex $argv 0];

# optionally, redirect output to log file (silent install)
# log_user 0
# log_file -a "/home/$USERNAME/mariadb_install.log"

spawn sudo yum -y install MariaDB-server
set yum_spawn_id $spawn_id

# On GCE it will never ask for a sudo password:
expect -ex "\[sudo\] password for $USERNAME: " {
   exp_send "$PASSWORD\r"
}

expect {
    # when the package was already installed
    -ex "Nothing to do" {
        send_user "package was already installed\n"
    }
    # when the package had been installed
    -ex "Complete!" {
        send_user "package had been installed\n"
    }
}

expect eof
close $yum_spawn_id
exit 0

B)そして、mariadb_sec.exp(必要ありませんsudo):

#!/bin/expect -f
set timeout 1
if {[llength $argv] == 0} {
    send_user "Usage: mariadb_sec.exp \[mysql root password\]\n"
    exit 1
}
set PASSWORD [lindex $argv 0];

spawn mysql_secure_installation
set mysql_spawn_id $spawn_id

# optionally, redirect output to log file (silent install)
# log_user 0
# log_file -a "/home/[exec whoami]/mariadb_install.log"

# when there is no password set, this probably should be "\r"
expect -ex "Enter current password for root (enter for none): "
exp_send "$PASSWORD\r"

expect {
    # await an eventual error message
    -ex "ERROR 1045" {
        send_user "\nMariaDB > An invalid root password had been provided.\n"
        close $mysql_spawn_id
        exit 1
    }
    # when there is a root password set
    -ex "Change the root password? \[Y/n\] " {
        exp_send "n\r"
    }
    # when there is no root password set (could not test this branch).
    -ex "Set root password? \[Y/n\] " {
        exp_send "Y\r"
        expect -ex "New password: "
        exp_send "$PASSWORD\r"
        expect -ex "Re-enter new password: "
        exp_send "$PASSWORD\r"
    }
}
expect -ex "Remove anonymous users? \[Y/n\] "
exp_send "Y\r"
expect -ex "Disallow root login remotely? \[Y/n\] "
exp_send "Y\r"
expect -ex "Remove test database and access to it? \[Y/n\] "
exp_send "Y\r"
expect -ex "Reload privilege tables now? \[Y/n\] "
exp_send "Y\r"

expect eof
close $mysql_spawn_id
exit 0

デバッグ目的で、または回答を検証するために、expectログレベルで実行できますstrace 4。これは、expectスクリプトの作成に関しては、ソースが得ることができるのと同じくらい評判が良いでしょう。何が起こっているか、そして最も重要なことは、発生する順序でうまく表示されるからです。

expect -c "strace 4" ./mariadb_yum.exp [linux sudo password]
expect -c "strace 4" ./mariadb_sec.exp [mysql root password]

命令set exp_internal 1は、正規表現マッチングの出力を取得するために使用できます。


混乱の原因となる可能性があるのは、プロセスを生成する場合です。sshローカルで、yumそしてmysql_secure_installationリモートで。$spawn_idスクリプトに追加されました。下の1のcloseそれはすでにあるので、コールは、冗長かもしれませんEOF(単にする方法を示すことspawncloseプロセス):

Thanks for using MariaDB!
 1  close $mysql_spawn_id
 1  exit 0
 2  rename _close.pre_expect close

結論:mariadb_sec.expスクリプトはおそらくさらに改善される可能性があります。最初にパスワードを送信せず、何が起こるかを確認するERROR 1045とき-次にパスワードを送信します(以前にパスワードが設定されている場合)。サーバーがインストールされた直後にパスワードを設定する必要があると仮定するのは簡単です(yum reinstall同じ結果が得られる場合を除く)。すべてのケースをテストするための空のCentOSコンテナーがありませんでした。rootシェルで実行しない限り、インストールからポストインストールまでこれを自動化するには、両方の種類のパスワードを1つのスクリプトに渡す必要があります。

おそらく注目に値するのは、GCEではsudoパスワードを要求しないことです。これらのCentOSコンテナイメージの動作は異なるため、実際には環境に基づいてわずかな違いがあります。このような場合(suコンテナイメージの検出mariadb_yum.expがないため)、スクリプトが30数秒間停止してから続行する場合があります。


私が提供できる最も信頼できるソースは、expectDon Libes @ NISTによって書かれたマニュアルとのTCL / TKマニュアル、expectおよび偶然に呼び出されたSourceForgeプロジェクトexpectです。


2

角括弧はコマンド置換に使用されるだけでなく、グロブパターンにも特別です

-exact角括弧を引用符で囲んでスイッチを使用することもできます。

spawn mysql_secure_installation
expect {
    ...
    -exact "Set root password? \[Y/n\] " {send "y\r";exp_continue}
    ...
}

または、引用符の代わりに中括弧を使用します。

spawn mysql_secure_installation
expect {
    ...
    {Set root password? \[Y/n\] } {send "y\r";exp_continue}
    ...
}

参考までに、次のコマンドを使用して、expectスクリプトを生成できますautoexpect

autoexpect ./mysql_secure_installation

これscript.expにより、現在の作業ディレクトリで呼び出されるexpectスクリプトが生成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.