Есть ли способ указать sudo установить мое имя пользователя в качестве владельца для файлов, созданных вместо root?

19

Если я это сделаю 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: $_

Я бы предпочел:

  1. Делать это в одной sudoкоманде.
  2. Не нужно указывать моего текущего пользователя (может быть, с помощью переменной?).
Бельмин Фернандес
источник
sudo cat /etc/foo.txt > ~/foo.txt, Файлы, как правило, доступны для чтения только пользователю root, поэтому не забывайте об этом, когда копируемые файлы могут читать пользователи без полномочий root.
jw013

Ответы:

32

Используйте installвместо cp:

sudo install -o belmin /etc/foo.txt ~/foo.txt
Дженни Д
источник
Не знал о install. Спасибо.
Бельмин Фернандес
4
@BelminFernandez: Для того, чтобы удовлетворить ваши вторые предпочтения:sudo install -o "$USER" /etc/foo.txt ~/foo.txt
Приостановлено до дальнейшего уведомления.
14

С POSIX-совместимымиcp вы можете , sudo cp -p foo barчтобы сохранить следующие метаданные файлов при копировании:

  • Время доступа
  • Время модификации
  • ID пользователя
  • ID группы
  • Режим

Если вы хотите установить другого пользователя, лучше всего подойдет решение JennyD .

l0b0
источник
2
Это работает только тогда, когда исходный файл принадлежит целевому пользователю.
Дженни Д
4
Я полагаю, что человеку, работающему с sudo, не принадлежит оригинальный файл, иначе ему не понадобится использовать sudo.
EightBitTony
@EightBitTony Вам не нужно sudoкопировать файл, который вам не принадлежит. Вам просто нужен доступ для чтения , в конце концов.
10
Да, опечатка с моей стороны - но я предполагаю, что рассматриваемый идентификатор пользователя также не может прочитать файл, потому что ему все равно не понадобится sudo. Таким образом, мы должны предположить, что у идентификатора пользователя, которому принадлежит конечный файл, нет доступа к исходному файлу. В любом случае, это не проблема sudo. Ваш ответ предполагает сохранение владельца, который, как мы предполагаем, нежелателен.
EightBitTony
2
Теоретически возможно, что файл принадлежит целевому пользователю, но находится в каталоге, к которому у целевого пользователя нет прав доступа. Но это не очень вероятно :-)
Дженни Д
8

Если вы делаете:

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

Затем ~/foo.txtбудет открыт оболочкой, как вы (так создано с вашими учетными данными), а затем sudoбудет выполнен с перенаправленным на него stdout.

В конце концов, файл будет принадлежать вам.

Такой подход также помогает ограничить то, что делается root. Здесь он rootиспользует только свою привилегию для открытия /etc/foo.txt, он не делает то, что потенциально опасно (откройте файл для записи, который может иметь плохие последствия, если, например, ~/foo.txtбыла символическая ссылка).

Стефан Шазелас
источник
2
Это предполагает, что пользователь может писать в целевой каталог.
Йохан
3

Используя sudo, вы переключаетесь на другого пользователя. В этом весь смысл команды. Я предполагаю, что у вас нет регулярного доступа к первому файлу, поэтому вам нужно быть другим пользователем ( rootв данном случае), чтобы получить доступ.

Там нет никакого способа для sudoсебя управлять этим, поскольку все sudoделает переходит вас к другому пользователю , чтобы выполнить команду.

Вам нужно будет

  1. продолжайте использовать две команды (или одну составную команду)
  2. найти другую команду (например, установить, видно в другом ответе)
  3. или написать сценарий и выполнить этот сценарий через sudo.
EightBitTony
источник
1

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

Johan
источник