Bashスクリプトとパスワードの特殊文字のエスケープ


10

私はすでにここで尋ねられた多くの質問を読んでいますが、どういうわけか私のために何も働いていません。リモートマシンのデータベースをダンプするパスワードを送信する必要があるbashスクリプトがあるので、次のようにします。

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

さて、このパスワードにはあらゆる種類の特殊文字が含まれています。 #8111*@uu(

上記のコマンドを単一引用符で囲んだパスワードを使用して直接実行すると、次のように機能します。

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

単一引用符がないと、最後の '('でエラーが発生します。

私もこのようにパスワードの文字をエスケープしようとしました:

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

次に、アクセス拒否エラーが発生します。

私も「ソース」を使用しようとしました。パスワードを別のファイルに保存:

ファイルpass.cre

MYPASSWORD='#8111*@uu('

次に、そのファイルを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

ファイルから$ MYPASSWORDを読み取っているようですが、再び無効な文字のエラーが発生します。

何かアドバイスはありませんか?

回答:


8

二重引用符を2回使用し、エスケープしてエスケープしない: -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'

または他のバージョン

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

% 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.

@meuhとABに感謝します。それは確かに理にかなっており、私はそれをテストしました。正しい方向に向けてくれてありがとう。
サーヒブ

少し問題があるようですが、私は次のようなパスワードを持っていますio#bc@14@9$#jf7AZlk99 。リモートの場合、機能しません。 /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" ここに提案されているように私は脱出しようとしました。2回実行されたことに注意してください。ただし、リモートサーバーにSSH経由でコマンドを送信すると、状況はほとんど変わっていないように見えます。
Saahib 2015

使用/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は、私の問題に対する私の編集を参照してください$#
15

3

問題は、文字列が2回解釈されることです。1回目はローカルシェル、2回目sshは実行中のリモートシェルです。したがって、次のいずれかを使用して、2回引用する必要があります。

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

編集:""コマンド全体 を二重引用符で囲む場合、を含むパスワードで問題が発生します$。これを回避するには、コマンドを単一引用符で囲む必要があります。ただし、-p値は2回解釈されるため、値を一重引用符で囲む必要があります。したがって、単一引用符の中に単一引用符が必要です。

これは、次の例のように、一重引用符\')を使用して行われます。

'I don'\''t like java'

あなたに文字列を与えますI don't like java。したがって、二重引用符で囲まれた例は、単一引用符で囲まれます。

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

あなたはそれが好きではないですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.