Создание файлов и каталогов с определенным владельцем (пользователь / группа) во время sudoing

22

Мне нужно wgetчто-то (приводит к сжатому файлу в cwd), затем я должен извлечь его, затем выполнить некоторые операции копирования / перемещения / модификации и, возможно, наконец выполнить скрипт (из загруженного архива).

Теперь все эти задачи либо напрямую ( wgetизвлечение и т. Д.), Либо косвенно (запуск сценария) приводят к созданию файлов и каталогов (все в текущем рабочем каталоге). Я делаю все это как root(без способа сделать это с конечным, желаемым пользователем).

Проблема в том, что все, что создано в процессе, принадлежит пользователю root или пользователю sudo. Когда я закончу (а иногда и на полпути), я должен выполнить серию команд chmodи chownкоманд, чтобы все исправить.

Теперь было бы неплохо, если бы можно было как-то сказать системе: «С этого момента любые файлы или каталоги, которые вы создаете, когда я запускаю команды от имени root, вы будете создавать с такими-то правами владения и правами».

Ашкан Х. Назарий
источник

Ответы:

26

Вы всегда можете, sudo -u username touch filenameкогда ваш скрипт выполняется как root. Обычно это не требует пароля, в зависимости от вашей sudoersконфигурации.

Как вариант, беги su username -c touch filename. Дополнительные аргументы передаются в оболочку пользователя, а -cопция оболочки выполняет указанные команды по соглашению.


Некоторые команды (например mkdir) поддерживают аргументы для указания разрешений:

mkdir -m 0700 foo

По умолчанию файловые операции учитывают umaskнабор для оболочки. Он определяет, какие разрешения запрещены . umaskИз 0022, например , делает не устанавливает разрешения на запись для группы и других. Установите, чтобы 0077запретить группе и другим пользователям получать какие-либо разрешения.


Вы можете настроить setgidкаталоги on так, чтобы все созданные файлы наследовали членство в их группах:

chmod g+s someDir

Некоторые Unix поддерживают такое же поведение для setuid( chmod u+s), но не для Linux.

Даниэль Бек
источник
1
Я думаю, можно с уверенностью предположить, что нет специальной поддержки для того, что вы просите. Только суперпользователь может chownотправлять файлы другому пользователю, и установка значения по умолчанию может привести к ошибкам пользователя, предоставляя разрешения другим пользователям без rootпонимания пользователя.
Даниэль Бек
10

Есть другой способ, довольно элегантный, я думаю. Использование install (1)

Например, zabbix-agentd нужна подпапка внутри / var / run, но последние дистрибутивы используют tmpfs для / var / run, поэтому каталог не перезагружается. Я решил это, создав файл / etc / sysconfig / zabbix-agentd, содержащий:

install -g zabbix -o zabbix -d /var/run/zabbix
Анджело Туретта
источник
1
Добавьте также, -m 0700например. Ответ.
Кольцо Ø
3
Обратите внимание, что installсоздает каталог, а затем меняет владельца / группу. Таким образом, существует короткое время, когда каталог не имеет указанного владельца / группы. В некоторых контекстах это может иметь значение.
user368507
Это работает на Alpine Linux
Маурисио Санчес
3

В Unix-подобных системах вновь созданные файлы и каталоги принадлежат владельцу процесса, который их создал. Стандартные утилиты обычно не имеют возможности сменить владельца созданных файлов.

Переменные с UID и GID исходного пользователя

Если вы запускаете несколько команд несколько раз, вы можете использовать переменные $SUDO_UIDи $SUDO_GIDссылаться на пользователя, который вызвал sudo:

sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"

Получение списка созданных файлов и каталогов автоматически

Если вы хотите получить список созданных (и, возможно, измененных) файлов и каталогов автоматически, вы можете запускать команды под straceнаблюдением, основанным на ptrace()системном вызове:

strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something

или вы можете использовать, например, Installwatch, который основан на LD_PRELOADмеханизме.

Идеи для дальнейшей работы

На основе методов, упомянутых выше, можно создать инструмент, который будет автоматически менять владельца и, возможно, права доступа к созданным / измененным файлам. Использование может быть так просто, как:

sudo watch-chown do_something
pabouk
источник