비밀번호에서 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

이스케이프 처리되지 않은 큰 따옴표를 두 번 사용하십시오. -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에게 감사드립니다. 확실히 말이되고 테스트를 해보았습니다. 나를 올바른 방향으로 안내해 주셔서 감사합니다.
Saahib

약간의 문제가있는 것 같습니다. 암호는 다음과 같습니다. 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" 나는 여기에 제안 된대로 탈출하려고했습니다. 두 번 실행되었지만 SSH를 통해 원격 서버로 명령을 보낼 때 상황이 거의 변하지 않는다고 생각합니다.
Saahib

사용/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는 문제가 $#있고 전체적으로 작은 따옴표가 필요 하므로 내 답변에 대한 편집 내용을 봅니다 .
meuh

3

문제는 문자열이 로컬 쉘에 의해 두 번 해석되고 다시 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'

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.