プロセスを自動化する必要があり、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]"
foo
TCLにプロシージャ(proc
または他の言語が呼び出すことができるsub
)を呼び出そうとしますfunction
。人々は反撃できる[
expect "blah \[foo]"
または、引用符を使用して{}
補間を無効にします。
expect {blah [foo]}
これは賢明な選択です。このポイントを超えてコードを使用しないでください!
愚かなプログラミング部門
returnを呼び出す関数を作成することもできますproc
。Y/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>