%20%D0%BF%D1%80%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20sudo.png)
Мне нужно 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