mysql automation através da expectativa

0

eu preciso para automatizar mysql_secure_installation processo, eu escrevi este script, mas sua falha miseravelmente, eu não quero definir qualquer passwrd para banco de dados

#!/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

Erro:

[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)
    
por Mohd 01.07.2017 / 10:06

1 resposta

1

[ é especial no TCL e "..." interpola, então

"blah [foo]"

faz com que o TCL tente chamar o procedimento foo ( proc ou o que outros idiomas chamam de sub ou function ). Alguém pode voltar a usar o [

expect "blah \[foo]"

ou, em vez disso, cite com {} , o que desativa a interpolação

expect {blah [foo]}

Essas são as opções sãs. Não use nenhum código além desse ponto!

O Ministério da Silly Procs

Também podemos criar um proc que faz com que uma chamada para Y/n retorne [Y/n] ;

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

isso permite que [Y/n] opere dentro de uma string interpolada. Ainda mais problemas podem ser obtidos via unknown(n) , pois isso nos permite criar um proc para a maioria de qualquer string aleatória [...] interpolada em qualquer lugar ... a menos que um proc já exista para o nome do procedimento dado; como eu disse anteriormente, esta é uma má ideia e não deve ser usada.

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> 
    
por 01.07.2017 / 15:59

Tags