Tránh các lỗi từ tar không khôi phục quyền truy cập thư mục


13

Tôi quan sát hành vi sau với cả tar 1.26 và 1.27.1:

$ mkdir a b a/diffowner
$ sudo mkdir b/diffowner
$ sudo chmod a+w b/diffowner
$ echo foo > a/diffowner/foo
$ tar -C a -cvf test.tar diffowner
diffowner/
diffowner/foo
$ tar -C b -xvf test.tar diffowner
diffowner/
diffowner/foo
tar: diffowner: Cannot utime: Operation not permitted
tar: diffowner: Cannot change mode to rwxr-xr-x: Operation not permitted
tar: Exiting with failure status due to previous errors

Vì vậy, những gì tôi đang cố gắng làm ở đây là trích xuất một tập tin tar vào cấu trúc thư mục hiện có, nơi tôi không phải là chủ sở hữu của tất cả các thư mục có liên quan nhưng tôi có quyền ghi vào tất cả chúng. Trong thực tế, chúng được chia sẻ giữa một nhóm.

Tôi không quan tâm đến dấu thời gian và tôi tin rằng các quyền đã được chính xác. Tôi đang chạy nó như một người dùng bình thường vì vậy nó không nên cố gắng --preserve-permissionstrừ khi được nói như vậy, điều mà tôi đã không làm. Điều thực sự làm tôi lo lắng là trạng thái thoát: Tôi dự định sử dụng điều này trong một tập lệnh và muốn biết liệu trích xuất thực tế có hoạt động tốt hay không.

Có một tùy chọn để tar bảo nó không đặt quyền thư mục, không ngay lập tức cũng không bị trì hoãn? Không có điều đó, những giải pháp khác bạn sẽ đề nghị. Ngay bây giờ tôi đang suy nghĩ về việc trích xuất vào một thư mục tạm thời và sử dụng rsyncđể di chuyển công cụ vào cây hiện có. Nhưng có lẽ bạn biết một cách tiếp cận ít hackish hơn.


1
Tự hỏi nếu có một cách để làm điều này tại thời điểm tạo tar trái ngược với trích xuất ..?
Roy Truelove

Câu trả lời:


22

tarTùy chọn này có thể là những gì bạn đang tìm kiếm:

 --no-overwrite-dir
       preserve metadata of existing directories

Tôi đã thử nghiệm như sau:

$ mkdir a b a/diffowner
$ sudo mkdir b/diffowner
$ sudo chmod a+w b/diffowner
$ echo foo > a/diffowner/foo
$ tar -C a -cvf test.tar diffowner
diffowner/
diffowner/foo
$ tar -C b --no-overwrite-dir -xvf test.tar diffowner
diffowner/
diffowner/foo
$ echo $?
0

1
Cũng làm việc cho trường hợp của tôi, trong đó tôi trích xuất một kho lưu trữ tar vào một chia sẻ Samba được gắn kết. Lưu ý rằng không giống như lệnh gợi ý, nó cũng loại bỏ lỗi khi đích trống (tức là tất cả các thư mục sẽ báo lỗi được tạo bởi chính tar). Cảm ơn một lần nữa!
dùng149408
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.