gpt4 book ai didi

ruby - 尝试从 ruby​​ 脚本中运行乘客状态命令时的权限问题

转载 作者:行者123 更新时间:2023-12-04 19:32:31 31 4
gpt4 key购买 nike

我在 ruby​​ 中编写了一个 collectd 插件,用于检查乘客状态并报告各种指标。当我测试我的脚本时一切正常,但是当我尝试通过 collectd 运行我的脚本时,它会失败并显示以下消息。

"ERROR: You are not authorized to query the status for this Phusion Passenger instance. Please try again with 'sudo'."



然后我更改了我的 ruby​​ 脚本以使用 sudo 命令来获取乘客状态,这导致

"exec plugin: exec_read_one: error = sudo: sorry, you must have a tty to run sudo"



然后我尝试让 collectd 以 root 身份运行脚本,但我得到了以下

"exec plugin: Cowardly refusing to exec program as root."



我不确定我还能尝试什么。由 root 以外的用户使用时失败的命令是 passenger-status
这是脚本

#!/usr/bin/env ruby require 'getoptlong'

# The name of the collectd plugin, something like apache, memory, mysql, interface, ... PLUGIN_NAME = 'passenger-status'

def usage puts("#{$0} -h [-i ]") exit end

# Main begin # Sync stdout so that it will flush to collectd properly. $stdout.sync = true

# Parse command line options hostname = nil sampling_interval = 20 # sec, Default value 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' sampling_interval = arg.to_i end end usage if !hostname

# Collection loop while true do start_run = Time.now.to_i next_run = start_run + sampling_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

end end

最佳答案

调查 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/ CentOS 5.7 上乘客版本 3.0.9 的目录。我将文件修改为 644,这解决了这个问题。如果有人想在没有 sudo 的情况下运行乘客状态命令,此解决方案也适用。

关于ruby - 尝试从 ruby​​ 脚本中运行乘客状态命令时的权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10200946/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com