쉘 스크립트에서 비밀번호 사용

쉘 스크립트에서 비밀번호 사용

예를 들어, 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.

관련 정보