itsource

단말기 내에서 mysql을 사용하여 경고 메시지를 표시하지 않지만 비밀번호는 bash 스크립트로 작성됩니다.

mycopycode 2022. 10. 25. 21:33
반응형

단말기 내에서 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 스크립트를 다음과 같이 준비했습니다.이것은 크리스티안 포르타의 훌륭한 대답의 확대이다.

  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
    

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

아주 간단해요.이건 날 위한 일이야

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은 꽤 ), 이것 、 ), ), 、 이 ), ), ), ), ), ), ), ), ), ), ), ), ), ), ), ), ), ), ), 。첫 번째 시도는 콜을 랩하는 것이었습니다.mysqlin 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

반응형