Jak przekazać hasło do wiersza polecenia mysql

20

Mam hasło MySQL zapisane w pliku foo.php, na przykład P455w0rd, kiedy próbuję go użyć:

$ 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)

Obie opcje wciąż pytają o hasło, z jakiego jest prawidłowego sposobu wysłania hasła stdin?

Kokizzu
źródło
3
nie może być pustego między -phasłem a hasłem.
Fırat KÜÇÜK
mysql nie odczytuje hasła ze standardowego wejścia, nie byłem w stanie zorientować się, z czego to czyta.
Omn
Prawidłowa odpowiedź to nie umieszczaj haseł w wierszu poleceń, w którym każdy, kto ma do /procnich dostęp, może je w prosty sposób odczytać, dopóki program jest uruchomiony . Po to ~/.my.cnfjest a , właściwie chmod'ed do 0600
Shadur

Odpowiedzi:

25

Musisz być bardzo ostrożny w przekazywaniu haseł do linii poleceń, ponieważ jeśli nie będziesz ostrożny, pozostaniesz otwarty na wąchanie za pomocą narzędzi takich jak ps.


Najbezpieczniejszym sposobem na to byłoby utworzenie nowego pliku konfiguracyjnego i przekazanie go za mysqlpomocą opcji wiersza polecenia --defaults-file=lub --defaults-extra-file=.

Różnica między nimi polega na tym, że ten drugi jest odczytywany jako dodatek do domyślnych plików konfiguracyjnych, podczas gdy w pierwszym przypadku tylko jeden plik jest przekazywany jako argument.

Twój dodatkowy plik konfiguracyjny powinien zawierać coś podobnego do:

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

Upewnij się, że zabezpieczasz ten plik.

Następnie uruchomić:

mysql --defaults-extra-file=<path to the new config file> [all my other options]
garethTheRed
źródło
2
MySQL zmodyfikuje go, argvaby zastąpić parametry podane dla -pflagi. Przynajmniej tak się tutaj zawarto, wraz z innymi istotnymi informacjami: unix.stackexchange.com/questions/78757/…
Kusalananda
To najlepsze rozwiązanie, ponieważ zapewnia pewien poziom bezpieczeństwa. Musisz chmod go-rwx i upewnić się, że ten argument poprzedza wszystkie inne argumenty.
ChuckCottrill
1
@Kusalananda tak, ale jak na komentarze na unix.stackexchange.com/q/385339/135943 , że nie oznacza, że jest bezpieczny!
Wildcard
Warto dodać informację o --login-pathtym, że jest obsługiwany. Nie jest to dużo lepsze niż to, ale jest nieco mniej zwykłego tekstu (nawet jeśli bariera w konwersji treści na zwykły tekst jest niska).
Geoffrey Wiseman
6
Ustaw MYSQL_PWD w środowisku ( export MYSQL_PWD=muhpassword) i wykonaj polecenie bez -p. Zobacz zmienne środowiskowe programu MySQL . Mimo ostrych ostrzeżeń zawartych w instrukcji jest to dość bezpieczne . Chyba że później uruchomisz dziwne towary w tej samej powłoce. MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost
Biegniemy
12

Narzędzie mysqlklienta może przyjąć hasło w wierszu polecenia za pomocą opcji -plub --password=.

Jeśli używasz -p, po literze opcji nie może być spacji:

$ mysql -pmypassword

Wolę długie opcje w skryptach, ponieważ są one samo dokumentujące:

mysql --password=mypassword --user=me --host=etc
Kusalananda
źródło
3
Nie jest to bezpieczne, ponieważ każdy użytkownik może wyświetlić hasło - bezpośrednio za pomocą /proc/$pid/cmdlinelub za pomocą pspolecenia. To prawda, że ​​mysql zastępuje hasło w argv podczas uruchamiania, ale zawsze istnieje okno czasowe, w którym inny użytkownik może je zobaczyć. Ponadto w niektórych systemach nadpisywanie argv może nie działać.
maxschlepzig
3

Jeśli chcesz zacząć mysqlod hasła, pod warunkiem, że najpierw musisz pobrać hasło w zmiennej:

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

Następnie możesz rozpocząć mysqlpolecenie za pomocą:

mysql -U root -p ${MYSQLPASS} mydb -h friendserver
Lambert
źródło
1
Zagraża to również bezpieczeństwu hasła . Zauważ, że istnieje MYSQL_PWDzmienna środowiskowa, która jest odczytywana, mysqljeśli jej nie określisz -p. W Linuksie jest to bezpieczna metoda, ponieważ środowisko użytkownika nie może być odczytane przez innych nieuprzywilejowanych użytkowników - w przeciwieństwie do wektora argumentów.
maxschlepzig