Когда я попытался запустить следующую команду на MySQL из терминала:
mysql -u $user -p$password -e "statement"
Выполнение работает как положено, но всегда выдает предупреждение:
Предупреждение. Использование пароля в интерфейсе командной строки может быть небезопасным.
Тем не менее, я должен выполнить вышеупомянутое утверждение, используя переменную окружения ( $password
), в которой хранится мой пароль, потому что я хочу выполнить команду итеративно в скрипте bash из терминала, и мне определенно не нравится идея ожидания появления подсказки и заставляет меня вводить пароль 50 или 100 раз в одном скрипте. Итак, вот мой вопрос:
Возможно ли подавить предупреждение? Команда работает правильно, как я уже говорил, но окно становится довольно грязным, когда я повторяю цикл и запускаю команду 50 или 100 раз.
Должен ли я подчиниться предупреждающему сообщению и НЕ записывать свой пароль в свой сценарий? Если это так, то должен ли я вводить свой пароль каждый раз, когда приглашение заставляет меня сделать это?
Бег man mysql
не помогает, говоря только
--show-warnings
Приводит к выводу предупреждений после каждого оператора, если они есть. Этот параметр применяется к интерактивному и пакетному режимам.
и ничего не упоминает о том, как отключить функционал, если я что-то не упустил.
Я на OS X 10.9.1 Mavericks и использую MySQL 5.6 от homebrew.
[client]
password=my_password
в~/.my.cnf
). Конечно, это также имеет некоторые последствия для безопасности, но, по крайней мере, оно не доступно для всех, кто может работатьps
, и вы можете управлять им с помощью прав доступа к файлам.mysql -u root password root -e "statement" > /dev/null
?pexcept
. Он может выполнять терминальные вставки, а также обрабатывать обратную связь, которую дает команда. Таким образом, вы можете просто пропустить этот подробный вывод иОтветы:
Если ваша клиент-серверная версия MySQL 5.6.xa, чтобы избежать сообщения ПРЕДУПРЕЖДЕНИЕ, используйте инструменты mysql_config_editor :
Затем вы можете использовать в своем сценарии оболочки:
Вместо того:
источник
--login-path
должен предшествовать всем остальным аргументам. Я пыталсяmysqldump --tables --login-path=local
и получил ошибкуunknown variable 'login-path=local'
.Я использую что-то вроде:
или
Где config.cnf содержит:
Это позволяет вам иметь несколько конфигурационных файлов - для разных серверов / ролей / баз данных. Использование ~ / .my.cnf позволит вам иметь только один набор конфигурации (хотя это может быть полезным набором значений по умолчанию).
Если вы работаете в дистрибутиве на основе Debian и работаете от имени пользователя root, вы можете пропустить вышеупомянутое и просто использовать /etc/mysql/debian.cnf, чтобы войти ...:
mysql --defaults-extra-file=/etc/mysql/debian.cnf
источник
--defaults-extra-file
должен быть первым вариантом, в противном случае mysql жалуетсяmysqldump: unknown variable 'defaults-extra-file
.MYSQL_PWD
переменную ....mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement"
. Посколькуprintf
Bash выполняется непосредственно, он не отображается вps
.--defaults-file
а не--defaults-extra-file
, потому что последний отдает предпочтение настройкам в ~ / .my.cnf.Один из методов, который удобен (но в равной степени небезопасен), заключается в использовании:
Обратите внимание, что официальные документы рекомендуют против этого.
См. 6.1.2.1 Руководство для конечного пользователя по защите паролем (Mysql Manual для версии 5.6) :
источник
Access denied for user 'root'@'localhost' (using password: NO)
export MYSQL_PWD=whatever
.export
, просто поместите все в одну строку:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
Если вы хотите использовать пароль в командной строке, я обнаружил, что это работает для фильтрации конкретного сообщения об ошибке:
Это в основном перенаправление стандартной ошибки на стандартный вывод - и использование grep для удаления всех строк, которые соответствуют «Предупреждение. Использование пароля».
Таким образом, вы можете увидеть любой другой вывод, включая ошибки. Я использую это для различных сценариев оболочки и т. Д.
источник
Вот как я получил мой bash-скрипт для ежедневного резервного копирования базы данных mysqldump для более безопасной работы. Это расширение великого ответа Кристиана Порта.
Сначала используйте mysql_config_editor (поставляется с mysql 5.6+) для настройки зашифрованного файла паролей. Предположим, ваше имя пользователя "db_user". Запуск из командной строки:
Он запрашивает пароль. После того, как вы введете его, пользователь / пароль сохранятся в зашифрованном виде в вашем
home/system_username/.mylogin.cnf
Конечно, измените «system_username» на ваше имя пользователя на сервере.
Измените ваш bash скрипт из этого:
к этому:
Нет больше открытых паролей.
источник
Самый простой способ
источник
2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."
для подавления только рассматриваемого предупрежденияВы также можете запустить mysql_config_editor в своем скрипте, чтобы передать пароль при указании пути входа
Это запускает ожидаемый сеанс, который можно использовать в сценариях для взаимодействия с подсказками.
Смотрите этот пост
источник
хорошо, решение без временных файлов или чего-либо:
это похоже на то, что упоминали другие, но здесь вам не нужен фактический файл, эта часть команды подделывает файл:
<(echo ...)
(обратите внимание, что в середине нет места<(
источник
.my.cnf
файл~/.
с паролемЧтобы увидеть, что mysql_config_editor записал в файл .mylogin.cnf, используйте команду print:
Команда print отображает каждый путь входа в систему в виде набора строк, начинающихся с заголовка группы, указывающего имя пути входа в квадратных скобках, за которым следуют значения параметров для пути входа в систему. Значения пароля маскируются и не отображаются в виде открытого текста.
Как показано в предыдущих примерах, файл .mylogin.cnf может содержать несколько путей входа в систему. Таким образом, mysql_config_editor позволяет легко настроить несколько «личностей» для подключения к различным серверам MySQL. Любой из них можно будет выбрать по имени позже, используя опцию --login-path, когда вы вызываете клиентскую программу. Например, чтобы подключиться к локальному серверу, используйте эту команду:
Чтобы подключиться к удаленному серверу, используйте эту команду:
источник
С https://gist.github.com/nestoru/4f684f206c399894952d
источник
Другой альтернативой является использование sshpass для вызова mysql, например:
источник
Простой трудоемкий скрипт. Назовите этот «mysql» и поместите его на вашем пути перед «/ usr / bin». Очевидные варианты для других команд, или, если текст предупреждения отличается.
источник
Вот решение для Docker в сценарии / bin / sh:
Замените [MYSQL_CONTAINER_NAME] и убедитесь, что в вашем контейнере установлена переменная среды MYSQL_ROOT_PASSWORD.
Надеюсь, это поможет вам, как это может помочь мне!
источник
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'
использовании--defaults-file
он тоже забирает root.Вы также можете просто перенаправить стандартный вывод ошибки STDERR в / dev / null
Так что просто сделайте:
mysql -u $user -p$password -e "statement" 2> /dev/null
источник
Лично я использую скрипт-обертку, чтобы поймать эту ошибку. Вот пример кода:
источник
Для PowerShell (
pwsh
неbash
), это было решение rube-goldberg ... Моей первой попыткой было обернуть вызовыmysql
вtry/catch
функцию, но из-за некоторого странного поведения в обработке ошибок PowerShell это было нежизнеспособным.Решение состояло в том, чтобы переопределить
$ErrorActionPreference
только достаточно долго, чтобы объединить и захватитьSTDERR
иSTDOUT
и проанализировать словоERROR
и перебросить по мере необходимости. Причина, по которой мы не смогли поймать и выпустить,"^mysql.*Warning.*password"
заключается в том, что PowerShell обрабатывает и выдает ошибку как один поток, поэтому вы должны захватить ее все для фильтрации и повторного выброса. : /Примечание: PowerShell доступен для Unix, поэтому данное решение является кроссплатформенным. Это может быть адаптировано
bash
с некоторыми незначительными изменениями синтаксиса.Предупреждение: существуют десятки крайних случаев, когда это не сработает, таких как неанглийские сообщения об ошибках или операторы, которые возвращают слово в
ERROR
любом месте вывода, но этого было достаточно, чтобы проглотить предупреждение для основного вызоваmysql
без бомбардировки весь сценарий. Надеюсь, другие найдут это полезным.Было бы неплохо, если бы
mysql
просто добавили опцию подавления этого предупреждения.источник
Если вам случится использовать Rundeck для планирования ваших задач или любую другую платформу, где вы запрашиваете
mylogin.cnf
файл, я успешно использовал следующий код оболочки, чтобы указать новое местоположение файла перед продолжением вызовов sql:Где
MYSQL_TEST_LOGIN_FILE
переменная окружения, для которой можно задать путь к файлу, отличному от пути по умолчанию.Это особенно полезно, если вы работаете в разветвленном процессе и не можете перемещать или копировать файлы в
$HOME
каталог.Смотрите документацию здесь.
источник
Лучшее решение - использовать псевдоним:
Например, поместите это в ваш скрипт:
затем в вашем скрипте для загрузки базы данных:
запустить заявление:
источник
Определите помощника:
Используй это:
Tachaan! Ваш код чистый и приятный для чтения
(проверено с помощью bash)
источник
Другое решение (например, из скрипта):
-i''
Вариант здесь для совместимости с Mac OS X. Стандартные UNIX операционки можно использовать прямой-i
источник
Проблема, с которой я столкнулся, заключалась в использовании вывода в условном выражении в bash-скрипте.
Это не элегантно, но в доке env это действительно не имеет значения. В основном все, что это делает, это игнорирует вывод, который находится не в последней строке. Вы можете сделать то же самое с awk, и изменить, чтобы вернуть все, кроме первой строки и т. Д.
Это возвращает только последнюю строку
Это не подавит ошибку, но убедится, что вы можете использовать вывод запроса в скрипте bash.
источник
Самый простой способ:
Введите это, и вам нужно будет ввести свой пароль.
Примечание: Да, без точки с запятой.
источник
Вы можете выполнить mySQL и подавить предупреждения и сообщения об ошибках, используя / dev / null, например:
Куда:
наслаждаться!
источник
Это сработало для меня - только что добавлено
2> null
после$(mysql_command)
, и будет подавлять только сообщения об ошибках и предупреждениях.источник
2>/dev/null
. Использование2> null
просто поместит вывод в файл с именем «null» в текущем каталоге.