Как лучше всего выполнять системные задачи из Ruby on Rails?

Я создаю небольшое веб-приложение для системного администрирования (думаю, Web-Min, но в RoR), и мне нужно иметь доступ к системным параметрам из моего кода Ruby. Например, я хочу разрешить пользователю изменять имя хоста, часовой пояс или сетевую конфигурацию сервера.

Я сейчас думаю о том, чтобы создать отдельный сценарий setuid (Perl, Ruby, ??), чтобы я мог вызывать его из моего кода RoR, и он будет выполнять действия. Это довольно громоздко и не очень элегантно. Я новичок в Ruby и хотел бы знать, есть ли лучший способ добиться этого.

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
816
4

Ответы 4

Вы можете использовать BackgrounDRb. Его цель - разгрузить задачи из приложений rails, и вы можете запустить сервер под другим пользователем.

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

Richard Hurt 04.11.2008 15:07

Даже будучи чрезмерным, это самый простой способ создать задания для другого пользователя в приложении rails. Это не основная цель плагина, но он выполнит свою работу чисто и красиво.

changelog 04.11.2008 16:30

Один человек предложил использовать что-то вроде result = %x[uptime] и указал мне на этот очень полезный пост в блоге. Я думаю, что это работоспособно, объединив какой-то сценарий оболочки, который вызывается с помощью sudo и имеет соответствующие разрешения в sudoers.

Была серия эпизодов Рельсы, посвященных фоновым задачам.

Возможно, наиболее подходящим для вашей проблемы является "Рейк в фоновом режиме", который может быть хорошей отправной точкой? Как следует из названия, он охватывает запуск рейк-задач из Ruby on Rails.

Наиболее очевидным решением для изменения системных настроек будет запуск демона с правами root, который принимает несколько (очень ограниченных и строго очищенных) входных данных, таких как новое имя хоста или новый IP-адрес для сервера. Другой эпизоды "Скворец и Ворлинг" и «Пользовательский демон» тоже могут помочь в этом.

Более чистым решением было бы использовать sudo. Я могу придумать два (похожих) способа сделать это:

Разрешить sudo доступ к определенным командам (например, hostname, ifconfig) пользователю, который будет запускать задачи rake. Это может иметь большие проблемы с безопасностью. Мой любимый пример - разрешение sudo доступа к vim, что кажется безобидным, пока вы не запустите sudo vim, затем !bash и вдруг у вас появится полный root-доступ к машине через текстовый редактор ...

Другой способ (который проще сделать безопасным) - иметь задачу rake (или несколько отдельных скриптов), которая выполняет необходимые задачи (например, изменение имени хоста). Скажем, /usr/bin/myapp_systemtasks принадлежит root:root, а затем разрешите sudo доступ к этому сценарию. Убедитесь, что вы очень осторожны, чтобы очистить ввод, который принимает сценарий (чтобы предотвратить такие вещи, как экранирование оболочки).

Итак, есть способы сделать это, но, в конце концов, вы создаете веб-интерфейс для конфигураций на уровне системы, что очень сложно сделать безопасно .. Что бы вы ни решили сделать, убедитесь, что он хорошо протестирован ( вами и другими)

Я выполнял аналогичные задачи с Скворец, который на самом деле является просто сервером очередей. Он очень прост в использовании, и вы можете легко запускать рабочие потоки под другим пользователем.

Одним из преимуществ Starling является то, что он ведет журнал очереди, поэтому в случае возникновения проблем он может воссоздать очередь.

require 'starling'
starling = Starling.new('127.0.0.1:22122')
starling.set('my_queue', 12345)

Тогда ваш воркер может просто удалить из очереди любые задачи:

require 'starling'
loop do
  starling.get('my_queue') # this will block until something gets added to the queue
  # do stuff
end

Другие вопросы по теме