Я читал много вопросов, уже заданных здесь, однако, почему-то ничего не работает для меня. У меня есть сценарий 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 из файла, затем снова ошибка недопустимого символа.
Любой совет, что мне не хватает?
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 на удаленный сервер, вещи, кажется, мало изменились./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
работает для вас. Так что вам нужно дважды цитировать, используя любой из этих:Изменить: Если вы собираетесь заключить в кавычки
""
всю команду, у вас будут проблемы с паролями, содержащими$
. Вам нужно заключить команду в одинарные кавычки, чтобы избежать этого. Но вам все еще нужно заключить в кавычки-p
значение, поскольку оно интерпретируется дважды. Так что вам нужны одинарные кавычки внутри одинарных кавычек.Это делается с помощью одинарной кавычки (
\'
), как в этом примере:даст вам строку
I don't like java
. Таким образом, ваш пример в двойных кавычках становится одинарным:Разве тебе не нравится это?
источник