나는 이미 여기에서 많은 질문을 읽었지만 어쨌든 아무것도 효과가 없습니다. 원격 컴퓨터에서 데이터베이스를 덤프하는 암호를 보내야하는 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'
당신은 단지 그것을 사랑하지 않습니까?