태그 보관물: bash

bash

비밀번호에서 Bash 스크립트 및 이스케이프 특수 문자 mysqldump -u db_user -p’#8111*@uu(‘ my_database |

나는 이미 여기에서 많은 질문을 읽었지만 어쨌든 아무것도 효과가 없습니다. 원격 컴퓨터에서 데이터베이스를 덤프하는 암호를 보내야하는 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를 읽은 다음 유효하지 않은 문자 오류가 다시 나타납니다.

내가 누락 된 조언이 있습니까?



답변

이스케이프 처리되지 않은 큰 따옴표를 두 번 사용하십시오. -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.


답변

문제는 문자열이 로컬 쉘에 의해 두 번 해석되고 다시 ssh실행중인 원격 쉘에 의해 해석된다는 것입니다. 따라서 다음 중 하나를 사용하여 두 번 인용해야합니다.

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

편집 :"" 전체 명령
을 큰 따옴표로 묶으 려면을 포함하는 암호에 문제가 있습니다 $. 이를 피하려면 명령을 작은 따옴표로 묶어야합니다. 그러나 -p두 번 해석 되므로 값 을 작은 따옴표로 묶어야합니다 . 따라서 작은 따옴표 안에 작은 따옴표가 필요합니다.

이 예에서와 같이 작은 따옴표 ( \')를 사용하여 수행됩니다 .

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

당신은 단지 그것을 사랑하지 않습니까?


답변