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

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

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

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

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

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

решение1

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

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


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

mkdir -m 0700 foo

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


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

chmod g+s someDir

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

решение2

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

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

install -g zabbix -o zabbix -d /var/run/zabbix

решение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

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

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

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

sudo watch-chown do_something

Связанный контент