sửa đổi quyền sở hữu tập tin cho các tập tin trong kho lưu trữ tar


10

Tôi đang làm việc với tư cách là người dùng và tôi muốn tạo một kho lưu trữ tar, khi được giải nén (bằng root) sẽ trích xuất các tệp của nó với quyền sở hữu gốc (nếu không thì root sẽ phải thay đổi quyền sở hữu theo cách thủ công cho mỗi tệp, sau khi các tệp được giải nén đến đích của nó).

Tôi đã tìm thấy fakerootdường như để làm chính xác điều đó. Nhưng tôi không thể tìm thấy cú pháp mà tôi cần sử dụng để tạo kho lưu trữ của mình.

Làm cách nào tôi có thể tạo tệp lưu trữ tar.xz để các tệp có quyền sở hữu gốc khi được giải nén bằng root?

do something with fakeroot ...
tar cfpJ foo.tar.xz foo/

Câu trả lời:


12

Làm cách nào tôi có thể tạo tệp lưu trữ tar.xz để các tệp có quyền sở hữu gốc khi được giải nén bằng root?

Đó là tùy thuộc vào người đã giải nén:

tar --no-same-owner -xf ...

Nếu bạn muốn bắt đầu tất cả root, bạn có thể sử dụng

tar --owner=root --group=root -cf ...

điều đó không hiệu quả với tôi: gây tar --owner=root --group=root cfpJ files.tar.xz files/ra lỗi cho tôi tar: You must specify one of the -Acdtrux 'hoặc --test-label' options Try tar --help' hoặctar --usage' for more information.
user1968963

Bạn cần một chuỗi -trước tùy chọn ngắn của bạn: tar --owner=root --group=root -cfpJ ...Tức là -cfpJkhông cfpJ.
goldilocks

tar --owner=root --group=root -cfpJ files.tar.xz files/cho tôi một lỗi khác: tar: files.tar.xz: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errorsvà hơn nữa, nó tạo ra một tệp có tên pJ.
dùng1968963

3
Được chứ. Tôi luôn đặt fcuối cùng (vì nó có ý nghĩa hơn, bằng trực giác) và thấp và kìa, tôi nhận được thất bại tương tự với các tác phẩm -cfpJNHƯNG -cpJf.
goldilocks

@ user1968963: f phải luôn ở ngay trước tên tệp, vì nó có nghĩa là "tham số tiếp theo là tên tệp". Nếu bạn không đặt nó ngay trước tên tệp, tar sẽ nghĩ tên tệp là "", và sau đó nó sẽ cố mở tệp "", dĩ nhiên nó không thể thống kê được.
Olivier Dulac

8

Fakeroot

Các fakeroot tiện ích, hoặc các tiện ích mới hơn fakeroot-ng (cùng mục đích, kỹ thuật thực hiện khác nhau) chạy một chương trình và giả vờ chương trình là nó đang chạy như là người chủ và hệ thống mà các cuộc gọi như chownđã thành công. Chỉ có chương trình tin rằng các cuộc gọi này đã thành công, không có gì thực sự được phản ánh trong hệ thống tập tin (không thể kể từ khifakeroot nó không có đặc quyền bổ sung). Tuy nhiên, nếu chương trình thay đổi quyền sở hữu của một tệp và sau đó thực hiện một số hành động dựa trên quyền sở hữu của tệp đó, điều này có thể thay đổi hành vi của chương trình.

Một cách điển hình để có được công việc hữu ích từ fakeroot bằng cách chạy một môi trường fakeroot trong đó xảy ra những điều sau đây:

  1. Tạo một số tệp, di chuyển chúng xung quanh, thay đổi quyền sở hữu và chế độ, v.v.
  2. Tạo một kho lưu trữ của các tập tin này.

Thí dụ:

fakeroot sh -c '
    chown root:root usr/bin/foo
    tar cf foo.tar usr
'

Bạn cần sử dụng một lệnh gọi duy nhất fakeroot , vì không có bộ nhớ giữa các lần gọi.

Không gian tên Linux

Để hoàn thiện, tôi sẽ đề cập rằng nếu bạn có nhân Linux ≥3.8, thì không gian tên là một cách khác để tạo môi trường gốc giả. Hỗ trợ người dùng chưa hoàn toàn ở đó nên tôi sẽ không đi sâu vào chi tiết.

Gắn kết kho lưu trữ

Một cách khác để giải quyết vấn đề của bạn là gắn kết kho lưu trữ dưới dạng thư mục. Bạn có thể sử dụng archivemount , có khả năng sửa đổi một số định dạng lưu trữ thông qua libarchive , bao gồm cả tar nén.

mkdir mnt
archivemount foo.tar.xz mnt
chown root:root mnt/usr/bin/foo
fusermount -u mnt

Thủ thuật hay archivemount, nhưng nó vẫn đòi hỏi độ cao đặc quyền và ngay cả khi người dùng ở trong một nhóm đáng tin cậy được phép gắn kết và ngắt kết nối, quá trình không thành công chown, do đó, fakerootcần sử dụng một số công cụ của bên thứ ba hoặc không gian tên , quá.
Anton Samsonov
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.