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.