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?

Saahib
źródło

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.
AB
źródło
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?

meuh
źródło