私が書こうとしているのは、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.sh
。 mysqldump
接続できず、パスワードを渡せていないようです (「パスワードの使用: NO」というエラーが返されます)。次に、tar コマンドが失敗し、「そのようなファイルまたはディレクトリはありません」というエラーで stat を実行できないことが報告されます/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セッション - jailセッション内で実行されているプロセスは、jailディレクトリ(多くの場合、ホーム)の外部を見ることができません。そのため、jailされていないセッションでは問題が発生しません。wikipedia 刑務所入所詳細については。