Я пытаюсь запустить команду ssh в своем сценарии оболочки, который автоматически создаст базу данных, пользователя, пароль и т.д. На удаленном сервере:
password='date +%s|sha256sum|base64|head -c 32'
read -p "Enter staging folder name... e.g. xxxxxxxx: " stagingdirectory
echo $stagingdirectory
read -p "Give the name for the database (this will be used in mysql)" dbname
echo $dbname
read -p "Give the name of the user for the database (this will be used in mysql)" dbuser
echo $dbuser
sqlstatement="mysql -uXXXXXXX -pXXXXXXXX -hXXXXXXXX -e "
sqlstatement+='"CREATE DATABASE IF NOT EXISTS $dbname;CREATE USER $dbuser@'%' IDENTIFIED BY '$password';GRANT ALL PRIVILEGES ON $dbname.* TO $dbuser@'%';FLUSH PRIVILEGES;"'
echo $sqlstatement
ssh -A [email protected] -e "$sqlstatement"
Когда я пытаюсь запустить эту команду, я получаю эту ошибку:
Это то, что возвращается (я заменил фактические значения на XXXX):
Плохой escape-символ 'mysql -udbadmin -pXXXXX -hXXXXX -e "СОЗДАТЬ БАЗУ ДАННЫХ, ЕСЛИ НЕ СУЩЕСТВУЕТ $ dbname; СОЗДАТЬ ПОЛЬЗОВАТЕЛЬ $ dbuser @% ИДЕНТИФИЦИРОВАНО XXXXXX; ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА $ dbname. * TO $ dbuser @%;; ".
Я думаю, это связано с тем, что мой SQL-оператор и строки ускользают.
Попробуйте изменить линию,
ssh -A [email protected] -e "$sqlstatement"
в
ssh -A [email protected] "$sqlstatement"
Из руководства по ssh, см. Ниже
-e escape_char
Устанавливает escape-символ для сеансов с pty (по умолчанию: '~). Эквивалентный символ распознается только в начале строки. Управляющий символ, за которым следует точка ('.), Закрывает соединение; а затем control-Z приостанавливает соединение; и после этого сам отправляет активатора char- один раз. Установка символа в "none" отключает любые экраны и делает сеанс полностью прозрачным.
Здесь, в вашем примере, ssh не получает действительный escape-символ, и вам не нужен ни один из них