Экранирование кавычек при использовании SSH

Я пытаюсь создать простой сценарий развертывания для своих приложений PHP. Я знаю, что для этой работы есть несколько инструментов (Capistrano, Phing и т. д.), но они кажутся слишком большими для моей простой процедуры развертывания.

Я использую sshpass, чтобы не вводить пароль снова и снова. Но после загрузки моего сжатого установщика мне нужно подключиться к серверу по ssh и выполнить некоторые команды. Один из которых sed. Итак, цитаты ломают мой сценарий. Это что-то вроде этого:

sshpass -p foo ssh user@host "
   cd /www/htdocs/foo/bar 
   echo 'Untar and remove installer'
   tar -zxf install.tar.gz

   sed "s/define('ENVIRONMENT', 'development');/define('ENVIRONMENT', 'production');" index.php > tmp && mv tmp index.php
   sed "s/define('ENVIRONMENT', 'development');/define('ENVIRONMENT', 'production');/" admin/index.php > tmp && mv tmp admin/index.php

"

Как видите, я использую двойные кавычки для начала своих операторов SSH, но мне также нужно использовать их в sed.

Любые предложения будут ценны. Спасибо!


person fedeisas    schedule 08.07.2011    source источник


Ответы (2)


Экранирование внутренних кавычек — нормальный способ. Это не работает?

sshpass -p foo ssh user@host "
cd /www/htdocs/foo/bar
echo 'Untar and remove installer'
tar -zxf install.tar.gz

sed \"s/define('ENVIRONMENT', 'development');/define('ENVIRONMENT', 'production');\" index.php > tmp && mv tmp index.php
sed \"s/define('ENVIRONMENT', 'development');/define('ENVIRONMENT', 'production');/\" admin/index.php > tmp && mv tmp admin/index.php

"
person Flimzy    schedule 08.07.2011

Можно ли вместо этого использовать здесь-документ?:

sshpass -p foo ssh user@host <<DATA
   cd /www/htdocs/foo/bar 
   echo 'Untar and remove installer'
   tar -zxf install.tar.gz

   sed "s/define('ENVIRONMENT', 'development');/define('ENVIRONMENT', 'production');" index.php > tmp && mv tmp index.php
   sed "s/define('ENVIRONMENT', 'development');/define('ENVIRONMENT', 'production');/" admin/index.php > tmp && mv tmp admin/index.php
DATA
person wallyk    schedule 08.07.2011
comment
также используйте <<"DATA", если вы не хотите, чтобы переменная раскрывалась внутри документа здесь - person sehe; 08.07.2011
comment
Это работает, но выдает предупреждение: псевдотерминал не будет выделен, потому что стандартный ввод не является терминалом. - person fedeisas; 08.07.2011