Подтвердить что ты не робот

Как выполнить автоматический вход в MySQL из сценария оболочки?

У меня есть сервер MySQL с пользователем с паролем. Я хочу выполнить несколько SQL-запросов в сценариях оболочки без указания пароля, например:

config.sh:

MYSQL_ROOT="root"
MYSQL_PASS="password"

mysql.sh:

source config.sh
mysql -u$MYSQL_ROOT -p$MYSQL_PASS -e "SHOW DATABASES"

Как можно упростить весь процесс для выполнения запросов SQL без указания аргументов -p, -u и т.д.?

4b9b3361

Ответ 1

Попробуйте следующее:

if [ $MYSQL_PASS ]
then
  mysql -u "$MYSQL_ROOT" -p"$MYSQL_PASS" -e "SHOW DATABASES"
else
  mysql -u "$MYSQL_ROOT" -e "SHOW DATABASES"
fi

Ответ 2

Альтернативные способы записи этих параметров.

Вы можете написать

mysql -u "$MYSQL_ROOT" -p "$MYSQL_PASS" -e "SHOW DATABASES"

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

mysql --user="$MYSQL_ROOT" --password="$MYSQL_PASS" -e "SHOW DATABASES"

Однако, по крайней мере, в моей системе установка MYSQL_PASS в "" в этом случае заставляет клиента пытаться подключиться без какого-либо пароля вообще. Поэтому, если есть разница между пустым паролем и без пароля, я не знаю, как передать его в командной строке.

.my.cnf файл

Но даже если есть способ, я все же предлагаю вам использовать файл ~/.my.cnf. Аргументы в командной строке, вероятно, включены в список процессов, сгенерированный ps -A -ocmd, поэтому другие пользователи могут их видеть. С другой стороны, файл .my.cnf может (и должен) быть доступен для чтения только вам (используя chmod 0600 ~/.my.cnf) и будет использоваться автоматически. Добавьте этот файл в следующие строки:

[client]
user=root
password=

Тогда достаточно простого mysql -e "SHOW DATABASES", так как клиент получит свои учетные данные из этого файла.

См. 6.1.2.1. Руководство пользователя для защиты паролей для различных способов, которыми вы можете предоставить пароль, а также их соответствующие преимущества и недостатки. См. 4.2.3.3. Использование файлов параметров для общей информации об этом .my.cnf файле

Ответ 3

Как предположил MvG (рекомендуется в руководстве MySQL 4.2.2 подключение и 6.1.2.1 правила безопасности), вы должны использовать файл. Пароль в командной строке может быть небезопасным, поскольку ps может показывать его другим пользователям. Файл не должен быть .my.cnf, может быть файлом опций ad-hoc для вашего script во временном файле:

OPTFILE="$(mktemp -q --tmpdir "${inname}.XXXXXX")$"
trap 'rm -f "$OPTFILE"' EXIT
chmod 0600 "$OPTFILE"
cat >"$OPTFILE" <<EOF
[client]
password="${MYSQL_PASS}"
EOF
mysql --user="$MYSQL_ROOT" --defaults-extra-file="$OPTFILE" -e "SHOW DATABASES"

Первые строки создают безопасный файл temp, а затем используют его, а затем используют. ловушка защитит вас от OPTFILE, лежащего вокруг в случае прерываний.

Ответ 4

Вот немного bash script, который вы можете использовать, чтобы быстро получить оболочку

Он открывает оболочку, поэтому вы можете вручную выполнять запросы. Очень удобно.

  #!/bin/bash
  DB_USER='your_db_username'
  DB_PASS='your_password'
  DB='database_name'
  echo 'logging into db $DB as $DB_USER'
  mysql -u "$DB_USER" --password="$DB_PASS" --database="$DB"

Ответ 5

Для автоматического входа в MySQL с использованием дистрибутивов Debian GNU/Linux (таких как Ubuntu, Xubuntu, Linux Mint, gNewSense и т.д. И т.д.) Вы можете просто использовать уже существующий файл /etc/mysql/debian.cnf, который содержит действительные учетные данные суперпользователя.

Итак, вы можете попытаться выполнить автоматический вход с помощью этой простой команды:

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

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

echo ''                                                                       >> ~/.bashrc
echo "# Auto-login in MySQL"                                                  >> ~/.bashrc
echo "# From https://stackoverflow.com/a/33584904/3451846"                    >> ~/.bashrc
echo "alias mysql='sudo mysql --defaults-file=/etc/mysql/debian.cnf'"         >> ~/.bashrc
echo "alias mysqldump='sudo mysqldump --defaults-file=/etc/mysql/debian.cnf'" >> ~/.bashrc
. ~/.bashrc

А затем просто введите это для автоматического входа в систему:

mysql