Есть ли способ указать 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

Ответы:



14

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

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

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


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.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.