Sudo создает переменную среды "SUDO_USER", которую вы можете использовать, чтобы узнать, кто вошел в систему (на самом деле, кто запускал Sudo).
Предполагая, что вы используете Sudo для получения root-прав (можно использовать Sudo для доступа и к другим пользователям), вы можете написать скрипт для автоматизации следующих двух шагов.
cp source target
chown $SUDO_USER target
(Это не будет работать, если вы sudo для пользователя без полномочий root, так как только 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 awesomeness, перейдите на страницу руководства 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 "/ path / to / some * files" / path / to / target / directory
sudo cat /etc/foo.txt > ~/foo.txt
, Файлы, как правило, доступны для чтения только пользователю root, поэтому не забывайте об этом, когда копируемые файлы могут читать пользователи без полномочий root.