2012-09-11 32 views
6

Tôi hiện đang viết tập lệnh bash shell để chuyển bản sửa đổi mới nhất của kho svn của chúng tôi sang máy chủ web. Điều này được thực hiện bằng cách sử dụng xuất khẩu svn đến máy chủ A và rsync'ing nó với máy chủ web, một người dùng đặc biệt (gọi là sync_user) đã được tạo ra với đủ quyền trên mỗi bên (máy chủ A và máy chủ web) để thực hiện các cập nhật này. Các kịch bản sử dụng "su sync_user" để thực hiện việc xuất khẩu svn và rsync như sync_user:rsync pop_dir "/ home/user_x" không thành công: quyền bị từ chối, tại sao?

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

nơi sync_section là một chức năng trong kịch bản:

# 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 
} 

Ý tưởng là bất cứ ai có quyền truy cập đến cập nhật/đồng bộ hóa máy chủ web biết mật khẩu của sync_user, do đó có thể nhập vào phần "su sync_user".

Âm thanh tốt về mặt lý thuyết nhưng rsync là không hài lòng với thiết lập này và mang lại cho tôi thông báo lỗi sau: (user_x là người sử dụng gọi script)

#### 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] 

Sau một googeling tôi phát hiện ra rằng vấn đề tôi đang gặp phải do rsync gây ra vì nó yêu cầu sync_user có quyền truy cập đầy đủ vào thư mục chính của người gọi script. Điều đó có đúng không? và nếu vậy thì sao? và có một công việc xung quanh cho nó?

Lưu ý: Thư mục chính của người dùng không được sử dụng chút nào trong tập lệnh. Chỉ/tmp/trên máy chủ A và/var/www/vhosts/trên máy chủ web được sử dụng.

Trả lời

2

Được rồi sau một vài lần, chúng tôi đã giải quyết được vấn đề. Nó hoàn toàn là một vấn đề cho phép người dùng và không có gì để làm với rsync như vậy.

Khi chạy 'su sync_user ...' thiết bị đầu cuối hiện hoạt được trỏ đến thư mục chính của người dùng gọi tập lệnh (user_x). Vì sync_user thậm chí không được phép ở trong thư mục đó nên không được phép chạy một số lệnh (như rsync, hoặc ls), gây ra thông báo lỗi.

Để khắc phục nó tôi đã thêm một 'cd ~' trước khi chạy 'kịch bản sync_section:

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

Và kịch bản hiện đang làm việc như một nét duyên dáng :)

Tôi hy vọng điều này sẽ giúp ai đó trong tương lai !

Các vấn đề liên quan