Skrypt Bash i specjalne znaki w haśle


10

Czytałem już wiele pytań tutaj zadanych, jednak jakoś nic mi nie działa. Mam skrypt bash, w którym muszę wysłać hasło, które zrzuca bazę danych na zdalnym komputerze, więc wygląda to tak:

!/bin/sh
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p#8111*@uu( my_database |  gzip -c >  my_database.sql.gz

Chodzi o to, że to hasło ma wiele znaków specjalnych: #8111*@uu(

Jeśli uruchomię powyższą komendę bezpośrednio w powinienem użyć hasła w pojedynczych cudzysłowach, to zadziała: tj.

/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p'#8111*@uu(' my_database |  gzip -c >  my_database.sql.gz

Bez pojedynczych cytatów pojawia się błąd oznaczający „(” na końcu.

Próbowałem także uciec od znaków w haśle:

!/bin/sh
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p'\#8111\*\@uu(' my_database |  gzip -c >  my_database.sql.gz

Następnie daje błąd odmowy dostępu.

Próbowałem także użyć „źródła”, tj. zapisywanie hasła w innym pliku jako:

Plik pass.cre

MYPASSWORD='#8111*@uu('

Następnie dołączając ten plik do skryptu bash:

!/bin/sh
source pass.cre
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p$MYPASSWORD my_database |  gzip -c >  my_database.sql.gz

Wygląda na to, że odczytuje $ MYPASSWORD z pliku, a następnie błąd nieprawidłowego znaku.

Jakaś rada, której mi brakuje?

Odpowiedzi:


8

Użyj podwójnych cudzysłowów dwa razy, znak ucieczki i nie znak ucieczki: -p"\"$MYPASSWORD\""

#!/bin/sh
source pass.cre
/usr/bin/ssh -p 91899 user@remoteHost 'mysqldump -u db_user -p"\"$MYPASSWORD\"" my_database |  gzip -c >  my_database.sql.gz'

Lub inna wersja

/usr/bin/ssh -p 91899 user@remoteHost "mysqldump -u db_user -p\"'io#bc@14@9$#jf7AZlk99'\" my_database | gzip -c > my_database.sql.gz"

Przykłady

% source pass.cre
% ssh user@host mysqldump -u root -p$MYPASSWORD    
user@host's password: 
zsh:1: bad pattern: -p#8111*@uu(

% source pass.cre
% ssh user@host mysqldump -u root -p"$MYPASSWORD"   
user@host's password: 
zsh:1: bad pattern: -p#8111*@uu(

% source pass.cre
% ssh user@host mysqldump -u root -p"\"$MYPASSWORD\""
user@host's password: 
Warning: Using a password on the command line interface can be insecure.

Dzięki @meuh i AB, to z pewnością ma sens i przetestowałem to, działa. Dzięki chłopaki za wskazanie mi właściwego kierunku.
— Saahib

Wygląda na to, że jest mały problem, mam takie hasło: io#bc@14@9$#jf7AZlk99 W przypadku zdalnego nie działa, tzn. /usr/bin/ssh -p 91899 user@remoteHost "mysqldump -u db_user -p'io#bc@14@9$#jf7AZlk99' my_database | gzip -c > my_database.sql.gz" Próbowałem uciec, jak tu sugerowano, tj. pamiętając, że został on wykonany dwukrotnie, ale myślę, że wysyłając polecenie za pośrednictwem SSH do zdalnego serwera, wydaje się, że niewiele się zmieniło.
— Saahib

Użyj/usr/bin/ssh -p 91899 user@remoteHost "mysqldump -u db_user -p\"'io#bc@14@9$#jf7AZlk99'\" my_database | gzip -c > my_database.sql.gz"
— AB

@ Rick_IRS zobacz moją edycję mojej odpowiedzi, ponieważ masz problem $#i potrzebujesz pojedynczych cudzysłowów przez cały czas.
— Meuh

3

Problem polega na tym, że Twój ciąg znaków jest interpretowany dwukrotnie, raz przez lokalną powłokę i ponownie przez sshuruchomioną dla ciebie zdalną powłokę . Musisz więc zacytować dwa razy, używając jednego z tych:

-p\''#8111*@uu('\'
-p"'#8111*@uu('"

Edycja: Jeśli zamierzasz zacytować ""całe polecenie, będziesz mieć problemy z zawartością haseł $. Aby tego uniknąć, musisz zacytować polecenie pojedynczo. Ale nadal musisz podać pojedynczy cudzysłów, -pponieważ jest on interpretowany dwukrotnie. Potrzebujesz więc pojedynczych cudzysłowów w pojedynczych cudzysłowach.

Odbywa się to za pomocą pojedynczego cudzysłowu ( \'), jak w tym przykładzie:

'I don'\''t like java'

da ci sznurek I don't like java. Tak więc podwójnie cytowany przykład staje się pojedynczym:

/usr/bin/ssh -p 91899 user@remoteHost 'mysqldump -u db_user -p'\''io#bc@14@9$#jf7AZlk99'\''my_database | gzip -c > my_database.sql.gz'

Nie lubisz tego?

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.