Вопрос или проблема
У меня есть сервер Ubuntu с примерно 6-7 пользователями. Мы все используем программное обеспечение, которое требует регулярного обновления некоторых общих файлов и папок. Назовем эту общую директорию
/opt/science/online-data
В ней находятся файлы калибровки и данных, которые обновляются нерегулярно на внешнем публичном сервере, не принадлежащем мне. У меня есть cron-задача, которая выполняет команду rsync каждый день в 5 утра, чтобы поддерживать ее в актуальном состоянии. В повседневном использовании эта папка просто должна быть доступна для чтения всем пользователям (без записи).
Однако иногда программное обеспечение выдает ошибку, указывающую на необходимость немедленного обновления папки online-data перед использованием ПО. Я не всегда рядом как администратор, чтобы выполнить эту команду. Я хотел бы настроить систему так, чтобы любой из моих пользователей мог запустить скрипт “update_online_data.py” или подобный, и это активировало бы rsync.
Я попробовал сделать это, установив для папки online-data группу “softwaregroup” и предоставив всем пользователям членство, но пользователи сообщают о проблемах с разрешениями. Это, вероятно, ошибка, которую я могу исправить (я уверен, что это должно работать), но я думаю, есть ли более безопасный способ сделать это? На данный момент членство в группе теоретически позволяет им вмешиваться в эти файлы, а я действительно не хочу, чтобы они делали что-либо, кроме rsync. Есть ли способ создать команду, которая запускает пользователя, не требующего входа в систему, специально для этой задачи, чтобы делать это и только это? (У меня есть смутное представление, что демоны или сервисы могут быть возможностью, но у меня не так много опыта их использования в нестандартных сценариях.)
Существует множество способов сделать это, наверное, самый традиционный — создание записи в файле sudoers, которая позволяет им выполнять определенную команду от имени зарезервированного пользователя.
Более новый, но простой механизм может быть системой systemd с инициированием по пути. Для его использования пользователи создавали бы файл, например /opt/science/online-data/UPDATEME
, и это активировало бы блок службы для выполнения команды от имени зарезервированного пользователя для обновления, а затем удаления файла.
Вы создадите файл .path в /etc/systemd/system/
, например myupdate.path
, содержащий
[Unit]
Description=start myupdate.service when UPDATEME file appears
[Path]
PathExists=/opt/science/online-data/UPDATEME
[Install]
WantedBy=multi-user.target
и другой myupdate.service
, содержащий
[Unit]
Description=Update files on user request by creating file UPDATEME
[Service]
User=wantedusername
ExecStart=/bin/myupdatefilescript
ExecStartPost=rm -f /opt/science/online-data/UPDATEME
Не запускайте службу, а выполните systemctl start myupdate.path
для тестирования и включите ее для перезагрузок.
Ответ или решение
У вас есть несколько способов решения задачи, чтобы любые пользователи могли инициировать процесс синхронизации данных с общим каталогом. Это важный аспект обеспечения бесперебойной работы вашего программного обеспечения и поддержания актуальности файлов в каталоге /opt/science/online-data
. Вот шаги, которые можно предпринять для решения этой задачи:
1. Настройка доступа через Sudo
Использование конфигурации sudoers
— это традиционный и эффективный метод. Вы можете создать запись, которая предоставляет определенной группе пользователей или конкретным пользователям права на выполнение конкретной команды без необходимости вводить пароль администратора.
Пример настройки sudoers:
-
Откройте файл конфигурации
sudoers
с помощью привилегированного доступа:sudo visudo
-
Добавьте следующую строку, чтобы разрешить группе
softwaregroup
запускать ваш скриптupdate_online_data.py
от имени пользователя с правами доступа без необходимости ввода пароля:%softwaregroup ALL=(ALL) NOPASSWD: /usr/bin/python3 /оптимизация/научный/в интернете-данные/update_online_data.py
2. Использование systemd для автоматического обновления данных
Для более автоматизированного и безопасного подхода вы можете воспользоваться systemd для создания path-initiated сервиса, который сработает при создании файла-триггера пользователем.
Настройка сервисной службы с использованием Systemd:
-
Создание файла
.path
:Создайте файл
/etc/systemd/system/myupdate.path
с содержимым:[Unit] Description=start myupdate.service when UPDATEME file appears [Path] PathExists=/opt/science/online-data/UPDATEME [Install] WantedBy=multi-user.target
-
Создание файла
.service
:Создайте файл
/etc/systemd/system/myupdate.service
:[Unit] Description=Update files on user request by creating file UPDATEME [Service] User=wantedusername ExecStart=/usr/bin/python3 /opt/science/online-data/update_online_data.py ExecStartPost=/usr/bin/rm -f /opt/science/online-data/UPDATEME
-
Запуск и активация path:
Выполните команду для тестирования и активации при перезагрузке:
sudo systemctl start myupdate.path sudo systemctl enable myupdate.path
Заключение
Оба подхода эффективны, но использование systemd предоставляет более автоматизированное и безопасное решение, минимизируя риск человеческой ошибки. Это особенно важно, если вы хотите ограничить доступ пользователей только к выполнению необходимой команды без возможности манипуляции файлами вручную. Выбор подхода зависит от ваших предпочтений и требуемого уровня безопасности.