6

私は現在、svnリポジトリの最新リビジョンをWebサーバーに転送するためのbashシェルスクリプトを書いています。これは、サーバーAへのsvn exportを使用して行われ、Webサーバーとrsyncを実行します。これらの更新を実行するために、各側(サーバーAとWebサーバー)に十分なアクセス許可を持つ特別なユーザー(sync_userと呼ばれる)が作成されました。スクリプトは「susync_user」を使用してsvnexportとrsyncをsync_userとして実行します。

export -f sync_section 
su sync_user -c "sync_section $source $tmp $dest"

ここで、sync_sectionはスクリプト内の関数です。

# critical section which performs the actual website update (export & sync)
# takes 3 parameters: source, tmp, dest
function sync_section {

  source=$1
  tmp=$2
  tmp_old=$tmp"_old"
  dest=$3

  #enter critical section
  set -e

    # export to temp folder on server A
    svn export -q --force $source $tmp  --native-eol LF

    # rsync with remote live website folder.
    rsync -avzhiO $tmp $dest

    # clean up
    rm -rf $tmp_old 
    mv -f $tmp $tmp_old 

  # exit critical section
  set +e
}

Webサーバーを更新/同期する権限を持つすべてのユーザーがsync_userのパスワードを知っているため、「susync_user」セクションに入ることができます。

理論的には良さそうに聞こえますが、rsyncはこの設定に満足しておらず、次のエラーメッセージが表示されます:(user_xはスクリプトを呼び出しているユーザーです)

#### rsync output:

building file list ... rsync: pop_dir "/home/user_x" failed: Permission denied (13)
rsync error: errors selecting input/output files, dirs (code 3) at flist.c(1314) [sender=2.6.8]

いくつかのグーゲル化の後、sync_userがスクリプト呼び出し元のホームディレクトリへのフルアクセス許可を持っている必要があるため、私が抱えている問題はrsyncが原因であることがわかりました。あれは正しいですか?もしそうなら、なぜですか?回避策はありますか?

注:ユーザーのホームディレクトリは、スクリプトではまったく使用されません。サーバーAの/tmp/とWebサーバーの/var/ www /vhosts/のみが使用されます。

4

1 に答える 1

2

さて、何度か行ったり来たりした後、問題を解決することができました。これは完全にユーザー権限の問題であり、rsync 自体とは何の関係もありません。

「su sync_user ...」を実行すると、アクティブな端末は、スクリプトを呼び出すユーザー (user_x) のホーム ディレクトリを指していました。sync_user はそのフォルダーに存在することさえ許可されていないため、一部のコマンド (rsync や ls など) の実行が許可されず、エラー メッセージが表示されます。

それを修正するために、「sync_section スクリプトを実行する前に「cd ~」を追加しました。

su sync_user -c "cd ~; sync_section $source $tmp $dest"

そして、スクリプトは魅力的に機能するようになりました:)

これが将来誰かに役立つことを願っています!

于 2012-09-14T12:31:22.787 に答える