Подавление предупреждающих сообщений с помощью mysql из терминала, но пароль написан в скрипте bash



когда я попытался запустить следующую команду на MySQL из терминала:



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


выполнение работает, как ожидалось, но он всегда выдает предупреждение:




предупреждение: использование пароля в интерфейсе командной строки может быть небезопасным.




однако, я должен провести заявление выше, используя переменную окружения ($password), который хранит мой пароль, потому что я хочу запустить команду итеративно в скрипте bash из терминала, и мне определенно не нравится идея ждать появления подсказки и заставлять меня вводить свой пароль 50 или 100 раз в одном скрипте. Так вот мой вопрос:




  • возможно ли подавить предупреждение? Команда работает правильно, как я уже сказал, но окно становится довольно грязным, когда я перебираю и запускаю команду 50 или 100 раз.


  • должен ли я подчиняться предупреждающему сообщению и не писать свой пароль в моем сценарий? Если это так, то должен ли я вводить свой пароль каждый раз, когда приглашение заставляет меня это делать?



под управлением man mysql не помогает, говорят только




--show-warnings

Вызовите предупреждения, которые будут отображаться после каждого оператора, если таковые имеются. Этот параметр применяется к интерактивному и пакетному режиму.




и ничего не упоминает о том, как отключить функциональность, если я ничего не упускаю.



Я на ОС X 10.9.1 Mavericks и использовать MySQL 5.6 от homebrew.

2367   19  

19 ответов:

Если ваша версия клиента/сервера MySQL является 5.6.x способ избежать предупреждающего сообщения с помощью mysql_config_editor инструменты:

mysql_config_editor set --login-path=local --host=localhost --user=username --password

затем можно использовать в shell-скрипт:

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.КНФ содержит:

[client]
user = whatever
password = whatever
host = whatever

Это позволяет иметь несколько файлов конфигурации - для разных серверов / ролей / баз данных. Использование ~/. my.cnf позволит вам иметь только один набор настроек (хотя это может быть полезный набор настроек по умолчанию).

если вы используете дистрибутив на основе Debian и работаете как root, вы можете пропустить вышеизложенное и просто использовать /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 для версии 5.6):

сохранение пароля в MYSQL_PWD переменные среды

этот метод указания пароля MySQL должен быть рассмотрен крайне неуверенным и не следует использовать. Некоторые версии ps включить опцию для отображения среды запущенных процессов. На некоторых системах, если вы установите MYSQL_PWD, ваш пароль предоставляется любому другому пользователю, который запускает ps. Даже на системах без такой версии ps, неразумно предполагать, что нет никаких других методов, с помощью которых пользователи могут исследовать процессные среды.

Если вы хотите использовать пароль в командной строке, я обнаружил, что это работает для фильтрации конкретное сообщение об ошибке:

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

это в основном перенаправление стандартной ошибки на стандартный вывод - и использование grep для удаления всех строк, которые соответствуют "Warning: Using a password".

таким образом, вы можете увидеть любые другие выходные данные, включая ошибки. Я использую это для различных сценариев оболочки и т. д.

вот как я получил свой скрипт bash для моих ежедневных резервных копий базы данных mysqldump, чтобы работать более безопасно. Это расширение великого ответа Кристиана порта.

  1. первым использованием mysql_config_editor (поставляется с mysql 5.6+) для настройки зашифрованного файла пароля. Пусть ваше имя пользователя "пользователь_базы_данных". Запуск из командной строки:

    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
    

больше никаких открытых паролей.

самый простой способ-это

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

вы также можете запустить 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}
"

это запускает ожидаемый сеанс, который может быть использован в скриптах для взаимодействия с подсказками

этот пост

от 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'
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 файл, используйте команду печати:

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

вот решение для Docker в скрипте / bin/sh:

настройки метод exec [MYSQL_CONTAINER_NAME] Ш-с 'Exec и Эхо "[клиент]" > /корень/MySQL базы-учетные данные.cnf'

настройки вызова exec [MYSQL_CONTAINER_NAME] Ш-с 'метод exec Эхо "пользователей=коренные" >> /корневой/в MySQL-учетные данные.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh-c 'exec echo "password=$MYSQL_ROOT_PASSWORD" >> /root/mysql-учетные данные.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh - c ' exec mysqldump --defaults-extra-file= / root / mysql-учетные данные.cnf --all-databases'

замените [MYSQL_CONTAINER_NAME] и убедитесь, что переменная среды MYSQL_ROOT_PASSWORD установлена в вашем контейнере.

надеюсь, что это поможет вам, как он может помочь мне !

лично я использую оболочку скрипта, чтобы поймать эту ошибку. Вот пример кода:

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

Для PowerShell (pwsh, а не bash), это было довольно решение Рубе-Голдберга... Моя первая попытка была обернуть звонки на mysql на

вы также можете просто перенаправить стандартный вывод ошибки STDERR в /dev / null

Так что:

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

другое решение (из скрипта, например):

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

The -i'' опция здесь для совместимости с Mac OS X. стандартные ОС UNIX могут использовать straight -i

проблема, с которой я столкнулся, заключалась в использовании вывода в условном скрипте bash.

это не элегантно, но в докере env это действительно не имеет значения. В основном все это игнорирует вывод, который не находится на последней строке. Вы можете сделать то же самое с awk и изменить, чтобы вернуть все, кроме первой строки и т. д.

Это возвращает только последнюю строку

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

он не будет подавлять ошибку, но он будет убедиться, что вы можете использовать вывод запроса в bash скрипт.

простой скрипт 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

вы можете выполнить mySQL и подавить предупреждения и сообщения об ошибках с помощью /dev / null например:

# 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

наслаждайтесь!

это сработало для меня- Просто добавил 2> null после $(mysql_command), и он будет подавлять ошибки и предупреждающие сообщения.

Comments

    Ничего не найдено.