このシェル スクリプトは bash では失敗するのに、コマンドは SSH では機能するのはなぜですか?

このシェル スクリプトは bash では失敗するのに、コマンドは SSH では機能するのはなぜですか?

私が書こうとしているのは、Web サイトとそれをサポートするすべての MySQL DB をバックアップするシェル スクリプトです。ネット上で例を見つけましたが、jailed 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 サーバー上に存在するため、テスト目的で、サーバーのcdディレクトリに SSH 接続して実行しますbash backup.shmysqldump接続できず、パスワードを渡せていないようです (「パスワードの使用: NO」というエラーが返されます)。次に、tar コマンドが失敗し、「そのようなファイルまたはディレクトリはありません」というエラーで stat を実行できないことが報告されます/home/website/public_htmltarその後、以前のエラーが原因でエラー ステータスで終了すると報告されます。

ここで何が欠けているのでしょうか?

答え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セッション - jailセッション内で実行されているプロセスは、jailディレクトリ(多くの場合、ホーム)の外部を見ることができません。そのため、jailされていないセッションでは問題が発生しません。wikipedia 刑務所入所詳細については。

関連情報