2010-03-08 77 views
3

定期地,我喜歡將文件放在我的web服務器的/ tmp目錄中以便共享。令人討厭的是,我必須在每次scp文件時設置權限。繼從another question的意見,我已經寫了一個腳本,將文件複製過來,將權限設置,然後打印的網址:在bash中使用帶有scp和chmod空格的文件名

#!/bin/bash 

scp "$1" SERVER:"/var/www/tmp/$1" 
ssh SERVER chmod 644 "/var/www/tmp/$1" 
echo "URL is: http://SERVER/tmp/$1" 

當我與我的實際主機更換服務器,一切正常......直到我用包含空格的參數執行腳本。雖然我懷疑這個解決方案可能是使用$ @,但我還沒有弄清楚如何獲得間隔文件名。

回答

4

事實證明,我們需要的是逃跑的路徑,其將被髮送到遠程服務器。 Bash認爲SERVER中的引號:「/ var/www/tmp/$ 1」與$ 1相關,並將它們從最終輸出中移除。如果我嘗試運行:

tmp-scp.sh Screen\ shot\ 2010-02-18\ at\ 9.38.35\ AM.png 

相呼應,我們看到它正試圖執行:

scp SERVER:/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png 

相反,如果引號逃脫文字然後scp命令看起來更像是你所期望的:

scp SERVER:"/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png" 

由於增加了一些代碼,截斷最後的字跡變得路徑:

#!/bin/bash 

# strip path 
filename=${1##*/} 
fullpath="$1" 

scp "$fullpath" SERVER:\"/var/www/tmp/"$filename"\" 
echo SERVER:\"/var/www/tmp/"$filename"\" 
ssh SERVER chmod 644 \"/var/www/tmp/"$filename"\" 
echo "URL is: http://SERVER/tmp/$filename" 
0

該腳本看起來不錯。我的猜測是,你需要引用的文件名,當你將它傳遞到你的腳本:

scp-chmod.sh "filename with spaces" 

或逃生的空間:

scp-chmod.sh filename\ with\ spaces 
-5

更簡單的方法是不用擔心文件名中的空格,(除了引用之外)是重命名文件以在轉移之前清除空格。或者當您創建文件時,請勿使用空格。無論何時您命名文件,您都可以將其設置爲「最佳實踐」。