mariadb를 설치하기 위해 expect 스크립트를 작성하는 방법은 무엇입니까?


11

환경 : 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 스크립트를 수정하는 방법?


예상은 Tcl 확장입니다. 티클에서 [ ... ]입니다 명령 치환 쉘 같다 $( ... ). 따라서 "Set root password? [Y/n] "로 작성해야합니다 "Set root password? \\[Y/n] ".
pynexj

답변:


5

이 스크립트는 옵션 출력 (수신 기다릴 timeout -1수단 "아니오 시간 초과")와이 요구하는대로 그들은 떨어져 다른 반응을 알 수 yum installmysql_secure_installation. #!/bin/expect -fshebang을 사용하면 로 설정된 스크립트를 실행할 수 있습니다 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

디버깅 목적으로 또는 답변의 유효성을 검사하기 위해 expectlog-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(방법 spawnclose처리 방법을 보여주기 위해 ).

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몇 초 동안 중단 된 다음 계속 될 수 있습니다 .


내가 제공 할 수있는 가장 유명한 소스는 expectDon Libes @ NIST가 작성한 매뉴얼 및에 대한 TCL / TK 매뉴얼 expect과 함께 SourceForge 프로젝트 expect입니다.


2

대괄호는 명령 대체에 사용될뿐만 아니라 글로브 패턴에도 사용 됩니다.

-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현재 작업 디렉토리에서 호출되는 예상 스크립트가 생성됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.