터미널 내에서 mysql을 사용하여 경고 메시지를 표시하지 않지만 bash 스크립트로 작성된 암호


273

터미널 내에서 MySQL에서 다음 명령을 실행하려고했을 때 :

mysql -u $user -p$password -e "statement"

실행은 예상대로 작동하지만 항상 경고를 발행합니다.

경고 : 명령 행 인터페이스에서 비밀번호를 사용하면 안전하지 않을 수 있습니다.

그러나 $password터미널 내에서 bash 스크립트에서 반복적으로 명령을 실행하고 싶기 때문에 프롬프트가 표시되는 것을 기다리는 것을 좋아하지 않기 때문에 암호를 저장 하는 환경 변수 ( )를 사용하여 위의 명령문을 수행 해야합니다. 한 번의 스크립트로 비밀번호를 50 번 또는 100 번 입력하도록 강요했습니다. 여기 내 질문이 있습니다.

  • 경고를 억제하는 것이 가능합니까? 내가 말한대로 명령이 제대로 작동하지만 반복하여 명령을 50 또는 100 번 실행할 때 창이 지저분 해집니다.

  • 경고 메시지를 준수하고 스크립트에 비밀번호를 쓰지 않아야합니까? 이 경우 프롬프트가 표시 될 때마다 비밀번호를 입력해야합니까?

달리는 man mysql것은 도움이되지 않습니다.

--show-warnings
각 명령문 뒤에 경고가 표시됩니다. 이 옵션은 대화식 및 배치 모드에 적용됩니다.

내가 빠진 것이 없다면 기능을 끄는 방법에 대해서는 언급하지 않았습니다.

OS X 10.9.1 Mavericks를 사용하고 있으며 homebrew에서 MySQL 5.6을 사용합니다.


14
권장되는 방법은 (같은 떨어지게 옵션 파일에 암호를 저장하는 것입니다 [client] password=my_password에서 ~/.my.cnf). 확실히 보안에 영향을 줄 수는 있지만 적어도 실행할 수 있는 사람은 액세스 할 수 없으며 ps파일 권한으로 제어 할 수 있습니다.
Anton Kovalenko

4
mysql -u root password root -e "statement" > /dev/null?

어쨌든 Python과 같은 것을 사용할 수도 있습니다 pexcept. 터미널 삽입을 수행하고 명령이 제공하는 피드백도 처리 할 수 ​​있습니다. 이 방법으로 당신은 그 장황한 출력과 당신이 원하는 실제 출력의 스트립을 건너 뛸 수 있습니다 :)

6
권장되는 IMO 방식은 옳은 일을하는 사람들에게 불이익을 주어 잘못된 일을하는 사람들을 보호합니다. 비밀번호가 스크립트 파일에 저장된 경우 ps 또는 로그에 표시되지 않습니다. 이것이 올바른 방법입니다. 파일을 외부 파일에 넣으면 암호를 크론하지만 처음에는 좋지 않은 파일을 만드는 데 도움이됩니다. 그동안 몇 년 동안 실행 된 스크립트는 이제 실패하고이 경고가 stderr에 나타나기 때문에 수정해야합니다.
Nestor Urquiza

2
맑은에 암호를 저장하지 않습니다 whcih 권장되는 방법에 자세히 설명되어 있습니다 dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html
안토니

답변:


249

MySQL 클라이언트 / 서버 버전이 5.6.xa 방법 인 경우 WARNING 메시지가 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"

28
--login-path다른 모든 주장보다 앞서야한다는 것을 기억하십시오 . 노력 mysqldump --tables --login-path=local하고 오류가 발생했습니다 unknown variable 'login-path=local'.
Tulio

mysql 명령 행 클라이언트는 기본적으로 'client'로그인 경로를 찾습니다. 약간만 변경하여 "mysql -e 'statement'"에 대한 지시 사항을 단순화 할 수 있습니다.
Morgan Tocker

2
쉘 파일을 직접 실행하면 제대로 작동하지만 crontab에서 호출하면 작동하지 않습니다
Nabeel Arshad

1
@NabeelArshad 나는 이것이 crontab에서 사용자의 "home"이 설정되지 않았기 때문에 (일반적으로 ENV 변수) crontab에서 클라이언트가 올바른 ~ / .mylogin.cnf를 찾을 수 없기 때문에
Cristian Porta

1
@NamGVU, 확실하지 않지만이 솔루션은 암호화 된 암호를 저장한다고 생각합니다.
zhekaus

209

나는 다음과 같은 것을 사용한다 :

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를 사용하면 하나의 구성 세트 만 사용할 수 있습니다 (유용한 기본값 세트 임).

데비안 기반 배포판에 있고 루트로 실행중인 경우 위를 건너 뛰고 /etc/mysql/debian.cnf를 사용하여 ...

mysql --defaults-extra-file=/etc/mysql/debian.cnf


12
참고 : --defaults-extra-file그렇지 않으면 mysql이로 불평합니다 mysqldump: unknown variable 'defaults-extra-file.
pevik

4
허용되는 답변의 멋진 대안. 확실히 MYSQL_PWD변수를 설정하지 마십시오 ....
DudeOnRock

1
5.6 이하 버전에는 확실히 좋은 옵션입니다. 그렇지 않으면, 나는 받아 들인 대답과 함께 갈 것입니다.
dkniffin 2014

21
임시 .cnf 파일을 만드는 대안은 Bash에서 수행하는 것입니다 mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement". printf는 Bash에 의해 직접 실행 되므로에 표시되지 않습니다 ps.
Dave James Miller

3
후자는 ~ / .my.cnf의 설정을 선호했기 때문에 --defaults-file대신 에 사용해야했습니다 --defaults-extra-file.
Roger Dueck

185

편리한 (그러나 동일하게 안전하지 않은) 방법 중 하나는 다음을 사용하는 것입니다.

MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"

공식 문서는 권장하지 않습니다.
참조 (버전 5.6 수동 MySQL의) 암호 보안에 대한 6.1.2.1 최종 사용자 지침 :

MYSQL_PWD환경 변수에 비밀번호 저장

MySQL 비밀번호를 지정하는이 방법은 매우 안전하지 않은 것으로 간주되어 사용해서는 안됩니다. 일부 ps 버전 에는 실행중인 프로세스 환경을 표시하는 옵션이 포함되어 있습니다. 일부 시스템에서을 설정하면 psMYSQL_PWD 를 실행하는 다른 사용자에게 비밀번호가 노출됩니다 . 이러한 ps 버전이없는 시스템에서도 사용자가 프로세스 환경을 검사 할 수있는 다른 방법이 없다고 가정하는 것은 현명하지 않습니다.


6
이것은 내 bash 스크립트에서 작동하지 않습니다.Access denied for user 'root'@'localhost' (using password: NO)
rubo77

24
스크립트에서해야합니다 export MYSQL_PWD=whatever.
Riot

2
쿼리가 매우 빠르기 때문에이 옵션을 선택했습니다. 그런 다음 쿼리를 실행 한 후 가짜로 설정했습니다.
TimH-Codidact

11
스크립트에서는 실행할 필요가 없으며 export한 줄에 모두 배치하면됩니다.MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
JD

1
@ JD : MySQL 5.7.21의 Ubuntu 16.04에서 작동합니다.
mivk

70

커맨드 라인에서 암호를 사용하려면 특정 오류 메시지를 필터링하는 데 효과적이라는 것을 알았습니다.

mysqlcommand 2>&1 | grep -v "Warning: Using a password"

기본적으로 표준 오류를 표준 출력으로 리디렉션하고 grep을 사용하여 "경고 : 암호 사용"과 일치하는 모든 행을 삭제합니다.

이런 식으로 오류를 포함한 다른 출력을 볼 수 있습니다. 나는 이것을 다양한 쉘 스크립트 등에 사용합니다.


이것은 Capistrano 배포를위한 Rake 작업 생성과 같은 다른 작업에서 호출되는 한 줄짜리 작업에 사용하기에 탁월한 솔루션입니다.
JakeGould

2
메시지를 음소거하기 위해 훌륭하고 간단하며 MySQL 설정에서 아무것도 만질 필요가 없습니다.
ajaaskel

SQL에 대한 리디렉션이 이미있는 mysqldump에서 어떻게 사용합니까?
MacroMan

1
이것은 다른 것들과 비교할 때 정말 나쁜 해결책입니다. 텍스트가 변경되면 후속 버전의 MySQL에서 실패 할 수 있으며 다른 로케일에서도 작동하지 않을 수 있습니다.
yktoo

42

다음은 일일 mysqldump 데이터베이스 백업을위한 bash 스크립트를보다 안전하게 작동시키는 방법입니다. 이것은 크리스티안 포르타의 위대한 답변의 확장입니다.

  1. 먼저 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"을 서버의 사용자 이름으로 변경하십시오.

  2. bash 스크립트를 다음과 같이 변경하십시오.

    mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz

    이에:

    mysqldump --login-path=local my_database | gzip > db_backup.tar.gz

더 이상 노출 된 비밀번호가 없습니다.


10

가장 쉬운 방법은

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null

43
문제는 스크립트의 합법적 인 오류도 억제한다는 것입니다.
man910

4
또한 2> /var/log/myscript.log 로그 파일을 작성하여 해당 오류를 로그 할 수 있습니다.
Skamasle

1
2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."문제의 경고 만 억제 하는 데 사용
Hafenkranich

10

로그인 경로를 지정할 때 스크립트에서 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}
"

그러면 스크립트에서 프롬프트와 상호 작용하기 위해 사용할 수있는 예상 세션이 시작됩니다.

이 게시물보기


그 '>'가 정말로 거기에 있어야 하는가?
David Goodwin

yes '>'는 mysql_config_editor가 stdout에서 입력을 받도록하기위한 것입니다. 무엇 mysql_config_editor에 표준 출력에서 전달되는 것은 암호가이 사용자가 '>'다음 무슨 일하는 에코 명령을 구문 분석이다 당신이 볼 것이라는 점을 모두가 에코 명령 다음에 모든 것없이해야 할 것입니다
phylanx

따라서 파이프 연산자 "|"를 사용한다는 의미입니까? 최소한 * nix 및 DOS에서 ">"는 STDOUT을 캡처하여 현재 작업 디렉토리의 "mysql_config_editor"파일에 기록합니다.
Jay Dansand

네, 맞습니다. 원래 답변을 편집했습니다
phylanx

7

좋아, 임시 파일이나 아무것도없는 솔루션 :

mysql --defaults-extra-file=<(echo $'[client]\npassword='"$password") -u $user -e "statement"

그것은 다른 사람들이 언급 한 것과 비슷하지만, 여기 당신이 실제 파일이 필요하지 않습니다 명령이 부분은 파일을 가짜 : <(echo ...) (통지의 중간에 공백은 없다<(


이미있는 경우이 작동하지 않습니다 .my.cnf귀하의 파일 ~/.에 암호 항목에
산티아고 arizti

5
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

www.data 사용자로 mysqldump 명령을 실행하려면 어떻게합니까? www-data에 홈 디렉토리가 없습니다 ... www-data 사용자를 위해 mysql_config_editor를 어떻게 설정합니까?
lewis4u

5

에서 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

3

또 다른 대안은 sshpass를 사용하여 mysql을 호출하는 것입니다.

sshpass -p topsecret mysql -u root -p username -e 'statement'

작동하는 것 같지만 명령 줄에서 'username'을 제거해야합니까?
e2-e4

3

간단한 workaroud 스크립트. 이 이름을 "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

3
이 답변이 약간 복잡하지만, 나는 명백하게 잘못되지 않았거나 의견이없는 downvotes를 얻는 것이 다소 답이없는 답변을 너무 많이보고 있기 때문에 그것을 찬성했습니다. 다윗이 다른 질문에 대답하지 않은 것도 당연합니다! 그는 뛰어 들어 새로운 해결책을 찾으려고 노력했으며 이유를 설명하지 못했습니다. 코멘트를 남기지 않는 FU 익명의 downvoters!
Jeremy Davis

3
+1 Jeremy Davis에게 동의합니다. 이것은 복잡하지만 다른 옵션이 없으면 허용 될 수 있습니다. 어리석은 생각이되어야하는 경고를 끄는 것과 달리 그것은 틀린 것이 아닙니다!
Ben McIntyre

1
@JeremyDavis 예, 이것은 주로 작품을 보여주고 싶었 기 때문에 복잡했습니다. 괄호없이 수행 할 수 있지만 명확하지 않을 수 있습니다. 이것은 또한 모든 스택 교환에서 처음으로 읽지 않은 활동이었습니다 ... 그 후에 오랫동안 그것을 만지지 않았습니다. 귀하의 의견은 확실히 감사했습니다.
David G.

@DavidG. -내 의견이 당신에게 가치가있어서 다행입니다. 또한 당신이 돌아 왔고 귀하의 답변이 긍정적 인 영역에 있음을 알게되어 기쁩니다. 개인적으로, 나는 의견을 제시하지 않은 다운 투표가 허용되어야한다고 생각하지 않습니다.
Jeremy Davis

대답을 살펴보면 일시적인 문제 (하나의 스크립트에서 사용하기 위해 오류 메시지를 억제하는)에 대한 영구적 인 해결책 (실제로 mysql을 래핑)이 최선의 방법이라고 확신하지 않습니다. 스크립트 내 함수에 mysql을 래핑하는 IMO는 (여기에서 메소드를 사용하는 것이 좋습니다) 우수한 접근 방식입니다. My 2c ... :)
Jeremy Davis

3

다음은 스크립트 / bin / sh의 Docker 솔루션입니다.

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]"> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user = root">> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "password = $ MYSQL_ROOT_PASSWORD">> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump --defaults-extra-file = / root / mysql-credentials.cnf --all-databases'

[MYSQL_CONTAINER_NAME]을 바꾸고 환경 변수 MYSQL_ROOT_PASSWORD가 컨테이너에 설정되어 있는지 확인하십시오.

그것이 나를 도울 수있는 것처럼 당신을 도울 수 있기를 바랍니다!


나쁘지 않다. 방금 하나의 호출을 리턴으로 docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'사용 했습니다. 예를 들어 사용하면 --defaults-file이미 루트를 선택합니다.
Matthew Wilcoxson

3

표준 오류 STDERR 출력을 / dev / null로 리디렉션 할 수도 있습니다.

그래서 그냥하십시오 :

mysql -u $user -p$password -e "statement" 2> /dev/null


7
이 캐치에 열심히 합법적 인 오류를 만들 것 때문에 나는이 같은이 방법을 피할 것
블라디미르 Hraban에게

1

개인적으로 스크립트 래퍼를 사용하여 해당 오류를 포착합니다. 다음은 코드 샘플입니다.

#!/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

1

PowerShell ( pwsh, not bash)의 경우 이것은 꽤 루비 골드 버그 솔루션이었습니다 ... 첫 번째 시도는 함수 mysql에서 호출을 래핑하는 try/catch것이었지만 PowerShell 오류 처리의 이상한 동작 으로 인해 실행되지 않았습니다.

이 솔루션은 무시했다 $ErrorActionPreference캡처와 결합 할 정도로만 STDERRSTDOUT말씀과 구문 분석을 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"
    }
}

참고 : Unix에서 PowerShell을 사용할 수 있으므로이 솔루션은 플랫폼 간입니다. bash사소한 구문 수정 으로 적용 할 수 있습니다 .

경고 : 영어 이외의 오류 메시지 나 ERROR출력의 어느 곳에서나 단어를 반환하는 명령문과 같이 작동하지 않는 수십 개의 엣지 케이스가 있지만, 기본 호출에 대한 경고를 삼켜 mysql서 전체 스크립트. 바라건대 다른 사람들이 이것이 유용하다고 생각합니다.

mysql이 경고를 억제하는 옵션을 단순히 추가하면 좋을 것 입니다.


1

Rundeck을 사용하여 작업을 예약하거나 mylogin.cnf파일 을 요청하는 다른 플랫폼을 사용하는 경우 SQL 호출을 진행하기 전에 다음 쉘 코드를 사용하여 파일의 새 위치를 제공했습니다.

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디렉토리 로 이동하거나 복사 할 수없는 경우에 특히 유용합니다 .

여기에서 설명서를 참조하십시오.


0

가장 좋은 해결책은 별칭을 사용하는 것입니다.

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;"

다음과 같은 별칭 : 별칭 :
Neil Davis

참고로 스크립트 내부의 함수 내에서 mysql을 호출하는 경우 별칭을 사용할 수 없습니다.
user3616725

0

도우미를 정의하십시오.

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로 테스트)


-1

다른 해결책 (예 : 스크립트) :

 sed -i'' -e "s/password=.*\$/password=$pass/g" ~/.my.cnf
 mysql -h $host -u $user $db_name -e "$sql_cmd"

-i''옵션은 Mac OS X와의 호환성을 위해 여기에 있습니다. 표준 UNIX OS는 바로 사용할 수 있습니다-i


1
password는 여전히 'sed'의 명령 행에 있으므로 잠깐이라도 프로세스 목록에 표시됩니다.
앤서니

-1

내가 겪었던 문제는 bash 스크립트의 조건부에서 출력을 사용하는 것이 었습니다.

이것은 우아하지는 않지만 docker env에서는 실제로 중요하지 않습니다. 기본적 으로이 모든 것은 마지막 줄에없는 출력을 무시하는 것입니다. awk와 비슷한 작업을 수행하고 첫 번째 줄을 제외한 모든 것을 반환하도록 변경하십시오.

마지막 줄만 반환

mysql -u db_user -pInsecurePassword my_database ... | sed -e '$!d'

오류를 억제하지는 않지만 bash 스크립트에서 쿼리 출력을 사용할 수 있도록합니다.


-1

가장 쉬운 방법 :

mysql -u root -p YOUR_DATABASE

이것을 입력하면 암호를 입력해야합니다.

참고 : 예, 세미콜론이 없습니다.


-3

다음과 같이 / 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

즐겨!


1
비밀번호 경고뿐만 아니라 모든 오류 메시지가 표시되지 않습니다.
Simon East

-3

그것은 나를 위해 일했습니다-방금 추가 2> null한 후에 $(mysql_command)오류 및 경고 메시지 만 표시되지 않습니다.


1
또한 다른 일이 발생했을 때 보고서를받지 못한다는 의미입니다!
앤서니

또한 원했을 ​​것 2>/dev/null입니다. 를 사용하면 2> null현재 디렉토리의 "null"이라는 파일에 출력을 넣을 수 있습니다.
thelogix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.