Судо створює змінну середовища "SUDO_USER", яку ви можете використовувати, щоб дізнатися користувача, який увійшов (фактично, хто керував Судо).
Якщо припустити, що ви отримаєте Sudo до root (можна використовувати Sudo для доступу до інших користувачів), ви можете написати сценарій для автоматизації наступних двох кроків.
cp source target
chown $SUDO_USER target
(Це не спрацює, якщо ви надаєте sudo користувачу, котрий не користується коренем, оскільки лише root може видавати файли.)
Автоматизувати це буде трохи роботи. Якщо джерело - це один файл, а ціль - не каталог, то ваша робота виконана. Я припускаю, що ви задали це питання, оскільки проблема є лише справжнім питанням у складніших ситуаціях, наприклад, коли ви робите щось на кшталт:
cp /path/source/some*files /path/target/directory/
Складний сценарій, щоб визначити, які файли та які каталоги передані, які раніше існували, які насправді були перезаписані, а також змінити право власності лише на успішно скопійовані файли.
Ця робота вже зроблена. Ви можете використовувати cpio
- Після sudo до root, скопіюйте файли за допомогою cpio. cpio потрібен список файлів для копіювання, так що це процес у два кроки. Нижче я використовую ls
для створення списку файлів для копіювання.
ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
В -pdm
означає «Наскрізний режим, створювати каталоги при необхідності, підтримувати час модифікації файлу»
--owner $SUDO_USER"
змушує вказаного користувача володіти файлами.
Остаточний операнд - це каталог, де cpio повинен зберігати файли.
Щоб дізнатися більше про дивовижність cpio, перейдіть на сторінку посібника CPIO тут
Це також можливо зробити в одній команді sudo. Якщо припустити, що ваш користувач має права доступу до файлів, використовуйте sudo лише для частини cpio, наприклад:
ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/
У наведеному вище випадку я використовую $ USER замість $ SUDO_USER, оскільки вона оцінюється до запуску Sudo. Крім того, якщо користувач не має доступу до списку файлів, покладіть його в сценарій обгортки і використовуйте sudo для запуску обгортки. Це може стати важче, але в найпростішому випадку обгортка бере два аргументи, джерело та ціль.
Це переходить у обгортку "cp_as_user":
ls $1 | cpio -pdm --owner $SUDO_USER $2
Потім використовуйте обгортку так:
sudo cp_as_user "/ шлях / до / деяких * файлів" / шлях / до / цільовий / каталог
sudo cat /etc/foo.txt > ~/foo.txt
. Файли, як правило, читаються лише корінцем з причини, тому пам’ятайте, що пам’ятайте про цю причину, роблячи копії для читання некористувальниками.