為什麼這個 shell 腳本在 bash 中失敗,但指令在 SSH 中有效?

為什麼這個 shell 腳本在 bash 中失敗,但指令在 SSH 中有效?

我正在嘗試編寫一個 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 會話 - 在被監禁的會話中運行的進程無法看到其監獄目錄(通常是其主目錄)之外的內容。這就是為什麼您在非監禁會話中不會遇到問題的原因。你也可以看看維基百科 監獄入口更多細節。

相關內容