예를 들어, mysql과 상호 작용하는 cron 스크립트를 만들고 싶습니다.
#!/bin/bash
mysql -uroot -p
echo root
echo "CREATE DATABASE example"
하지만 작동하지 않습니다. 프롬프트만 표시됩니다.
Enter password:
mysql을 종료하면 다음과 같이 표시됩니다.
root
"CREATE DATABASE example"
어떤 아이디어가 있나요?
답변1
다음과 같이 입력하세요.
[client]
user=root
password="my-very-secret-password"
파일에서 권한은 파일 읽기 권한이 있는 사람 이외의 다른 사람이 파일을 읽을 수 없도록 보장합니다.
그리고 다음을 실행하세요:
#! /bin/sh -
mysql --defaults-extra-file=/path/to/that/file --batch << "EOF"
CREATE DATABASE example
EOF
바라보다MySQL 자체 가이드더 많은 정보를 알고 싶습니다.
스크립트에 비밀번호를 입력하고 스크립트 자체에 대한 읽기 액세스를 제한할 수 있지만 비밀번호가 어떤 명령의 인수로 전달되지 않도록 해야 합니다. 이렇게 하면 출력에서 누구에게나 비밀번호가 표시됩니다 ps
.
다음을 수행할 수 있습니다.
#! /bin/sh -
mysql --defaults-extra-file=/dev/fd/3 --batch 3<< "END_OF_AUTH" << "END_OF_SQL"
[client]
user=root
password="my-very-secret-password"
END_OF_AUTH
CREATE DATABASE example
END_OF_SQL
답변2
이것은 Stéphane Chazelas의 답변과 유사하지만프로세스 교체사용자와 비밀번호를 제공하기 위해 Heredoc 대신 쉘 함수를 사용합니다.
#!/bin/bash
printconf() {
cat <<-EOF
[mysql]
user=root
password=supersecretpassword
EOF
}
mysql --defaults-extra-file=<(printconf) -e 'CREATE DATABASE example'
Function( printconf
)은 단순히 올바른 형식의 mysql conf 파일을 출력합니다.
IMO, 이것은 한 줄에 여러 개의 heredoc을 갖는 것보다 더 읽기 쉽습니다.
여전히 사용자 및 비밀번호 세부 정보를 스크립트에 포함하므로(따라서 와 ~/.my.cnf
같은 외부 파일이 필요하지 않음) 여전히 커널 프로세스 테이블에 비밀번호가 노출되는 것을 방지합니다(예: 등을 통해 ps
) pgrep
.
노트:bash
이를 위해서는 프로세스 대체(예 : zsh
또는 ) 를 지원하는 최신 셸이 필요합니다 ksh
.
스크립트에는 일반 텍스트 비밀번호가 포함되어 있으며 소유권, 그룹, 권한 및/또는 ACL을 통해 적절하게 보호되어야 합니다. 즉, 적어도 전 세계에서 읽을 수 있어서는 안 됩니다.
답변3
다음 명령을 사용하여 SQL 문을 실행할 수 있어야 합니다.
mysql -u root -p<password> -e "CREATE DATABASE example"
-p와 비밀번호 사이에는 공백이 없습니다.
답변4
Stéphane Chazelas의 답변과 유사하게 .my.cnf
스크립트를 실행하는 데 사용하는 사용자의 집에서 하나를 만들고 자격 증명을 추가한 다음 스크립트를 실행할 수 있습니다.
~/.my.cnf
[client]
user=root
password="This15MyPa55word"
스크립트
#!/bin/bash
mysql -e "CREATE DATABASE example"
~에서man mysql
--execute=문, -e 문
Execute the statement and quit. The default output format is like that produced with --batch. See Section 4.2.4, “Using Options on the Command Line”, for some examples. With this option, mysql does not use the history file.