Я пишу сценарий удара для выполнения ежедневно резервное копирование. Этот сценарий будет в конечном счете работать автоматически каждое утро (крон или systemd).
То, что я хотел бы выполнить,
Сценарий удара, который я создал, выглядит примерно так:
# Stop myservice
systemctl stop myservice.service
# Do all the backing up here...
# Start myservice
systemctl start myservice.service
Проблема, которую я имею, - то, что, когда я запускаю этот скрипт, он требует, чтобы мой пароль во время systemctl остановился/начал вызовы. Если это должно работать автоматически, очевидно, паролю не может требоваться каждого раза. Как я запускаю этот скрипт автоматически, не требуя этого пароля?
Ubuntu 18.04
Спасибо!
У Вас есть несколько возможностей, в зависимости от Ваших потребностей и предпочтений.
… должен был бы запустить целый скрипт как пользователя root
путем добавления его к root
crontab
(использование sudo crontab -e
). Этому не будет нужен никакой пароль затем когда systemctl stop/start myservice.service
выполняется. Оборотная сторона - то, что Вы, возможно, должны работать, резервные задачи как другой пользователь (сказать noslenkwah
) и должны переключиться на того другого пользователя для резервного копирования. Пример:
# Stop myservice
systemctl stop myservice.service
# Do all the backing up here...
# ... and run the backup_command as user "otheruser":
sudo -u noslenkwah /path/to/backup_command --with --some --options
# Start myservice
systemctl start myservice.service
… должен был бы добавить systemctl
команды в файл в /etc/sudoers.d
каталог так, чтобы определенный пользователь мог выполнить их, не предоставляя пароль.
проблема sudo visudo -f /etc/sudoers.d/noslenkwah
(Имя файла, noslenkwah
не имеет значения, это - просто персональная моя привычка назвать файлы в честь "основного" пользователя затронутыми настройками в том файле. Это просто должен быть файл ниже каталога /etc/sudoers.d
.)
Добавьте следующие строки и сохраните файл.
Cmnd_Alias MYSERVICE = \
/bin/systemctl stop myservice.service, \
/bin/systemctl start myservice.service
noslenkwah ALL = (root) NOPASSWD: MYSERVICE
Это позволяет пользователю noslenkwah
работать sudo systemctl stop myservice.service
и sudo systemctl start myservice.service
без пароля. Это определяет так называемый псевдоним команды (набор команд) названный MYSERVICE
и затем позволяет
noslenkwah
ALL
компьютерыroot
MYSERVICE
Замена noslenkwah
и myservice
с фактическим именем пользователя и сервисным названием. Обратите внимание, что действительно необходимо выйти sudo systemctl start myservice.service
чтобы это работало (нет sudo systemctl start myservice
(без .service
, например).
Не заботьтесь о "на ALL
компьютеры" часть. Это релевантно, только если Вы намереваетесь распределить тот же самый sudoers
файл к нескольким компьютерам.
Вы затем изменили бы свой резервный сценарий на
# Stop myservice
sudo systemctl stop myservice.service
# Do all the backing up here...
/path/to/backup_command --with --some --options
# Start myservice
sudo systemctl start myservice.service
и имейте выполненный как пользователь noslenkwah
.
Выполните этот сценарий оболочки как корень.
Например, поместите его в корень crontab: sudo crontab -e