2012-02-21 68 views
0

我有一個混帳以下post-commit鉤子:這可以摧毀我的整個網站嗎?

#!/bin/sh 
# Save this in: /home/qwertymk/website-live.git/hooks/post-receive 

# let's save all of out js files before the checkout 
FILES="$(find /home/qwertymk/public_html -type f -name '*.js')" 
for f in $FILES 
do 
if [[ $f =~ /home/qwertymk/ignore-dir/dev-staging-area/ ]]; then continue; fi 
    echo "copying - $f" 
    cp $f $f.jscache 
done 
# done saving js files before checkout 

export GIT_WORK_TREE=/home/qwertymk/public_html/ 
git checkout -f 

# minify each js file that changed 
cd /home/qwertymk/website-live.git 
FILES=$(git whatchanged -n 1 --pretty=format: --name-only | grep '\.js$') 
for f in $FILES 
do 
    echo "processing - $f" 
    rm /home/qwertymk/public_html/$f.jscache 
    php /home/qwertymk/jsmin/curl.php /home/qwertymk/public_html/$f 
done 
# done minifing 

# anything that has a .jscache should be moved to the .js 
FILES="$(find /home/qwertymk/public_html -type f -name '*.js')" 
for f in $FILES 
do 
if [[ $f =~ /home/qwertymk/public_html/dev-staging-area/ ]]; then continue; fi 
if [ ! -f $f.jscache ]; then continue; fi 
    echo "restoring - $f" 
    rm $f 
    mv $f.jscache $f 
done 

有什麼不對的腳本?

我可以安心使用嗎?

是否有任何角落的情況下,這個劇本可以搞砸我的網站?

+2

有什麼特別令你擔心嗎? – abresas 2012-02-21 03:20:07

+0

@abresas:事實上,我可能會意外刪除所有myjs文件 – qwertymk 2012-02-21 03:32:45

+2

看看其他文章,使用'find ... |同時讀取文件名;在S.O.上張貼這裏。它每天都會被提及。使用'FILES = $(find ...)'將在文件名中有空格或其他奇數字符時破壞,無論是通過設計還是事故。它還有助於將'rm $ f'轉換爲'printf - rm $ f'\ n「'等,這樣您就可以看到將執行的命令。當你滿意時,輸出是安全的,然後將整個腳本輸出重定向到一個shell。即'myGitThing | bash'。祝你好運。 – shellter 2012-02-21 03:55:32

回答

3

看那個在這裏S.O.使用

find ... -print0 | xargs ??? | while read filename ; do ... 

帖子其他職位它每天都會被提及。如果您的find版本支持-print0選項(表示以空字符結束的字符串輸出),那麼您已經設置好了。您需要爲xargs找到相應的參數,以表明您使用以空字符結尾的字符串進行發送。

使用FILES=$(find ...)當文件名中有空格或其他奇怪的字符時(無論是通過設計還是意外)都會中斷,因此這就是爲什麼要使用-print0(如果可以)。

爲了確保安全,請將所有破壞性代碼(如rm $f)轉換爲printf -- rm $f "\n"等,以便您可以在執行它們之前查看將執行的命令。

當您滿意輸出是安全的,然後將整個腳本輸出重定向到一個shell。即

myGitThing | bash 
1

我自己拿上looping over find resultsfeatured上的代碼審查),這是足夠安全處理任何字符,你可以把一個路徑(其相當於用於在生產服務器上移動和刪除重要文件):

while IFS= read -r -d '' -u 9 
do 
    file_path="$(readlink -fn -- "$REPLY"; echo x)" 
    file_path="${file_path%x}" 
    echo "START${file_path}END" # Literal 
    printf %q "$file_path" # Bash escaped 
done 9< <(find /home/qwertymk/public_html -type f -name '*.js' -print0) 

請參閱鏈接瞭解所有奇怪語法的解釋。