予測によるMySQLの自動化

予測によるMySQLの自動化

プロセスを自動化する必要があり、mysql_secure_installationこのスクリプトを作成しましたが、悲惨に失敗し、データベースのパスワードを設定したくありません。

#!/usr/bin/expect

set timeout 10
spawn mysql_secure_installation

expect "Enter current password for root (enter for none):"
send -- "\r"
expect "Set root password? [Y/n]"
send  "n\r"
expect "Remove anonymous users? [Y/n]"
send  "Y\r"
expect "Disallow root login remotely? [Y/n]"
send  "n\r"
expect "Remove test database and access to it? [Y/n]"
send "Y\r"
expect "Reload privilege tables now? [Y/n]"
send  "Y\r"
interact

間違い:

[root@localhost ansible]# ./mysql.sh
spawn 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): invalid command name "Y/n"
    while executing
"Y/n"
    invoked from within
"expect "Set root password? [Y/n]""
    (file "./mysql.sh" line 8)

ベストアンサー1

[TCLは特別で"..."補間法なので

"blah [foo]"

fooTCLにプロシージャ(procまたは他の言語が呼び出すことができるsub)を呼び出そうとしますfunction。人々は反撃できる[

expect "blah \[foo]"

または、引用符を使用して{}補間を無効にします。

expect {blah [foo]}

これは賢明な選択です。このポイントを超えてコードを使用しないでください!

愚かなプログラミング部門

returnを呼び出す関数を作成することもできますprocY/n[Y/n]

$ expect
expect1.1> proc Y/n {} { return "\[Y/n]" }
expect1.2> puts "abort [Y/n]"
abort [Y/n]
expect1.3> 

これにより、[Y/n]補間された文字列内で操作が可能になります。たぶんはるかに問題になるかもしれません。これは、unknown(n)どこに挿入されたほとんどのランダムな文字列に対して1つを生成できるからです。proc[...]proc

expect1.1> proc unknown args { return "\[$args]" }
expect1.2> puts "abort [Y/n]"
abort [Y/n]
expect1.3> puts "already exists [puts -nonewline puts\ ]"
puts already exists 
expect1.4> 

おすすめ記事