我正在嘗試編寫一個 shell 腳本,用於備份網站和所有支援它的 MySQL 資料庫。我在網路上找到了一些範例,但是當我在被監禁的 SSH 會話中在 bash 中運行腳本時,它失敗了。如果我直接在 SSH 會話中輸入命令,它們就可以正常工作。
#!/bin/sh
DB1="first_db"
THEDATE=$(date +"%Y-%m-%d")
THEUSER=user
THEDBPW=password
mysqldump -u $THEDBUSER -p$THEDBPW $DB1 > dbbackup_$DB1_$THEDATE.sql
tar -czf sitebackup_website_$THEDATE.tar /home/website/public_html
gzip sitebackup_website_$THEDATE.tar
該腳本位於 Web 伺服器上,因此出於測試目的,我透過 SSH 進入伺服器、cd
進入目錄,然後執行bash backup.sh
. mysqldump
未連接,似乎無法傳遞密碼(它返回錯誤報告“使用密碼:否”)。然後 tar 命令失敗,報告它無法統計/home/website/public_html
「沒有這樣的檔案或目錄」。 tar
然後報告由於之前的錯誤,它正在退出並顯示錯誤狀態。
我在這裡缺少什麼?
答案1
透過登入伺服器並執行來檢查腳本的 Windows 行結尾
cat -v /path/to/script
如果該行以 結尾^M
,那就是問題所在。
您可以透過運行來修復帶有斷行結尾的文件
dos2unix /path/to/script
如果伺服器上不存在 dos2unix,您可以使用 sed,如下所示:
sed -i 's/\r$//' /path/to/script
答案2
您已將使用者名稱指派給變量THEUSER
,但您的mysqldump
命令正在使用該變數THEDBUSER
。
答案3
tardir=$PWD ; cd /home/website/public_html &&
tar -czf "$tardir"/sitebackup_complete-office_"$THEDATE.tar"
要不就:
tar -C/home/website/public_html -czf \
sitebackup_complete-office_"$THEDATE.tar"
一般來說,許多人tars
將無法使用絕對路徑,除非明確指示這樣做。
預設情況下,GNU tar 在輸入或輸出上刪除前導
/
,並抱怨檔案名稱包含元件..
。此選項會關閉此行為。
命令完全有可能ssh's
根據命令傳遞和引用來預先解析路徑。這與路徑名中變數的擴展有關。
答案4
如果我正確理解你對問題的描述,關鍵的區別似乎是入獄SSH 會話 - 在被監禁的會話中運行的進程無法看到其監獄目錄(通常是其主目錄)之外的內容。這就是為什麼您在非監禁會話中不會遇到問題的原因。你也可以看看維基百科 監獄入口更多細節。