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/
Có -pdm
nghĩ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
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.