20

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

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

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

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

3 ответа3

22

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

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


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

mkdir -m 0700 foo

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


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

chmod g+s someDir

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

7

Есть другой способ, довольно элегантный, я думаю. Использование 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

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

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

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

sudo watch-chown do_something

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .