проблемы с привилегиями при попытке запустить команду статуса пассажира из скрипта rubyscript

Я написал плагин collectd на ruby, который должен проверять статус пассажиров и сообщать различные показатели. Когда я тестирую свой скрипт на сервере, все работает хорошо, но когда я пытаюсь запустить свой скрипт через collectd, он завершается со следующим сообщением.

«ОШИБКА: у вас нет прав на запрос статуса этого экземпляра Phusion Passenger. Повторите попытку с помощью sudo».

Затем я изменил свой ruby-скрипт, чтобы использовать команду sudo для статуса пассажира, что привело к

«плагин exec: exec_read_one: error = sudo: извините, для запуска sudo у вас должен быть tty»

Затем я попытался заставить collectd запустить скрипт от имени пользователя root, но получил следующее

«Плагин для выполнения: трусливый отказ запускать программу от имени пользователя root».

Я не уверен, что еще я могу попробовать. команда, которая не работает при использовании пользователем, отличным от root, passenger-status

Вот сценарий

#!/usr/bin/env ruby требуется 'getoptlong'

# The name of the collectd plugin, something like apache, memory, mysql, interface, ... PLUGIN_NAME = 'статус пассажира'

использование def puts("#{$0} -h [-i ]") exit end

# Main begin # Синхронизировать stdout, чтобы он правильно сбрасывался в collectd. $stdout.sync = истина

# Разобрать параметры командной строки hostname = nil sample_interval = 20 # sec, значение по умолчанию opts = GetoptLong.new( [ '--hostid', '-h', GetoptLong::REQUIRED_ARGUMENT], [ '--sampling-interval', ' -i', GetoptLong::OPTIONAL_ARGUMENT ] ) opts.each do |opt, arg| case opt when '--hostid' hostname = arg when '--sampling-interval' sample_interval = arg.to_i end end use if !hostname

# Цикл сбора пока true do start_run = Time.now.to_i next_run = start_run + sample_interval

# collectd data and print the values
data = `passenger-status`
max = data.match(/max (.*)/).to_s.split.last
count = data.match(/count (.*)/).to_s.split.last
active = data.match(/active (.*)/).to_s.split.last
inactive = data.match(/inactive (.*)/).to_s.split.last
waiting = data.match(/Waiting on global queue: ([\d]+)/).to_s.split.last
puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-max_allowed_connections #{start_run}:#{max}")
puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-thread_count #{start_run}:#{count}")
puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-threads_active #{start_run}:#{active}")
puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-threads_inactive #{start_run}:#{inactive}")
puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-waiting_in_queue #{start_run}:#{waiting}")

# sleep to make the interval
while((time_left = (next_run - Time.now.to_i)) > 0) do
  sleep(time_left)
end

конец конец


person SJP    schedule 18.04.2012    source источник
comment
Можете ли вы показать нам код, который вы пробовали? Это поможет.   -  person Jwosty    schedule 18.04.2012
comment
Я добавил весь скрипт в свой OP   -  person SJP    schedule 18.04.2012


Ответы (1)


Заглянув в файл phusion_passenger/admin_tools/server_instance.rb, я смог определить, какой файл использовался пассажиром, чтобы определить, сможет ли пользователь запустить команду статуса пассажира или нет.

filename = "#{@generation_path}/passenger-status-password.txt" password = File.open(filename, "rb") do |f| f.read end rescue Errno::EACCES raise RoleDeniedError

файл, который он пытался прочитать, был passenger-status-password.txt, этот файл находится в каталоге /tmp/passenger.1.0.19198/generation-1/ для Passenger версии 3.0.9 в CentOS 5.7. Я изменил файл на 644, и это решило проблему. это решение также применимо, если кто-то хочет запустить команду «пассажирский статус» без sudo.

person SJP    schedule 18.04.2012