Có cách nào để bảo sudo đặt tên người dùng của tôi làm chủ sở hữu cho các tệp được tạo thay vì root không?


19

Nếu tôi làm một sudo cp /etc/foo.txt ~/foo.txt, tập tin mới được tạo với roottư cách là chủ sở hữu.

Ngay bây giờ, tôi thấy không có cách nào khác ngoài việc sử dụng hai lệnh cuối cùng ( lsđể làm rõ trường hợp sử dụng):

belmin@server1$ ls /etc/foo.txt
>  -rw------- 1 root root 3848 Mar  6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_

Tôi thích:

  1. Làm điều đó trong một sudolệnh.
  2. Không phải chỉ định người dùng hiện tại của tôi (có thể sử dụng một biến?).

sudo cat /etc/foo.txt > ~/foo.txt. Các tệp có xu hướng chỉ có thể đọc được bằng root vì một lý do, vì vậy hãy nhớ ghi nhớ lý do đó khi tạo bản sao có thể đọc được bởi người dùng không root.
jw013

Câu trả lời:



14

Với POSIX tương thíchcp bạn có thể sudo cp -p foo barđể duy trì các siêu dữ liệu tập tin sau khi sao chép:

  • Thời gian truy cập
  • Thời gian sửa đổi
  • Tên người dùng
  • Id nhóm
  • Chế độ

Nếu bạn muốn đặt một người dùng khác , giải pháp của JennyD là tốt nhất.


2
Điều đó chỉ hoạt động khi tập tin gốc được sở hữu bởi người dùng mục tiêu.
Jenny D

4
Tôi cho rằng người đang chạy sudo không sở hữu tệp gốc, nếu không họ sẽ không cần sử dụng sudo.
EightBitTony

@EightBitTony Bạn không cần sudophải sao chép tệp bạn không sở hữu. Bạn chỉ cần truy cập đọc , sau khi tất cả.
l0b0

Có, gõ nhầm vào phần của tôi - nhưng tôi cho rằng ID người dùng trong câu hỏi cũng không thể đọc tệp, vì họ vẫn không cần sudo. Vì vậy, chúng tôi phải giả sử ID người dùng dự định sở hữu tệp cuối cùng không có quyền truy cập vào tệp gốc. Dù bằng cách nào, đây không phải là một "vấn đề". Câu trả lời của bạn đề nghị duy trì chủ sở hữu mà chúng tôi phải cho là không mong muốn.
EightBitTony

2
Về mặt lý thuyết, có thể tệp được sở hữu bởi người dùng đích nhưng nằm trong thư mục mà người dùng đích không được phép nhập. Nhưng nó không có khả năng lắm :-)
Jenny D

8

Nếu bạn làm:

sudo cat /etc/foo.txt > ~/foo.txt

Sau đó, ~/foo.txtsẽ được mở bằng shell khi bạn (được tạo bằng thông tin đăng nhập của bạn) và sau đó sudosẽ được thực thi với thiết bị xuất chuẩn của nó được chuyển hướng đến đó.

Cuối cùng, tập tin sẽ thuộc sở hữu của bạn.

Cách tiếp cận đó cũng giúp hạn chế những điều được thực hiện bởi root. Ở đây, rootchỉ sử dụng đặc quyền của mình để mở/etc/foo.txt , nó không làm điều có khả năng gây hại (mở tệp để viết, có thể gây hậu quả xấu nếu ~/foo.txtlà một liên kết tượng trưng).


2
Điều này giả sử người dùng có thể ghi vào thư mục đích.
Johan

3

Sử dụng sudo, bạn chuyển sang người dùng khác. Đó là toàn bộ quan điểm của lệnh. Tôi giả sử bạn không có quyền truy cập thường xuyên vào tệp đầu tiên, vì vậy bạn cần phải là người dùng khác ( roottrong trường hợp này) để có quyền truy cập.

Không có cách nào cho sudo tự quản lý điều đó, vì tất cả sudođang làm là chuyển bạn sang người dùng khác để thực thi lệnh.

Bạn sẽ cần đến

  1. tiếp tục sử dụng hai lệnh (hoặc một lệnh ghép)
  2. tìm một lệnh khác (chẳng hạn như cài đặt, thấy trong câu trả lời khác)
  3. hoặc viết một tập lệnh và thực thi tập lệnh đó thông qua sudo.

1

Sudo tạo một biến môi trường "SUDO_USER" mà bạn có thể sử dụng để tìm ra người dùng đã đăng nhập (thực sự là người đã chạy Sudo).

Giả sử bạn Sudo để root (có thể sử dụng Sudo để truy cập người dùng khác), bạn có thể viết một tập lệnh để tự động hóa hai bước sau.

cp source target
chown $SUDO_USER target

(Điều này sẽ không hoạt động nếu bạn sudo cho người dùng không phải root vì chỉ root mới có thể cho đi các tệp.)

Tự động hóa nó sẽ là một chút công việc. Nếu nguồn là một tệp duy nhất và đích không phải là một thư mục, thì công việc của bạn đã hoàn thành. Tôi giả sử rằng bạn đã đặt câu hỏi vì vấn đề chỉ là vấn đề thực sự trong các tình huống phức tạp hơn, ví dụ như khi làm một việc như:

cp /path/source/some*files /path/target/directory/

Một tập lệnh phức tạp để tìm ra những tập tin nào và những thư mục nào được thông qua, những tập tin nào đã tồn tại trước, những tập tin nào thực sự bị ghi đè và để thay đổi quyền sở hữu chỉ những tập tin được sao chép thành công.

Công việc này đã được thực hiện. Bạn có thể sử dụng cpio- Sau khi sudo để root, sử dụng cpio để sao chép các tệp. cpio cần một danh sách các tập tin để sao chép để nó là một quá trình gồm hai bước. Dưới đây tôi sử dụng lsđể tạo danh sách các tập tin để sao chép.

ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/

-pdmnghĩa là "Chế độ vượt qua, Tạo thư mục khi cần, Duy trì thời gian sửa đổi tệp"

--owner $SUDO_USER" khiến người dùng được chỉ định sở hữu các tệp.

Toán hạng cuối cùng là thư mục nơi cpio phải lưu trữ các tệp.

Để tìm hiểu thêm về sự tuyệt vời của cpio, hãy truy cập trang hướng dẫn CPIO tại đây

Làm điều này trong một lệnh sudo duy nhất cũng có thể. Giả sử rằng người dùng của bạn có quyền truy cập các tệp, chỉ sử dụng sudo cho phần cpio, như thế này:

ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/

Trong trường hợp trên, tôi đang sử dụng $ USER thay vì $ SUDO_USER vì nó được đánh giá trước khi Sudo chạy. Ngoài ra, nếu người dùng không có quyền truy cập để liệt kê các tệp, hãy đặt nó vào tập lệnh bao bọc và sử dụng sudo để chạy trình bao bọc. Điều này có thể trở nên khó khăn hơn, nhưng trong trường hợp đơn giản nhất Trình bao bọc có hai đối số, một nguồn và một mục tiêu.

Điều này đi vào trình bao bọc "cp_as_user":

ls $1 | cpio -pdm --owner $SUDO_USER $2

Sau đó sử dụng trình bao bọc như thế này:

sudo cp_as_user "/ path / to / some * files" / path / to / target / thư mục

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.