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?

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.

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?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.