Як передати пароль до командного рядка mysql


20

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

$ 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, я не зміг зрозуміти, з чого він його читає.
Омн

Правильна відповідь - не ставити свої паролі в командному рядку, де кожен, хто має доступ, /procможе тривіально їх читати, доки програма працює . Це те , що ~/.my.cnfдля, правильно chmod'ed в 0600
Shadur

Відповіді:


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/…
Kusalananda

Це найкраще рішення, оскільки воно забезпечує міру безпеки. Вам потрібно chmod go-rwx і переконатися, що цей аргумент передує всім іншим аргументам.
ChuckCottrill

1
@Kusalananda, так, але згідно коментарів на unix.stackexchange.com/q/385339/135943 , це не означає, що це безпечно!
Wildcard

Можливо, варто додати примітку про --login-pathте, що вона підтримується. Це не набагато краще, ніж це, але дещо менш простий текст (навіть незважаючи на те, що бар'єр для перетворення вмісту у відкритий текст низький).
Джеффрі Вісман

6
Встановіть MYSQL_PWD у середовищі ( export MYSQL_PWD=muhpassword) та виконайте свою команду без значка -p. Див . Змінні середовища MySQL Program . Незважаючи на жорстокі попередження посібника , це досить безпечно . Якщо ви не пізніше не почнете дивний варез в одній оболонці. Отже, ми біжимо: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 під час запуску, але завжди є часове вікно, де інший користувач може спостерігати пароль. Також у деяких системах перезапис аргументів може не працювати.
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.