Ambiente: centos7 + mariadb5.5.64.
Deixe-me mostrar as informações de instalação na tela quando executar 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!
Escrevo um script de automação para instalar o 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}
}
Para executar /usr/bin/expect secure.exp
, me deparei com o erro:
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)
Não adianta escrever como abaixo:
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}
}
Mesmo erro:
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)
Como corrigir meu script exp então?
[ ... ]
é a substituição de comandos que é como a do shell$( ... )
. Então"Set root password? [Y/n] "
deve ser escrito como"Set root password? \\[Y/n] "
.Respostas:
Esses scripts aguardam para receber saída opcional (
timeout -1
significa "sem tempo limite") e podem diferenciar respostas diferentes, conforme exigido poryum install
emysql_secure_installation
. Com#!/bin/expect -f
como shebang, os scripts podem ser executados quando definidoschmod +x
.A) Para começar,
mariadb_yum.exp
(requersu
ousudo
):B) E então
mariadb_sec.exp
(não requersudo
):Para fins de depuração - ou para validar a resposta, é possível executar
expect
com o nível de logstrace 4
. Provavelmente, é tão respeitável quanto uma fonte pode obter, quando se trata de escreverexpect
scripts, pois exibe bem o que está acontecendo e o mais importante, em que ordem as coisas acontecem:É
set exp_internal 1
possível usar instruções para obter saída para a correspondência de regex.Uma possível fonte de confusão pode ser: onde se geram os processos - como se pode gerar vários processos em vários hosts, por exemplo.
ssh
localmente e depoisyum
emysql_secure_installation
remotamente. Adicionado$spawn_id
ao script; aclose
chamada inferior pode ser redundante, pois já éEOF
(apenas para mostrar comospawn
&close
processos):Conclusão: O
mariadb_sec.exp
script provavelmente poderia ser melhorado ainda mais, por exemplo. quando, inicialmente, não envia nenhuma senha e vê o que acontece - envia a senhaERROR 1045
(quando uma senha já havia sido definida anteriormente). Pode-se economizar presumir que é preciso definir a senha quando o servidor acabou de ser instalado (exceto queyum reinstall
fornece o mesmo resultado). Apenas não tinha um contêiner em branco do CentOS para testar todos os casos. A menos que seja executado em umroot
shell, seria necessário passar os dois tipos de senhas em um script para automatizar isso da instalação até a pós-instalação.Provavelmente vale a pena notar que, no GCE,
sudo
não pediria uma senha; de fato, existem pequenas diferenças baseadas no ambiente, pois essas imagens de contêiner do CentOS se comportam de maneira diferente. Nesse caso (como não hásu
detecção de imagem de contêiner ou local), omariadb_yum.exp
script pode ficar travado por30
segundos e continuar.As fontes mais respeitáveis que posso oferecer são o
expect
manual, escrito por Don Libes @ NIST e o manual TCL / TKexpect
, juntamente com o projeto SourceForge, chamado por coincidênciaexpect
.fonte
Não são usados colchetes quadrados apenas para substituição de comando, mas também são especiais para padrões glob .
Você pode usar o
-exact
comutador enquanto escapa os colchetes entre aspas:Ou use chaves em vez de aspas:
Para sua informação, você pode gerar o script esperado usando
autoexpect
:Isso irá gerar um script esperado chamado
script.exp
em seu diretório de trabalho atual.fonte