Если я это сделаю sudo cp /etc/foo.txt ~/foo.txt
, новый файл будет создан root
как владелец.
Прямо сейчас я не вижу другого способа, кроме как использовать последние две команды ( ls
для пояснения варианта использования):
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: $_
Я бы предпочел:
- Делать это в одной
sudo
команде. - Не нужно указывать моего текущего пользователя (может быть, с помощью переменной?).
sudo cat /etc/foo.txt > ~/foo.txt
, Файлы, как правило, доступны для чтения только пользователю root, поэтому не забывайте об этом, когда копируемые файлы могут читать пользователи без полномочий root.Ответы:
Используйте
install
вместоcp
:источник
install
. Спасибо.sudo install -o "$USER" /etc/foo.txt ~/foo.txt
С POSIX-совместимыми
cp
вы можете ,sudo cp -p foo bar
чтобы сохранить следующие метаданные файлов при копировании:Если вы хотите установить другого пользователя, лучше всего подойдет решение JennyD .
источник
sudo
копировать файл, который вам не принадлежит. Вам просто нужен доступ для чтения , в конце концов.Если вы делаете:
Затем
~/foo.txt
будет открыт оболочкой, как вы (так создано с вашими учетными данными), а затемsudo
будет выполнен с перенаправленным на него stdout.В конце концов, файл будет принадлежать вам.
Такой подход также помогает ограничить то, что делается
root
. Здесь онroot
использует только свою привилегию для открытия/etc/foo.txt
, он не делает то, что потенциально опасно (откройте файл для записи, который может иметь плохие последствия, если, например,~/foo.txt
была символическая ссылка).источник
Используя
sudo
, вы переключаетесь на другого пользователя. В этом весь смысл команды. Я предполагаю, что у вас нет регулярного доступа к первому файлу, поэтому вам нужно быть другим пользователем (root
в данном случае), чтобы получить доступ.Там нет никакого способа для
sudo
себя управлять этим, поскольку всеsudo
делает переходит вас к другому пользователю , чтобы выполнить команду.Вам нужно будет
sudo
.источник
Sudo создает переменную среды "SUDO_USER", которую вы можете использовать, чтобы узнать, кто вошел в систему (на самом деле, кто запускал Sudo).
Предполагая, что вы используете Sudo для получения root-прав (можно использовать Sudo для доступа и к другим пользователям), вы можете написать скрипт для автоматизации следующих двух шагов.
(Это не будет работать, если вы 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
источник