Bash-Skript und Escapezeichen im Passwort

10

Ich habe viele Fragen gelesen, die hier bereits gestellt wurden, aber irgendwie funktioniert nichts für mich. Ich habe ein Bash-Skript, in dem ich ein Passwort senden muss, das die Datenbank auf einem Remotecomputer ausgibt.

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

Nun hat dieses Passwort alle möglichen Sonderzeichen: #8111*@uu(

Wenn ich den obigen Befehl direkt in soll ausführen und das Passwort in einfachen Anführungszeichen verwenden, funktioniert es: dh.

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

Ohne einfache Anführungszeichen erhalte ich am Ende einen Fehler mit dem '('.

Ich habe auch versucht, Zeichen im Passwort wie folgt zu umgehen:

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

Dann wird der Fehler "Zugriff verweigert" angezeigt.

Ich habe auch versucht, "Quelle" zu verwenden, dh. Speichern des Passworts in einer anderen Datei als:

Datei pass.cre

MYPASSWORD='#8111*@uu('

Fügen Sie dann diese Datei in das Bash-Skript ein:

!/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

Es scheint $ MYPASSWORD aus der Datei zu lesen, dann wieder Fehler eines ungültigen Zeichens.

Irgendwelche Ratschläge, was mir fehlt?

Saahib
quelle

Antworten:

8

Verwenden Sie doppelte Anführungszeichen zweimal, maskiert und nicht maskiert: -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'

Oder eine andere Version

/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"

Beispiele

% 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
quelle
Danke @meuh und AB, es macht auf jeden Fall Sinn und ich habe es getestet, es funktioniert. Danke Jungs, dass ihr mich in die richtige Richtung gelenkt habt.
Saahib
Es scheint ein kleines Problem zu geben, ich habe ein Passwort wie dieses: io#bc@14@9$#jf7AZlk99 Für Remote funktioniert es nicht, dh. /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" Ich habe versucht zu fliehen, wie hier vorgeschlagen, dh. Denken Sie daran, dass es zweimal ausgeführt wurde, aber ich denke, wenn Sie einen Befehl über SSH an den Remote-Server senden, scheinen sich die Dinge kaum zu ändern.
Saahib
Verwenden Sie/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 siehe meine Bearbeitung meiner Antwort, da Sie ein Problem haben $#und durchgehend einfache Anführungszeichen benötigen.
Meuh
3

Das Problem ist, dass Ihre Zeichenfolge zweimal interpretiert wird, einmal von der lokalen Shell und erneut von der Remote-Shell, die sshfür Sie ausgeführt wird. Sie müssen also zweimal zitieren und dabei eines der folgenden Elemente verwenden:

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

Bearbeiten: Wenn Sie ""den gesamten Befehl in doppelte Anführungszeichen setzen, treten Probleme mit den darin enthaltenen Kennwörtern auf $. Sie müssen den Befehl in einfache Anführungszeichen setzen, um dies zu vermeiden. Sie müssen den -pWert jedoch immer noch in einfache Anführungszeichen setzen , da er zweimal interpretiert wird. Sie benötigen also einfache Anführungszeichen in einfachen Anführungszeichen.

Verwenden Sie dazu ein einfaches Anführungszeichen ( \') wie in diesem Beispiel:

'I don'\''t like java'

wird Ihnen die Zeichenfolge geben I don't like java. So wird Ihr Beispiel in doppelten Anführungszeichen zum einfachen Anführungszeichen:

/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'

Liebst du es nicht einfach?

meuh
quelle