programing

셸 스크립트를 통한 echo 명령어로 mysql_secure_install 자동화

projobs 2022. 10. 31. 23:08
반응형

셸 스크립트를 통한 echo 명령어로 mysql_secure_install 자동화

mysql_secure_install 스크립트를 자동 응답으로 자동화하려고 합니다.제 코드는 다음과 같습니다.

echo "& y y abc abc y y y y" | ./usr/bin/mysql_secure_installation

자동화하는 실제 질문은 다음과 같습니다.

Enter current password for root (enter for none): <enter>
Set root password? [Y/n] y
New password: abc
Re-enter new password: abc
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

그러나 "Sorry you can empty password use here"라는 오류가 표시되지만, 화면에서는 첫 번째 질문의 리턴 키를 누르곤 했습니다.

우연히 이 질문을 받았는데 Bash 스크립트를 사용하여 쿼리를 수동으로 실행하기로 했습니다.

#!/bin/bash

# Make sure that NOBODY can access the server without a password
mysql -e "UPDATE mysql.user SET Password = PASSWORD('CHANGEME') WHERE User = 'root'"
# Kill the anonymous users
mysql -e "DROP USER ''@'localhost'"
# Because our hostname varies we'll use some Bash magic here.
mysql -e "DROP USER ''@'$(hostname)'"
# Kill off the demo database
mysql -e "DROP DATABASE test"
# Make our changes take effect
mysql -e "FLUSH PRIVILEGES"
# Any subsequent tries to run queries this way will get access denied because lack of usr/pwd param

★★mysql_secure_installation는 Bash 스크립트에 불과합니다.여기 보이는 원시 소스 코드를 확인해 주세요.이런 글귀가 적혀있는지 찾아봐do_query.)do_query; 쿼리와 함수를 찾아야 합니다).이치

UPDATE mysql.user SET Password=PASSWORD('root') WHERE User='root';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;

예에서는, 가 「 「 」로 설정되어 있는 에 주의해 주세요.root셋업 요구에 맞게 자유롭게 변경할 수 있습니다. "MySQL"이라는 합니다.mysql_secure_installation.sql.

그 후 스크립트를 통해 다음 명령을 실행하여 MySQL 설치를 보호하십시오.

mysql -sfu root < "mysql_secure_installation.sql"

s와 사일런트 에러f는, 1개의 chokesd, 1개의 choke, 1개의 choke, 1개의 choke, 1개의 choke가 경우에도, 명령어를 합니다.u는, 그 있습니다 이 유저명은 「」입니다.이 경우 이 사용자명은root.

MySQL이 처음에 비밀번호 없이 설치되고 키보드 조작 없이 잠글 수 있도록 설정된 배포 스크립트에서 실행합니다.

이된 Ubuntu에 MySQL 하기 위해 되었습니다.export DEBIAN_FRONTEND=noninteractive 및 는 install 을 설정하도록 설정되어 .sudo -E aptitude install -y --assume-yes -q mysql-server mysql-client이렇게 하면 패스워드 없이 Ubuntu에 MySQL이 깔끔하게 설치되므로 전개 스크립트에 적합합니다. ★★★★★★★★★★★★★★★★★.mysql -sfu root < "mysql_secure_installation.sql"설치 후 몇 초 안에 모든 것을 잠글 수 있습니다.

CentOS 6.7에서는 다음과 같은 작업을 수행했습니다.

mysql_secure_installation <<EOF

y
secret
secret
y
y
y
y
EOF

대화형 애플리케이션을 자동화하는 expect를 사용해 볼 수 있습니다.mysql_secure_install 자동화 또는 변경 내용을 확인하십시오.

다음은 @Giacomo1968의 답변을 기반으로 한 새로운 MySQL 5.7 설치용 자동 스크립트입니다.CentOS 7.5.1804에서는 정상적으로 동작.

yum localinstall -y https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
yum install -y mysql-community-server

# start mysql service
service mysqld start

# get Temporary root Password
root_temp_pass=$(grep 'A temporary password' /var/log/mysqld.log |tail -1 |awk '{split($0,a,": "); print a[2]}')

echo "root_temp_pass:"$root_temp_pass

# mysql_secure_installation.sql
cat > mysql_secure_installation.sql << EOF
# Make sure that NOBODY can access the server without a password
UPDATE mysql.user SET Password=PASSWORD('yourrootpass') WHERE User='root';
# Kill the anonymous users
DELETE FROM mysql.user WHERE User='';
# disallow remote login for root
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
# Kill off the demo database
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
# Make our changes take effect
FLUSH PRIVILEGES;
EOF

mysql -uroot -p"$root_temp_pass" --connect-expired-password <mysql_secure_installation.sql
sudo mysql -e "SET PASSWORD FOR root@localhost = PASSWORD('123');FLUSH PRIVILEGES;" 

printf "123\n n\n n\n n\n y\n y\n y\n" | sudo mysql_secure_installation

루트의 현재 비밀번호를 입력하시겠습니까(없으면 입력)?(root에는 123이 설정되어 있습니다)

unix_socket 인증으로 전환하시겠습니까?n

루트 비밀번호를 변경하시겠습니까?n

익명 사용자를 제거하시겠습니까?n

루트 로그인을 원격으로 허용하지 않으시겠습니까?y

테스트 데이터베이스를 제거하고 액세스하시겠습니까?y

권한 테이블을 지금 다시 로드하시겠습니까?y

버전: mysql Ver 15.1 Readline 5.1을 사용한osx10.14(x86_64)용 Distributed 10.4.6-MariaDB

expect또는 소스 코드에서 SQL 명령어를 피싱합니다(원하는 경우 찾고 있는 C++ 파일은 https://github.com/mysql/mysql-server/blob/7ed30a748964c009d4909cb8b4b22036ebdef239/client/mysql_secure_installation.cc)에 있습니다.

「」의 .mysql_secure_installation ('가장 안전한 옵션'을 할 수 ).--use-default옵션을 사용하여 대부분의 상호 작용을 건너뜁니다. mysql_secure_installation에서는 루트 패스워드가되어 있지 않은 에도 인터랙티브하게 에, 그, 그 할 수 .mysql_secure_option.

다음은 예를 제시하겠습니다.

mysql -u root <<EOF
SET PASSWORD FOR root@localhost = '${ROOT_PASSWORD}';
FLUSH PRIVILEGES;
EOF

mysql_secure_installation -u root --password="${ROOT_PASSWORD}" --use-default

AWS에서 동작합니다.Amazon Linux 2 AMI. 인스턴스를 시작하기 위한 사용자 지정 설정(AWS 사용자 데이터):

#!/bin/bash            
sudo yum -y update &> /dev/null
wget https://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm &> /dev/null
sudo yum -y localinstall mysql80-community-release-el7-1.noarch.rpm
sudo yum -y install mysql-community-server &> /dev/null
sudo service mysqld start
   
# get Temporary root Password
root_temp_pass=$(sudo grep 'A temporary password' /var/log/mysqld.log |tail -1 |awk '{split($0,a,": "); print a[2]}')
echo "root_temp_pass: " $root_temp_pass
# mysql_secure_installation.sql
sudo cat > mysql_secure_installation.sql << EOF
# Make sure that NOBODY can access the server without a password
ALTER USER 'root'@'localhost' IDENTIFIED BY 'yourrootpass';
# Kill the anonymous users
DELETE FROM mysql.user WHERE User='';
# disallow remote login for root
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
# Kill off the demo database
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
# Make our changes take effect
FLUSH PRIVILEGES;
EOF
        
sudo mysql -uroot -p"$root_temp_pass" --connect-expired-password <mysql_secure_installation.sql
sudo systemctl enable mysql

다음과 같이 시도해 볼 수 있습니다.

echo -e "\ny\ny\nabc\nabc\ny\ny\ny\ny" | ./usr/bin/mysql_secure_installation

방금 Ubuntu Bionic 18.04에서 테스트했습니다.LTS

순서 #1

export MYPWD="D33Ps3CR3T";
export NEWPWD="D33P3Rs3CR3T";

순서 #2

# First time **ever**
sudo mysql_secure_installation 2>/dev/null <<MSI

n
y
${MYPWD}
${MYPWD}
y
y
y
y

MSI

# Did it work?
mysql -u root -p${MYPWD} -e "SELECT 1+1";
# -------

순서 3

# Every subsequent time
sudo mysql_secure_installation 2>/dev/null <<MSI2
${MYPWD}
n
y
${NEWPWD}
${NEWPWD}
y
y
y
y

MSI2

# Just in case (optional) ....
sudo service mysql restart

# Did it work?
mysql -u root -p${NEWPWD} -e "SELECT 1+1";

스텝 #1에서 전후 비밀번호를 편집한 후 스텝 #2와 스텝 #3을 단말기에 직접 붙여넣을 수 있습니다.

메모들

  • 루트 패스워드가 이미 설정되어 있는 경우는, 순서 #2가 실패하기 때문에, 순서 #3으로 넘어갑니다.
  • 지휘부에 유전자가 주입된 것일 뿐이지
  • sudo수입니니다다
  • MSI특별한 의미는 없습니다(충돌 회피입니다.EOF를 사용하다
  • MYPWD == NEWPWD가 허용됨
  • 2>/dev/null는 경고 "stty: '표준 입력'을 숨깁니다. 디바이스에 부적절한 ioctl"
  • 하시면 됩니다.&>/dev/null전전사사사사모모다다다

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★하여 "echo" 를 합니다.-e ★★★★★★★★★★★★★★★★★」\n고친 것 같아요.

echo -e "\ny\ny\nabc\nabc\ny\ny\ny\ny\n" | ./usr/bin/mysql_secure_installation

MySql 하기 위해 명령어를 단, 이 명령어는 위의 MySql을 하는 것입니다.root의 패스워드를 취득하는 것입니다.error (signal 9 kill)

(FATAL: Chef::Exceptions::ChildConvergeError: Chef run process terminated by signal 9 (KILL)) Though the command works and password is changed the error is confusing.
script "change password" do
interpreter "bash"
user "root"
cwd "/tmp"
code <<-EOH
#MYSQL
root_temp_pass=$(grep 'A temporary password' /mysql/log/mysqld.log |tail -1 |awk '{split($0,a,": "); print a[2]}')

#Login as root change password
mysql -uroot -p"$root_temp_pass" -Be "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Czt732ck#';" --connect-expired-password
EOH
end

저는 다음 대사를 씁니다.AWS Linux AMI 2018에서 정상적으로 동작

db_root_password=Password4root
cat <<EOF | mysql_secure_installation
y
0
$db_root_password
$db_root_password
y
y
y
y
y
EOF

가장 많이 사용되는 솔루션은 버전, 스핀 및 OS에 따라 다소 복잡합니다.유감스럽게도 우아한 솔루션(--use-defaults 사용)은 RHEL9에 부속된 스크립트에서는 지원되지 않습니다.

다음은 출하된 스크립트에서 올바른 명령을 추출하기 위한 호환성이 높은 해킹입니다.

grep 'do_query ' /usr/bin/mariadb-secure-installation | \
    sed -e 's/ *do_query \"//' -e 's/\"$//' \
        -e "s/\$esc_pass/$db_admin_pass/" \
        -e 's/([^;])$/\\1;/' | \
    grep -v 'show create' | \
    mysql --user=$db_admin_user

첫 번째 2개의 sed 명령어는 각 SQL 명령에서 do_query 호출을 삭제합니다.두 번째 행은 새 루트 비밀번호를 설정합니다.세 번째 행은 종료되지 않은 SQL 명령어에 후행 세미콜론을 추가합니다.이것은 RHEL9에 부속된 스크립트로 파손되어 있습니다.

이 명령어는 변수 $db_admin_user와 $db_admin_pass를 제공한다고 가정합니다.

코드는 내 인형 매니페스트에서 가져온 것이므로 명령 견적은 사용 방법에 따라 다를 수 있습니다.

mysql 명령어에는 루트 권한(자동 엔진에서 상속해야 함)이 필요합니다.

  1. Windows OS 의 경우는, 다음의 드라이브에 있는 「mysql_secure_installation」애플리케이션을 검색해 주세요.\MySQL_Install-DIR\bin\
  2. WindowKey + R을 눌러 'Drive:\MySQL_Install-DIR\bin\mysql_secure_installation'

이 명령을 실행하면 MySQL 설치를 보호하는 프로세스를 안내하는 창이 나타납니다.바로 그거야!

언급URL : https://stackoverflow.com/questions/24270733/automate-mysql-secure-installation-with-echo-command-via-a-shell-script

반응형