Скрипт 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'

Разве тебе не нравится это?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.