Kiedy próbowałem uruchomić następujące polecenie na MySQL z poziomu terminala:
mysql -u $user -p$password -e "statement"
Wykonanie działa zgodnie z oczekiwaniami, ale zawsze wyświetla ostrzeżenie:
Ostrzeżenie: użycie hasła w interfejsie wiersza poleceń może być niepewne.
Jednak muszę przeprowadzić powyższą instrukcję, używając zmiennej środowiskowej ( $password
), która przechowuje moje hasło, ponieważ chcę uruchomić polecenie iteracyjnie w skrypcie bash z poziomu terminala i zdecydowanie nie podoba mi się pomysł oczekiwania na wyświetlenie monitu i zmuszając mnie do wpisania mojego hasła 50 lub 100 razy w jednym skrypcie. Oto moje pytanie:
Czy można znieść ostrzeżenie? Polecenie działa poprawnie, jak już powiedziałem, ale okno staje się dość niechlujne, gdy zapętlę się i uruchomię polecenie 50 lub 100 razy.
Czy powinienem zastosować się do ostrzeżenia i NIE zapisywać hasła w skrypcie? Jeśli tak jest, to czy muszę wpisywać hasło za każdym razem, gdy monit mnie do tego zmusza?
Bieganie man mysql
nie pomaga, mówiąc tylko
--show-warnings
Powoduje wyświetlanie ostrzeżeń po każdym stwierdzeniu, jeśli takie istnieją. Ta opcja dotyczy trybu interaktywnego i wsadowego.
i nie wspomina nic o tym, jak wyłączyć tę funkcję, jeśli czegoś mi nie brakuje.
Jestem na OS X 10.9.1 Mavericks i używam MySQL 5.6 z homebrew.
[client]
password=my_password
w~/.my.cnf
). Z pewnością ma to również wpływ na bezpieczeństwo, ale przynajmniej nie jest dostępny dla każdego, kto może uruchomićps
, a ty masz kontrolę nad nim dzięki uprawnieniom do plików.mysql -u root password root -e "statement" > /dev/null
?pexcept
. Może wykonywać wstawiania zacisków, a także obsługiwać informacje zwrotne przekazywane przez polecenie. W ten sposób możesz po prostu pominąć pełne dane wyjściowe i usunąćOdpowiedzi:
Jeśli wersja klienta / serwera MySQL to wersja 5.6.xa, aby uniknąć komunikatu OSTRZEŻENIE, użyj narzędzi mysql_config_editor :
Następnie możesz użyć w skrypcie powłoki:
Zamiast:
źródło
--login-path
musi to być najważniejsze argumenty. Próbowałemmysqldump --tables --login-path=local
dostać błądunknown variable 'login-path=local'
.Używam czegoś takiego jak:
lub
Gdzie config.cnf zawiera:
Pozwala to na posiadanie wielu plików konfiguracyjnych - dla różnych serwerów / ról / baz danych. Użycie ~ / .my.cnf pozwoli ci mieć tylko jeden zestaw konfiguracji (chociaż może to być użyteczny zestaw ustawień domyślnych).
Jeśli korzystasz z dystrybucji opartej na Debianie i działasz jako root, możesz pominąć powyższe i po prostu użyć /etc/mysql/debian.cnf, aby dostać się do ...:
mysql --defaults-extra-file=/etc/mysql/debian.cnf
źródło
--defaults-extra-file
musi być pierwszą opcją, w przeciwnym razie mysql narzekamysqldump: unknown variable 'defaults-extra-file
.MYSQL_PWD
zmiennej ....mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement"
. Ponieważprintf
Bash jest wykonywany bezpośrednio, nie pojawia się wps
.--defaults-file
raczej użyć niż--defaults-extra-file
, ponieważ ten drugi preferował ustawienia ~ / .my.cnf.Jedną z metod, która jest wygodna (ale równie niepewna), jest użycie:
Pamiętaj, że oficjalni doktorzy odradzają to.
Zobacz 6.1.2.1 Wytyczne dla użytkowników końcowych dotyczące bezpieczeństwa haseł (Podręcznik MySQL dla wersji 5.6) :
źródło
Access denied for user 'root'@'localhost' (using password: NO)
export MYSQL_PWD=whatever
.export
, wystarczy umieścić wszystko w jednym wierszu:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
Jeśli chcesz użyć hasła w wierszu polecenia, zauważyłem, że działa to w celu odfiltrowania określonego komunikatu o błędzie:
Zasadniczo przekierowuje standardowy błąd na standardowe wyjście - i używa grep, aby usunąć wszystkie wiersze pasujące do „Ostrzeżenie: Używanie hasła”.
W ten sposób możesz zobaczyć inne dane wyjściowe, w tym błędy. Używam tego do różnych skryptów powłoki itp.
źródło
Oto jak dostałem mój skrypt bash do codziennego tworzenia kopii zapasowych bazy danych mysqldump, aby działał bezpieczniej. Jest to rozwinięcie świetnej odpowiedzi Cristiana Porty.
Najpierw użyj mysql_config_editor (dostarczany z mysql 5.6+), aby skonfigurować zaszyfrowany plik hasła. Załóżmy, że twoja nazwa użytkownika to „użytkownik_db”. Uruchamianie z wiersza poleceń powłoki:
Monituje o hasło. Po wprowadzeniu użytkownik / hasło są zapisywane zaszyfrowane w twoim
home/system_username/.mylogin.cnf
Oczywiście zmień „system_username” na swoją nazwę użytkownika na serwerze.
Zmień skrypt bash z tego:
do tego:
Nigdy więcej odsłoniętych haseł.
źródło
Najłatwiej jest
źródło
2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."
aby ukryć tylko to ostrzeżenieMożesz również uruchomić mysql_config_editor w skrypcie, aby podać hasło podczas określania ścieżki logowania
To rozpoczyna sesję oczekiwania, której można użyć w skryptach do interakcji z monitami
Zobacz ten post
źródło
ok, rozwiązanie bez plików tymczasowych lub czegokolwiek:
jest podobny do tego, co wspomnieli inni, ale tutaj nie potrzebujesz rzeczywistego pliku, ta część polecenia fałszuje plik:
<(echo ...)
(zauważ, że nie ma spacji w środku<(
źródło
.my.cnf
plik~/.
z hasłemAby zobaczyć, co napisał mysql_config_editor do pliku .mylogin.cnf, użyj polecenia print:
Polecenie print wyświetla każdą ścieżkę logowania jako zestaw linii rozpoczynających się od nagłówka grupy wskazującego nazwę ścieżki logowania w nawiasach kwadratowych, a następnie wartości opcji ścieżki logowania. Wartości haseł są maskowane i nie są wyświetlane jako zwykły tekst.
Jak pokazano w poprzednich przykładach, plik .mylogin.cnf może zawierać wiele ścieżek logowania. W ten sposób mysql_config_editor ułatwia skonfigurowanie wielu „osobowości” do łączenia się z różnymi serwerami MySQL. Dowolne z nich można później wybrać według nazwy, używając opcji --login-path podczas wywoływania programu klienckiego. Na przykład, aby połączyć się z serwerem lokalnym, użyj tego polecenia:
Aby połączyć się ze zdalnym serwerem, użyj tego polecenia:
źródło
Od https://gist.github.com/nestoru/4f684f206c399894952d
źródło
Inną alternatywą jest użycie sshpass do wywołania mysql, np .:
źródło
Prosty skrypt obejścia. Nazwij to „mysql” i umieść go na swojej ścieżce przed „/ usr / bin”. Oczywiste warianty dla innych poleceń lub jeśli tekst ostrzeżenia jest inny.
źródło
Oto rozwiązanie dla Dockera w skrypcie / bin / sh:
Zamień [MYSQL_CONTAINER_NAME] i upewnij się, że zmienna środowiskowa MYSQL_ROOT_PASSWORD jest ustawiona w twoim kontenerze.
Mam nadzieję, że to ci pomoże, bo może mi pomóc!
źródło
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'
Użycie--defaults-file
go już teraz uruchamia rootowanie.Możesz także po prostu przekierować wyjście standardowe błędu STDERR do / dev / null
Więc po prostu zrób:
mysql -u $user -p$password -e "statement" 2> /dev/null
źródło
Osobiście używam otoki skryptu, aby wyłapać ten błąd. Oto przykładowy kod:
źródło
W przypadku PowerShell (
pwsh
, niebash
) było to dość rube-goldberg rozwiązanie ... Moja pierwsza próba polegała na zawinięciu wywołańmysql
wtry/catch
funkcję, ale z powodu dziwnego zachowania w obsłudze błędów PowerShell , nie było to wykonalne.Rozwiązaniem było przesłonić
$ErrorActionPreference
tylko wystarczająco długo, aby połączyć i przechwytywanieSTDERR
orazSTDOUT
i przetwarza na słowieERROR
i ponownego rzutu w razie potrzeby. Powodem, dla którego nie mogliśmy złapać i zwolnić,"^mysql.*Warning.*password"
jest to, że PowerShell obsługuje i zgłasza błąd jako jeden strumień, więc musisz przechwycić wszystko , aby filtrować i ponownie rzucać. : /Uwaga: PowerShell jest dostępny dla Uniksa, więc to rozwiązanie jest wieloplatformowe. Można go dostosować
bash
z niewielkimi modyfikacjami składni.Ostrzeżenie: istnieją dziesiątki przypadków, w których to nie zadziała, takie jak nieanglojęzyczne komunikaty o błędach lub instrukcje, które zwracają to słowo w
ERROR
dowolnym miejscu wyniku, ale wystarczyło przełknąć ostrzeżenie o podstawowym wywołaniumysql
bez bombardowania cały skrypt. Mam nadzieję, że inni uznają to za przydatne.Byłoby miło, gdyby
mysql
po prostu dodano opcję tłumienia tego ostrzeżenia.źródło
Jeśli zdarzy ci się korzystać z Rundeck do planowania zadań lub z innej platformy, o którą poprosisz
mylogin.cnf
plik, z powodzeniem użyłem następującego kodu powłoki, aby podać nową lokalizację pliku przed kontynuowaniem wywołań sql:Gdzie
MYSQL_TEST_LOGIN_FILE
jest zmienna środowiskowa, którą można ustawić na inną ścieżkę pliku niż domyślna.Jest to szczególnie przydatne, jeśli pracujesz w rozwidlonym procesie i nie możesz przenosić ani kopiować plików do
$HOME
katalogu.Zobacz dokumentację tutaj.
źródło
najlepszym rozwiązaniem jest użycie aliasu:
przykład, wstaw to do skryptu:
następnie w skrypcie, aby załadować bazę danych:
aby uruchomić instrukcję:
źródło
Zdefiniuj pomocnika:
Użyj tego:
Tachaan! Twój kod jest czysty i przyjemny do odczytania
(testowane z bash)
źródło
Inne rozwiązanie (na przykład ze skryptu):
Dostępna
-i''
jest tutaj opcja zgodności z systemem Mac OS X. Standardowe systemy operacyjne UNIX mogą używać bezpośrednio-i
źródło
Problem, który miałem, polegał na wykorzystaniu danych wyjściowych w warunkowym skrypcie bash.
Nie jest to eleganckie, ale w środowisku dokerów nie powinno to mieć znaczenia. Zasadniczo wszystko to powoduje ignorowanie danych wyjściowych, które nie znajdują się w ostatnim wierszu. Możesz zrobić podobnie z awk i zmienić, aby zwrócić wszystkie oprócz pierwszej linii itp.
To zwraca tylko ostatnią linię
Nie ukryje błędu, ale upewni się, że możesz użyć wyniku zapytania w skrypcie bash.
źródło
Najłatwiejszy sposób:
Wpisz to, a będziesz musiał wpisać swoje hasło w.
Uwaga: Tak, bez średnika.
źródło
Możesz uruchomić mySQL i ukryć ostrzeżenia i komunikaty o błędach, używając na przykład / dev / null:
Gdzie:
cieszyć się!
źródło
To działało dla mnie - właśnie dodałem
2> null
po$(mysql_command)
, i pomija tylko komunikaty o błędach i ostrzeżeniach.źródło
2>/dev/null
. Użycie2> null
spowoduje po prostu umieszczenie danych wyjściowych w pliku o nazwie „null” w bieżącym katalogu.