단말기 내에서 mysql을 사용하여 경고 메시지를 표시하지 않지만 비밀번호는 bash 스크립트로 작성됩니다.
터미널 내에서 MySQL에서 다음 명령을 실행하려고 했을 때:
mysql -u $user -p$password -e "statement"
실행은 예상대로 작동하지만 항상 다음과 같은 경고가 발생합니다.
경고:명령줄 인터페이스에서 패스워드를 사용하는 것은 안전하지 않을 수 있습니다.
단, 환경변수를 사용하여 위의 설명을 수행해야 합니다.$password
이 명령어를 단말기에서 bash 스크립트로 반복적으로 실행하고 싶은 경우, 프롬프트가 뜨기를 기다렸다가1개의 스크립트로 50회 또는 100회 패스워드를 입력하도록 강요하는 것은 결코 마음에 들지 않습니다.질문하겠습니다.
경고를 억제하는 것이 가능한가?이 명령어는 앞서 말한 대로 정상적으로 동작하지만 50번 또는 100번 루프오버하여 실행하면 창이 상당히 지저분해집니다.
경고 메시지를 따르고 내 스크립트에 암호를 입력하지 않아야 합니까?이 경우 프롬프트가 표시될 때마다 비밀번호를 입력해야 합니까?
.man mysql
안 된다
--show-warnings
각 문 뒤에 경고가 표시될 경우 경고를 표시합니다.이 옵션은 대화형 및 배치 모드에 적용됩니다.
또, 이 기능을 끄는 방법에 대해서는, 빠뜨린 것이 없는 경우는 언급하지 않습니다.
OS X 10.9.1 Mavericks를 사용하고 있으며 홈브루의 MySQL 5.6을 사용하고 있습니다.
MySQL 클라이언트/서버 버전이 5.6.x인 경우 경고 메시지를 피하기 위해 mysql_config_editor 도구를 사용합니다.
mysql_config_editor set --login-path=local --host=localhost --user=username --password
다음으로 셸 스크립트에서 를 사용할 수 있습니다.
mysql --login-path=local -e "statement"
대신:
mysql -u username -p pass -e "statement"
다음과 같은 것을 사용합니다.
mysql --defaults-extra-file=/path/to/config.cnf
또는
mysqldump --defaults-extra-file=/path/to/config.cnf
config.cnf에는 다음이 포함됩니다.
[client]
user = "whatever"
password = "whatever"
host = "whatever"
이를 통해 서로 다른 서버/롤/데이터베이스에 대한 여러 구성 파일을 가질 수 있습니다.~/.my.cnf 를 사용하면, 1 개의 설정만을 사용할 수 있습니다(디폴트의 편리한 설정일 수도 있습니다).
Debian 기반 distro에서 루트로 실행 중인 경우 위의 내용을 건너뛰고 /etc/mysql/debian.cnf를 사용하여 액세스할 수 있습니다.:
mysql --defaults-extra-file=/etc/mysql/debian.cnf
편리하지만(동등하게 안전하지 않은) 한 가지 방법은 다음과 같습니다.
MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
공식 문서에서는 이에 대해 권장하지 않습니다.
6.1.2.1 비밀번호 보안을 위한 최종 사용자 가이드라인(Mysql Manual for Version 5.6):
를 「」에 한다.
MYSQL_PWD
MySQL 비밀번호를 지정하는 이 방법은 매우 안전하지 않은 것으로 간주하여 사용하지 마십시오.일부 버전의 ps에는 실행 중인 프로세스의 환경을 표시하는 옵션이 포함되어 있습니다.일부 시스템에서는
MYSQL_PWD
비밀번호는 ps를 실행하는 다른 사용자에게 공개됩니다.이러한 버전의 ps가 없는 시스템에서도 사용자가 프로세스 환경을 조사할 수 있는 다른 방법이 없다고 가정하는 것은 현명하지 않습니다.
명령줄에서 비밀번호를 사용하려는 경우 특정 오류 메시지를 필터링할 수 있습니다.
mysqlcommand 2>&1 | grep -v "Warning: Using a password"
기본적으로 표준 오류를 표준 출력으로 리다이렉트하고 GREP를 사용하여 "경고:패스워드를 사용한다.
이렇게 하면 오류를 포함한 다른 모든 출력을 볼 수 있습니다.다양한 셸 스크립트 등에 사용합니다.
매일의 mysqldump 데이터베이스 백업을 보다 안전하게 수행하기 위해 bash 스크립트를 다음과 같이 준비했습니다.이것은 크리스티안 포르타의 훌륭한 대답의 확대이다.
먼저 mysql_config_editor(mysql 5.6+에 부속)를 사용하여 암호화된 비밀번호 파일을 설정합니다.사용자 이름이 "db_user"라고 가정합니다.셸 프롬프트에서 실행:
mysql_config_editor set --login-path=local --host=localhost --user=db_user --password
이치노.
home/system_username/.mylogin.cnf
물론 서버의 사용자 이름으로 "system_username"을 변경합니다.
bash 스크립트를 다음과 같이 변경합니다.
mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz
다음과 같이 입력합니다.
mysqldump --login-path=local my_database | gzip > db_backup.tar.gz
노출된 비밀번호는 더 이상 없습니다.
아주 간단해요.이건 날 위한 일이야
export MYSQL_PWD=password; mysql --user=username -e "statement"
MYSQL_PWD
는 MySQL에서 직접 또는 간접적으로 사용되는 환경 변수 중 하나입니다.
문서에서:
MYSQL_PWD - mysqld 연결 시 기본 비밀번호.이것을 사용하는 것은 안전하지 않다.섹션 6.1.2.1 "비밀번호 보안을 위한 최종 사용자 지침"을 참조하십시오.
가장 쉬운 방법은
mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null
임시 파일이나 다른 파일을 사용하지 않는 솔루션:
mysql --defaults-extra-file=<(echo $'[client]\npassword='"$password") -u $user -e "statement"
. 이 의 이 합니다.<(echo ...)
)<(
로그인 경로를 지정할 때 스크립트에서 mysql_config_editor를 실행하여 비밀번호를 전달할 수도 있습니다.
expect -c "
spawn mysql_config_editor set --login-path=$mySqlUser --host=localhost --user=$mySqlUser --password
expect -nocase \"Enter password:\" {send \"$mySqlPassword\r\"; interact}
"
그러면 스크립트에서 프롬프트와 대화하기 위해 사용할 수 있는 예상 세션이 시작됩니다.
심플한 워크어드 스크립트이 "mysql"에 이름을 붙이고 "/usr/bin" 앞에 경로에 넣습니다.다른 명령어에 대한 명백한 변형 또는 경고 텍스트가 다른 경우.
#!/bin/sh
(
(
(
(
(
/usr/bin/mysql "$@"
) 1>&9
) 2>&1
) | fgrep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
) 1>&2
) 9>&1
표준 에러 STDERR 출력을 /dev/null로 리다이렉트 할 수도 있습니다.
그럼, 다음의 조작을 실시합니다.
mysql -u $user -p$password -e "statement" 2> /dev/null
shell> mysql_config_editor set --login-path=local
--host=localhost --user=localuser --password
Enter password: enter password "localpass" here
shell> mysql_config_editor set --login-path=remote
--host=remote.example.com --user=remoteuser --password
Enter password: enter password "remotepass" here
mysql_config_editor가 .mylogin.cnf 파일에 쓴 내용을 확인하려면 print 명령을 사용합니다.
shell> mysql_config_editor print --all
[local]
user = localuser
password = *****
host = localhost
[remote]
user = remoteuser
password = *****
host = remote.example.com
print 명령어는 각 로그인 경로를 각 괄호로 묶은 로그인 경로 이름을 나타내는 그룹 헤더로 시작하여 로그인 경로의 옵션 값을 나타내는 일련의 행으로 표시합니다.비밀번호 값은 마스크되어 클리어 텍스트로 표시되지 않습니다.
위의 예에서 알 수 있듯이 .mylogin.cnf 파일에는 여러 로그인 경로를 포함할 수 있습니다.이와 같이 mysql_config_editor를 사용하면 서로 다른 MySQL 서버에 연결하기 위한 여러 "개인 정보"를 쉽게 설정할 수 있습니다.나중에 클라이언트 프로그램을 호출할 때 --login-path 옵션을 사용하여 이러한 이름 중 하나를 선택할 수 있습니다.예를 들어 로컬서버에 접속하려면 다음 명령을 사용합니다.
shell> mysql --login-path=local
리모트 서버에 접속하려면 , 다음의 커맨드를 사용합니다.
shell> mysql --login-path=remote
https://gist.github.com/nestoru/4f684f206c399894952d 에서
# Let us consider the following typical mysql backup script:
mysqldump --routines --no-data -h $mysqlHost -P $mysqlPort -u $mysqlUser -p$mysqlPassword $database
# It succeeds but stderr will get:
# Warning: Using a password on the command line interface can be insecure.
# You can fix this with the below hack:
credentialsFile=/mysql-credentials.cnf
echo "[client]" > $credentialsFile
echo "user=$mysqlUser" >> $credentialsFile
echo "password=$mysqlPassword" >> $credentialsFile
echo "host=$mysqlHost" >> $credentialsFile
mysqldump --defaults-extra-file=$credentialsFile --routines --no-data $database
# This should not be IMO an error. It is just a 'considered best practice'
# Read more from http://thinkinginsoftware.blogspot.com/2015/10/solution-for-mysql-warning-using.html
또 다른 방법은 sshpass를 사용하여 mysql을 호출하는 것입니다.다음은 예를 제시하겠습니다.
sshpass -p topsecret mysql -u root -p username -e 'statement'
스크립트 /bin/sh의 Docker 솔루션을 다음에 나타냅니다.
도커 exec [MYSQL_CONTENER_NAME]sh - c 'exec echo [ client ]> /root / mysql - credentials . cnf '
도커 exec [ MYSql _ CONTENER _ NAME ]sh - c 'exec echo " user = root " >> / root / cnf '
도커 exec [MYSql_CONTENER_NAME]sh - c 'exec echo "password=$MYSql_ROOT_PASSWORD" >> /root/module-cnf'
도커 exec [MYSql_CONTENER_NAME]sh - c ' exec mysqldump -- exec - mysqldump - file = / root / cnf - all - exec mysqldump'
[MYSql_CONTENER_NAME]을 교체하고 환경변수 MYSQL_ROOT_PASSWORD가 컨테이너에 설정되어 있는지 확인합니다.
그것이 나에게 도움이 될 수 있는 것처럼 당신에게 도움이 되기를 바랍니다!
도우미를 정의합니다.
remove-warning () {
grep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
}
사용방법:
mysql -u $user -p$password -e "statement" 2>&1 | remove-warning
타찬!코드가 깨끗하고 읽기 좋습니다.
(bash와 함께)
개인적으로 저는 그 오류를 잡기 위해 스크립트 래퍼를 사용합니다.다음은 코드 샘플입니다.
#!/bin/bash
#echo $@ | cat >> /home/mysqldump.log 2>/dev/null
ERR_FILE=/tmp/tmp_mdump.err
# Execute dumper
/usr/bin/mysqldump $@ 2>$ERR_FILE
# Determine error and remove tmp file
ERROR=`cat $ERR_FILE`
rm $ERR_FILE
# Handle an error
if [ "" != "$ERROR" ]; then
# Error occured
if [ "Warning: Using a password on the command line interface can be insecure." != "$ERROR" ]; then
echo $ERROR >&2
exit 1
fi
fi
PowerShellPowerShell)의 경우pwsh
아니라, 이에요.bash
은 꽤 ), 이것 、 ), ), 、 이 ), ), ), ), ), ), ), ), ), ), ), ), ), ), ), ), ), ), ), 。첫 번째 시도는 콜을 랩하는 것이었습니다.mysql
in a a a a try/catch
기능하지만 PowerShell 오류 처리에서 이상한 동작이 발생하여 실행할 수 없었습니다.
해결방법은 이 시스템을 오버라이드하는 것이었습니다.$ErrorActionPreference
하여 캡처할 수 STDERR
★★★★★★★★★★★★★★★★★」STDOUT
은 다음과 같습니다.ERROR
이치노"^mysql.*Warning.*password"
이는 PowerShell이 오류를 하나의 스트림으로 처리하고 발생시키기 때문에 필터링 및 재투입하려면 모든 오류를 캡처해야 하기 때문입니다.:/
Function CallMySQL() {
# Cache the error action preference
$_temp = $ErrorActionPreference
$ErrorActionPreference = "Continue"
# Capture all output from mysql
$output = (&mysql --user=foo --password=bar 2>&1)
# Restore the error action preference
$ErrorActionPreference = $_temp
if ($output -match "ERROR") {
throw $output
} elseif($output) {
" Swallowing $output"
} else {
" No output"
}
}
주의: PowerShell은 Unix에서 사용할 수 있으므로 이 솔루션은 크로스 플랫폼입니다.에 적응할 수 있다.bash
약간의 구문 변경을 가합니다.
경고:영어 이외의 에러 메시지나 단어를 반환하는 문장과 같이, 이것이 기능하지 않는 엣지 케이스가 수십 개 있습니다.ERROR
만, 「어느 쪽인가 하면, 「 쪽인가」, 「어느 쪽인가」에의 기본적인 했습니다.mysql
이 이것을하게 여겨주길 .다른 사람들이 이걸 유용하게 여기길 바라.
mysql
이 경고를 억제하는 옵션을 추가했을 뿐입니다.
하거나 Rundeck를 요구하는 을 사용하는 mylogin.cnf
하기 전에 파일의 위치를 셸 했습니다.
if test -f "$CUSTOM_MY_LOGINS_FILE_PATH"; then
chmod 600 $CUSTOM_MY_LOGINS_FILE_PATH
export MYSQL_TEST_LOGIN_FILE="$CUSTOM_MY_LOGINS_FILE_PATH"
fi
...
result=$(mysql --login-path=production -NBA -D $schema -e "$query")
서 ★★★★★MYSQL_TEST_LOGIN_FILE
는 기본 파일 경로와는 다른 파일 경로로 설정할 수 있는 환경 변수입니다.
합니다.$HOME
디렉토리로 이동합니다.
bash 스크립트에서 조건부로 출력을 사용하는 문제가 있었습니다.
이것은 우아한 것은 아니지만, 부두에서 이것은 정말로 문제가 되지 않습니다.기본적으로 마지막 줄에 없는 출력은 무시합니다.awk에서도 마찬가지로 첫 번째 줄 등을 제외한 모든 것을 반환하도록 변경할 수 있습니다.
마지막 줄만 반환됩니다.
mysql -u db_user -pInsecurePassword my_database ... | sed -e '$!d'
오류를 억제하지는 않지만 bash 스크립트에서 쿼리 출력을 사용할 수 있습니다.
에일리어스를 사용하는 것이 가장 좋습니다.
alias [yourapp]-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"
예를 들어 스크립트에 다음과 같이 입력합니다.
alias drupal-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"
데이터베이스를 로드하기 위해 스크립트의 뒷부분에서 다음을 수행합니다.
drupal-mysql database_name < database_dump.sql
스테이트먼트를 실행하려면:
drupal-mysql -e "EXEC SOMESTATEMENT;"
@훌륭하지만 BSD @david-g는 BSD입니다.grep
해석해드릴게요.[Warning]
문자의 중 )Warning
를 참조해 주세요.
스크립트에 대해서는, 같은 어프로치를 사용하고 있습니다(간단함을 위해 문자열의 일부만 일치합니다).
mysql() {
(
(
(
(
(
/usr/local/bin/mysql "$@"
) 1>&9
) 2>&1
) | grep -v 'Using a password on the command line interface can be insecure.'
) 1>&2
) 9>&1
}
out=$(mysql ...... 2>&1)
rc=$?
는 일련의하여 mysql을 "mysql"에서 합니다.$opt
도 「」에 기재되어 있습니다.$rc
.
또 다른 솔루션(스크립트 등)
sed -i'' -e "s/password=.*\$/password=$pass/g" ~/.my.cnf
mysql -h $host -u $user $db_name -e "$sql_cmd"
-i''
여기에 UNIX 에서는 스트레이트 「Mac OS X」를할 수 있습니다.UNIX OS の 서에에에에에 。-i
나한테는 효과가 있었어- 방금 추가했어.2> null
그 $(mysql_command)
에러 메시지와 경고 메시지만 표시되지 않습니다.
다음과 같이 /dev/null을 사용하여 mySQL을 실행하고 경고 및 오류 메시지를 억제할 수 있습니다.
# if you run just a SQL-command
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} -e "${STATEMENT}" &> /dev/null
# Or you can run SQL-script as a file
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} < ${FILEPATH} &> /dev/null
장소:
${USERNAME} - existing mysql user
${PASSWORD} - password
${HOST} - ip or hostname, for example 'localhost'
${DATABASE} - name of database
${STATEMENT}- SQL command
${FILEPATH} - Path to the SQL-script
즐기세요!
가장 쉬운 방법:
mysql -u root -p YOUR_DATABASE
이 항목을 입력하면 암호를 입력해야 합니다.
메모: 세미콜론은 사용하지 않습니다.
언급URL : https://stackoverflow.com/questions/20751352/suppress-warning-messages-using-mysql-from-within-terminal-but-password-written
'itsource' 카테고리의 다른 글
Java에서 TimeStamp를 최신 상태로 변환하는 방법 (0) | 2022.10.25 |
---|---|
데이터베이스 연결 패턴 (0) | 2022.10.25 |
PHP - php 파일 포함 및 쿼리 매개 변수 전송 (0) | 2022.10.25 |
ContextLoaderListener는? (0) | 2022.10.25 |
운영 체제 정보 가져오기 (0) | 2022.10.25 |