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





Вы можете использовать BackgrounDRb. Его цель - разгрузить задачи из приложений rails, и вы можете запустить сервер под другим пользователем.
Даже будучи чрезмерным, это самый простой способ создать задания для другого пользователя в приложении rails. Это не основная цель плагина, но он выполнит свою работу чисто и красиво.
Один человек предложил использовать что-то вроде 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
Это отличная информация, но я не уверен, что она решит мою проблему. Эти задачи непродолжительны и не требуют обоснования. Также запуск отдельного сервера только для обработки переименования хоста - это немного излишне.