환경 : 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 스크립트를 수정하는 방법?
답변
이 스크립트는 옵션 출력 (수신 기다릴 timeout -1
수단 “아니오 시간 초과”)와이 요구하는대로 그들은 떨어져 다른 반응을 알 수 yum install
및 mysql_secure_installation
. #!/bin/expect -f
shebang을 사용하면 로 설정된 스크립트를 실행할 수 있습니다 chmod +x
.
A) 시작하려면 mariadb_yum.exp
( su
또는 필요 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
log-level로 실행할 수 있습니다 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
스크립트에 추가되었습니다 . 맨 아래 하나의 close
호출은 이미 있기 때문에 중복 될 수 있습니다 EOF
(방법 spawn
및 close
처리 방법을 보여주기 위해 ).
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
쉘 에서 실행하지 않는 한 , 두 종류의 암호를 하나의 스크립트로 전달하면 설치 후 설치까지이를 자동화 할 수 있습니다.
아마도 GCE에서는 sudo
암호를 요구하지 않을 것입니다. 이러한 CentOS 컨테이너 이미지가 다르게 동작하기 때문에 실제로 환경에 따라 약간의 차이가 있습니다. 이러한 경우 ( su
컨테이너 이미지 감지가 없거나 컨테이너 이미지 감지 가 없기 때문에 ) mariadb_yum.exp
스크립트가 30
몇 초 동안 중단 된 다음 계속 될 수 있습니다 .
내가 제공 할 수있는 가장 유명한 소스는 expect
Don Libes @ NIST가 작성한 매뉴얼 및에 대한 TCL / TK 매뉴얼 expect
과 함께 SourceForge 프로젝트 expect
입니다.
답변
대괄호는 명령 대체에 사용될뿐만 아니라 글로브 패턴에도 사용 됩니다.
-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
현재 작업 디렉토리에서 호출되는 예상 스크립트가 생성됩니다 .