2011-07-08 65 views
5

我正在嘗試爲我的PHP應用程序構建一個簡單的部署腳本。我知道這項工作有幾種工具(Capistrano,Phing等),但對於我的簡單部署例程來說,它們看起來很多工作。使用SSH時轉義引號

我使用sshpass來避免一遍又一遍地輸入我的密碼。但是在上傳我的壓縮安裝程序後,我需要ssh進入服務器並運行一些命令。其中之一是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