2011-07-08 5 views
5

PHPアプリケーション用の簡単なデプロイメントスクリプトを作成しようとしています。私はこの仕事のためのいくつかのツール(Capistrano、Phingなど)があることを知っていますが、彼らは私の単純な配備ルーチンのための多くの仕事のように思えます。SSHを使用しているときに引用符をエスケープする

私はsshpassを使用して、パスワードの繰り返し入力を避けます。しかし、圧縮されたインストーラをアップロードした後、私はサーバにsshしていくつかのコマンドを実行する必要があります。そのうちの1つはsedです。だから、引用符が私のスクリプトを壊している。

 
sshpass -p foo ssh [email protected] " 
    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上でそれらを使用する必要があります。それはこのようなものです。

ご意見をいただければ幸いです。ありがとう!

答えて

6

内部引用符をエスケープするのは通常の方法です。これは機能しませんか?

sshpass -p foo ssh [email protected] " 
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 

" 
+0

はい!これは完璧に機能します!ありがとう! – fedeisas

2

ヒアドキュメントを代わりに使用することができます?:

sshpass -p foo ssh [email protected] <<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 
+0

また、この文書の中で変数展開をしたくない場合は '<<" DATA "を使用してください – sehe

+2

これは動作しますが、警告がスローされます。 stdinは端末ではないため疑似端末は割り当てられません。 – fedeisas

関連する問題