Как передать пароль в командную строку mysql


20

У меня есть пароль MySQL, сохраненный в файле foo.php, например P455w0rd, когда я пытаюсь его использовать:

$ cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2 | mysql -U root -p mydb -h friendserver
Enter password: (holds)

$ echo P455w0rd | mysql -u root -p mydb -h friendserver
Enter password: (holds)

Оба варианта по-прежнему запрашивают пароль. Как правильно отправить пароль stdin?


3
между -pпаролем и паролем не должно быть пробелов .
Fırat KÜÇÜK

mysql не читает пароль из stdin, я не смог понять, с чего он читает.
Omn

Правильный ответ: не помещайте свои пароли в командную строку, где любой, у кого есть доступ, /procможет тривиально прочитать их, пока работает программа . Это то, что ~/.my.cnfнужно, правильно chmod'ed до 0600
Шадур

Ответы:


25

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


Самый безопасный способ сделать это было бы создать новый конфигурационный файл и передать его с mysqlпомощью либо --defaults-file=или --defaults-extra-file=опции командной строки.

Разница между ними заключается в том, что последний читается в дополнение к файлам конфигурации по умолчанию, тогда как в первом используется только один файл, переданный в качестве аргумента.

Ваш дополнительный файл конфигурации должен содержать что-то похожее на:

[client]
user=foo
password=P@55w0rd

Убедитесь, что вы защищаете этот файл.

Затем запустите:

mysql --defaults-extra-file=<path to the new config file> [all my other options]

2
MySQL изменит его, argvчтобы перезаписать параметры, заданные для -pфлага. По крайней мере, это то, что заключено здесь, вместе с другой соответствующей информацией: unix.stackexchange.com/questions/78757/…
Кусалананда

Это лучшее решение, так как оно обеспечивает меру безопасности. Вам необходимо выполнить chmod go-rwx и убедиться, что этот аргумент предшествует всем остальным аргументам.
ChuckCottrill

1
@Kusalananda, да, но, согласно комментариям на unix.stackexchange.com/q/385339/135943 , это не значит, что это безопасно!
Wildcard

Возможно, стоит добавить примечание о --login-pathтом, что он поддерживается. Это не намного лучше, чем это, но это немного менее простой текст (хотя барьер для преобразования содержимого в открытый текст низкий).
Джеффри Уайзман

6
Установите MYSQL_PWD в среде ( export MYSQL_PWD=muhpassword) и выполните вашу команду без -p. См. Переменные программной среды MySQL . Несмотря на страшные предупреждения руководства , это довольно безопасно . Если вы не запустите странный варез в той же оболочке позже. Итак, мы бежим:MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost
Дэвид Тонхофер

12

mysqlУтилита клиента может взять пароль в командной строке либо с -pили --password=опциями.

Если вы используете -p, после буквы опции не должно быть пробелов:

$ mysql -pmypassword

Я предпочитаю длинные опции в скриптах, так как они самодокументируются:

mysql --password=mypassword --user=me --host=etc

3
Это небезопасно, потому что любой пользователь может просмотреть пароль - либо напрямую, /proc/$pid/cmdlineлибо с помощью psкоманды. Это правда, что mysql перезаписывает пароль в argv во время запуска, но всегда есть временное окно, в котором другой пользователь может наблюдать пароль. Кроме того, в некоторых системах перезапись argv может не работать.
maxschlepzig

3

Если вы хотите начать mysqlс предоставленного пароля, сначала вам нужно получить пароль в переменной:

MYSQLPASS=`cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2`

Затем вы можете начать свою mysqlкоманду с:

mysql -U root -p ${MYSQLPASS} mydb -h friendserver

1
Это также ставит под угрозу безопасность вашего пароля . Обратите внимание, что есть MYSQL_PWDпеременная окружения, которая читается, mysqlесли вы не укажете -p. А в Linux это безопасный метод, потому что окружение пользователя не может быть прочитано другими непривилегированными пользователями - в отличие от вектора аргумента.
maxschlepzig
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.