Pomiń komunikaty ostrzegawcze przy użyciu mysql z poziomu terminala, ale hasło zapisane w skrypcie bash


273

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 mysqlnie 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.


14
Zalecanym sposobem jest przechowywanie hasła w pliku opcji (coś jak [client] password=my_passwordw ~/.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.
Anton Kovalenko,

4
mysql -u root password root -e "statement" > /dev/null?

A tak przy okazji, możesz także użyć czegoś takiego jak Python 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ąć

6
Zalecany sposób IMO karze tych, którzy postępują właściwie, aby chronić tych, którzy postępują niewłaściwie. Jeśli hasło jest zapisane w pliku skryptu, nie pojawi się w ps ani w żadnym dzienniku. To jest właściwy sposób, aby to zrobić. Umieszczenie pliku w pliku zewnętrznym pomaga tym, którzy przeklinaliby hasło, ale na początek jest to złe. W międzyczasie skrypty działające od lat zawodzą i musimy je zmodyfikować tylko dlatego, że to ostrzeżenie pojawia się w stderr.
Nestor Urquiza

2
Dla zalecanej metody, która nie przechowuje hasła w sposób wyraźny, jest opisana w dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html
Anthony

Odpowiedzi:


249

Jeśli wersja klienta / serwera MySQL to wersja 5.6.xa, aby uniknąć komunikatu OSTRZEŻENIE, użyj narzędzi mysql_config_editor :

mysql_config_editor set --login-path=local --host=localhost --user=username --password

Następnie możesz użyć w skrypcie powłoki:

mysql --login-path=local  -e "statement"

Zamiast:

mysql -u username -p pass -e "statement"

28
Pamiętaj, że --login-pathmusi to być najważniejsze argumenty. Próbowałem mysqldump --tables --login-path=localdostać błąd unknown variable 'login-path=local'.
Tulio

Klient linii poleceń mysql domyślnie będzie przeglądał ścieżkę logowania „klienta”. Możesz uprościć instrukcje do „instrukcji mysql -e”, wprowadzając niewielką zmianę.
Morgan Tocker,

2
Działa to dobrze, jeśli bezpośrednio wykonujemy plik powłoki, ale nie działa, jeśli zostanie wywołany z crontab
Nabeel Arshad

1
@NabeelArshad Myślę, że dzieje się tak, ponieważ w twoim crontabie nie ma ustawionego „domu” dla użytkownika (ogólnie ENV), więc w crontabie klient nie może znaleźć poprawnego ~ / .mylogin.cnf
Cristian Porta

1
@NamGVU, nie jestem pewien, jednak uważam, że to rozwiązanie przechowuje zaszyfrowane hasła.
zhekaus

209

Używam czegoś takiego jak:

mysql --defaults-extra-file=/path/to/config.cnf

lub

mysqldump --defaults-extra-file=/path/to/config.cnf 

Gdzie config.cnf zawiera:

[client]
user = whatever
password = whatever
host = whatever

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


12
Uwaga: --defaults-extra-filemusi być pierwszą opcją, w przeciwnym razie mysql narzeka mysqldump: unknown variable 'defaults-extra-file.
pevik

4
Niesamowita alternatywa dla przyjętej odpowiedzi. Zdecydowanie nie ustawiaj MYSQL_PWDzmiennej ....
DudeOnRock

1
Zdecydowanie dobra opcja dla wersji poniżej 5.6. W przeciwnym razie wybrałbym zaakceptowaną odpowiedź.
dkniffin

21
Alternatywą dla tworzenia pliku tymczasowego .cnf jest to zrobić w bash mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement". Ponieważ printfBash jest wykonywany bezpośrednio, nie pojawia się w ps.
Dave James Miller,

3
Musiałem --defaults-fileraczej użyć niż --defaults-extra-file, ponieważ ten drugi preferował ustawienia ~ / .my.cnf.
Roger Dueck,

185

Jedną z metod, która jest wygodna (ale równie niepewna), jest użycie:

MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"

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

Przechowywanie hasła w MYSQL_PWD zmiennej środowiskowej

Ta metoda określania hasła MySQL musi być uważana za wyjątkowo niepewną i nie powinna być stosowana. Niektóre wersje ps zawierają opcję wyświetlania środowiska uruchomionych procesów. W niektórych systemach, jeśli ustawisz MYSQL_PWD, twoje hasło będzie widoczne dla każdego innego użytkownika, który uruchamia ps . Nawet w systemach bez takiej wersji ps nierozsądne jest zakładanie, że nie ma innych metod, za pomocą których użytkownicy mogliby badać środowiska procesów.


6
To nie działa w moim skrypcie bash:Access denied for user 'root'@'localhost' (using password: NO)
rubo77

24
W skrypcie musisz export MYSQL_PWD=whatever.
Riot

2
Ponieważ moje zapytanie jest bardzo szybkie, wybrałem tę opcję. Potem ustawiłem to na coś fałszywego po wykonaniu zapytania.
TimH - Codidact

11
W skrypcie nie trzeba uruchamiać export, wystarczy umieścić wszystko w jednym wierszu:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
JD

1
@JD: działa dla mnie w Ubuntu 16.04 z MySQL 5.7.21.
mivk

70

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:

mysqlcommand 2>&1 | grep -v "Warning: Using a password"

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.


Jest to doskonałe rozwiązanie do stosowania w zadaniach jednowarstwowych wywoływanych w innych zadaniach, takich jak tworzenie zadania prowizji dla wdrożenia Capistrano.
JakeGould,

2
Znakomity i prosty do wyciszenia tej wiadomości, nie trzeba niczego dotykać w konfiguracji MySQL.
ajaaskel

Jak miałbym tego użyć z mysqldump, gdzie już mam przekierowanie dla SQL?
MacroMan

1
To naprawdę złe rozwiązanie w porównaniu do innych tutaj. Może się nie powieść z każdą kolejną wersją MySQL, jeśli tekst się zmieni, może też nie działać w innym języku.
yktoo

42

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.

  1. 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:

    mysql_config_editor set --login-path=local --host=localhost --user=db_user --password

    Monituje o hasło. Po wprowadzeniu użytkownik / hasło są zapisywane zaszyfrowane w twoimhome/system_username/.mylogin.cnf

    Oczywiście zmień „system_username” na swoją nazwę użytkownika na serwerze.

  2. Zmień skrypt bash z tego:

    mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz

    do tego:

    mysqldump --login-path=local my_database | gzip > db_backup.tar.gz

Nigdy więcej odsłoniętych haseł.


10

Najłatwiej jest

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null

43
Problem polega na tym, że spowoduje to również usunięcie uzasadnionych błędów w skrypcie.
man910

4
Możesz także utworzyć plik dziennika 2> /var/log/myscript.log, aby zarejestrować te błędy.
Skamasle

1
użyj, 2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."aby ukryć tylko to ostrzeżenie
Hafenkranich

10

Możesz również uruchomić mysql_config_editor w skrypcie, aby podać hasło podczas określania ścieżki logowania

expect -c "
spawn mysql_config_editor set --login-path=$mySqlUser --host=localhost --user=$mySqlUser --password
expect -nocase \"Enter password:\" {send \"$mySqlPassword\r\"; interact}
"

To rozpoczyna sesję oczekiwania, której można użyć w skryptach do interakcji z monitami

Zobacz ten post


Czy to naprawdę „>” ma tam być?
David Goodwin

yes '>' ma tam być, aby mysql_config_editor pobierał dane wejściowe ze standardowego wyjścia. To, co jest przekazywane ze standardowego wyjścia do mysql_config_editor, to hasło, które chcesz, aby ten użytkownik miał Bez
znaku

Masz na myśli operator potoku „|”, prawda? Przynajmniej w * nix i DOS „>” przechwyci STDOUT i zapisze go w pliku o nazwie „mysql_config_editor” w bieżącym katalogu roboczym.
Jay Dansand

Tak, masz rację, zredagowałem moją oryginalną odpowiedź
phylanx

7

ok, rozwiązanie bez plików tymczasowych lub czegokolwiek:

mysql --defaults-extra-file=<(echo $'[client]\npassword='"$password") -u $user -e "statement"

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<(


to nie działa, jeśli masz już .my.cnfplik ~/.z hasłem
santiago arizti

5
shell> mysql_config_editor set --login-path=local
     --host=localhost --user=localuser --password
Enter password: enter password "localpass" here
shell> mysql_config_editor set --login-path=remote
     --host=remote.example.com --user=remoteuser --password
Enter password: enter password "remotepass" here

Aby zobaczyć, co napisał mysql_config_editor do pliku .mylogin.cnf, użyj polecenia print:

shell> mysql_config_editor print --all
[local]
user = localuser
password = *****
host = localhost
[remote]
user = remoteuser
password = *****
host = remote.example.com

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:

shell> mysql --login-path=local

Aby połączyć się ze zdalnym serwerem, użyj tego polecenia:

shell> mysql --login-path=remote

Co jeśli chcę wykonać polecenie mysqldump jako użytkownik danych www? www-data nie ma katalogu domowego ... jak skonfigurować mysql_config_editor dla użytkownika www-data?
lewis4u

5

Od https://gist.github.com/nestoru/4f684f206c399894952d

# Let us consider the following typical mysql backup script:
mysqldump --routines --no-data -h $mysqlHost -P $mysqlPort -u $mysqlUser -p$mysqlPassword $database

# It succeeds but stderr will get:
# Warning: Using a password on the command line interface can be insecure.
# You can fix this with the below hack:
credentialsFile=/mysql-credentials.cnf
echo "[client]" > $credentialsFile
echo "user=$mysqlUser" >> $credentialsFile
echo "password=$mysqlPassword" >> $credentialsFile
echo "host=$mysqlHost" >> $credentialsFile
mysqldump --defaults-extra-file=$credentialsFile --routines --no-data $database

# This should not be IMO an error. It is just a 'considered best practice'
# Read more from http://thinkinginsoftware.blogspot.com/2015/10/solution-for-mysql-warning-using.html

3

Inną alternatywą jest użycie sshpass do wywołania mysql, np .:

sshpass -p topsecret mysql -u root -p username -e 'statement'

Wydaje się, że działa, ale musisz usunąć „nazwę użytkownika” z wiersza poleceń, prawda?
e2-e4

3

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.

#!/bin/sh

(
(
(
(
(
    /usr/bin/mysql "$@"
) 1>&9 
) 2>&1
) | fgrep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
) 1>&2 
) 9>&1

3
Chociaż ta odpowiedź jest nieco skomplikowana, po prostu głosowałem za nią, ponieważ tak bardzo mnie gniewa, że ​​widzę odpowiedzi, które nie są wyraźnie błędne lub są nieco niekonwencjonalne, gdy otrzymują komentarze bez komentarzy! Nic dziwnego, że David nie odpowiedział na żadne inne pytania! Wskoczył i próbował pomóc w nowatorskim rozwiązaniu i został uderzony bez wyjaśnienia, dlaczego! FU anonimowi downvoters, którzy nie zostawiają komentarzy!
Jeremy Davis,

3
+1 zgadzają się Jeremy Davis. Jest to zawiłe, ale pozostawienie go bez innej opcji może być do zaakceptowania. To zdecydowanie nie jest złe, w przeciwieństwie do wyłączania ostrzeżeń, które muszą być najgłupszym pomysłem na świecie!
Ben McIntyre

1
@JeremyDavis Tak, to było skomplikowane, głównie dlatego, że chciałem pokazać pracę. Można to zrobić bez nawiasów, ale może być mniej jasne. To była również moja pierwsza aktywność bez czytania w całej wymianie stosów ... po czym długo jej nie dotykałem. Twój komentarz został zdecydowanie doceniony.
David G.

@DavidG. - Cieszę się, że mój komentarz był dla ciebie wartościowy. Świetnie też widzieć, że wróciłeś i że twoja odpowiedź jest teraz pozytywna. Osobiście nie sądzę, aby głosowanie w dół bez komentowania powinno być dozwolone ... Jak ktokolwiek powinien się uczyć, kiedy zostajesz uderzony?
Jeremy Davis,

Powiedziawszy to, patrząc ponownie na twoją odpowiedź, nie jestem przekonany, że najlepszym rozwiązaniem jest trwałe rozwiązanie (zasadniczo owijanie mysql) tymczasowego problemu (pomijanie komunikatu o błędzie do użycia w jednym skrypcie). IMO zawijanie mysql w funkcję w skrypcie (użycie metody tutaj byłoby w porządku) jest lepszym podejściem. My 2c ... :)
Jeremy Davis,

3

Oto rozwiązanie dla Dockera w skrypcie / bin / sh:

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[klient]"> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user = root" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "hasło = $ MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump --defaults-extra-file = / root / mysql-credentials.cnf - wszystkie bazy danych'

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!


Nie jest zły. Użyłem tylko jednego połączenia ze zwrotem, np. docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'Użycie --defaults-filego już teraz uruchamia rootowanie.
Matthew Wilcoxson,

3

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


7
Unikałbym tej metody w ten sposób, ponieważ utrudniłoby to złapanie uzasadnionych błędów
Vladimir Hraban

1

Osobiście używam otoki skryptu, aby wyłapać ten błąd. Oto przykładowy kod:

#!/bin/bash

#echo $@ | cat >> /home/mysqldump.log 2>/dev/null
ERR_FILE=/tmp/tmp_mdump.err

# Execute dumper
/usr/bin/mysqldump $@ 2>$ERR_FILE

# Determine error and remove tmp file
ERROR=`cat $ERR_FILE`
rm $ERR_FILE

# Handle an error
if [ "" != "$ERROR" ]; then

        # Error occured
        if [ "Warning: Using a password on the command line interface can be insecure." != "$ERROR" ]; then
                echo $ERROR >&2
                exit 1
        fi
fi

1

W przypadku PowerShell ( pwsh, nie bash) było to dość rube-goldberg rozwiązanie ... Moja pierwsza próba polegała na zawinięciu wywołań mysqlw try/catchfunkcję, ale z powodu dziwnego zachowania w obsłudze błędów PowerShell , nie było to wykonalne.

Rozwiązaniem było przesłonić $ErrorActionPreferencetylko wystarczająco długo, aby połączyć i przechwytywanie STDERRoraz STDOUTi przetwarza na słowie ERRORi 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ć. : /

Function CallMySQL() {
    # Cache the error action preference
    $_temp = $ErrorActionPreference
    $ErrorActionPreference = "Continue"

    # Capture all output from mysql
    $output = (&mysql --user=foo --password=bar 2>&1)

    # Restore the error action preference
    $ErrorActionPreference = $_temp

    if ($output -match "ERROR") {
        throw $output
    } elseif($output) {
        "   Swallowing $output"
    } else {
        "   No output"
    }
}

Uwaga: PowerShell jest dostępny dla Uniksa, więc to rozwiązanie jest wieloplatformowe. Można go dostosować bashz 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 ERRORdowolnym miejscu wyniku, ale wystarczyło przełknąć ostrzeżenie o podstawowym wywołaniu mysqlbez bombardowania cały skrypt. Mam nadzieję, że inni uznają to za przydatne.

Byłoby miło, gdyby mysqlpo prostu dodano opcję tłumienia tego ostrzeżenia.


1

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:

if test -f "$CUSTOM_MY_LOGINS_FILE_PATH"; then
   chmod 600 $CUSTOM_MY_LOGINS_FILE_PATH
   export MYSQL_TEST_LOGIN_FILE="$CUSTOM_MY_LOGINS_FILE_PATH"
fi

...

result=$(mysql --login-path=production -NBA -D $schema -e "$query")

Gdzie MYSQL_TEST_LOGIN_FILEjest 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.


0

najlepszym rozwiązaniem jest użycie aliasu:

alias [yourapp]-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"

przykład, wstaw to do skryptu:

alias drupal-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"

następnie w skrypcie, aby załadować bazę danych:

drupal-mysql database_name < database_dump.sql

aby uruchomić instrukcję:

drupal-mysql -e "EXEC SOMESTATEMENT;"

następnie unalias alias:
Neil Davis

Do twojej wiadomości nie możesz użyć aliasu, jeśli wywołujesz mysql wewnątrz funkcji w skrypcie.
user3616725,

0

Zdefiniuj pomocnika:

remove-warning () {
    grep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
}

Użyj tego:

mysql -u $user -p$password -e "statement" 2>&1 | remove-warning

Tachaan! Twój kod jest czysty i przyjemny do odczytania

(testowane z bash)


-1

Inne rozwiązanie (na przykład ze skryptu):

 sed -i'' -e "s/password=.*\$/password=$pass/g" ~/.my.cnf
 mysql -h $host -u $user $db_name -e "$sql_cmd"

Dostępna -i''jest tutaj opcja zgodności z systemem Mac OS X. Standardowe systemy operacyjne UNIX mogą używać bezpośrednio-i


1
hasło nadal znajduje się w wierszu poleceń „sed”, więc pozostaje widoczne na listach procesów, nawet jeśli tylko na krótko.
Anthony

-1

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ę

mysql -u db_user -pInsecurePassword my_database ... | sed -e '$!d'

Nie ukryje błędu, ale upewni się, że możesz użyć wyniku zapytania w skrypcie bash.


-1

Najłatwiejszy sposób:

mysql -u root -p YOUR_DATABASE

Wpisz to, a będziesz musiał wpisać swoje hasło w.

Uwaga: Tak, bez średnika.


-3

Możesz uruchomić mySQL i ukryć ostrzeżenia i komunikaty o błędach, używając na przykład / dev / null:

# if you run just a SQL-command
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} -e "${STATEMENT}" &> /dev/null

# Or you can run SQL-script as a file
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} < ${FILEPATH} &> /dev/null

Gdzie:

${USERNAME} - existing mysql user

${PASSWORD} - password

${HOST}     - ip or hostname, for example 'localhost'

${DATABASE} - name of database

${STATEMENT}- SQL command

${FILEPATH} - Path to the SQL-script

cieszyć się!


1
Pamiętaj, że pominie WSZYSTKIE komunikaty o błędach, a nie tylko ostrzeżenia o haśle.
Simon East

-3

To działało dla mnie - właśnie dodałem 2> nullpo $(mysql_command), i pomija tylko komunikaty o błędach i ostrzeżeniach.


1
Oznacza to również, że nie dostaniesz raportu, gdy coś innego pójdzie nie tak!
Anthony

Prawdopodobnie chciałeś 2>/dev/null. Użycie 2> nullspowoduje po prostu umieszczenie danych wyjściowych w pliku o nazwie „null” w bieżącym katalogu.
thelogix
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.