Ruby on rails rails 3.2.1 rails runner在solaris 10上执行setuid脚本时失败
我们需要使用基于大型机的调度器而不是cron来执行实用程序任务。此计划程序与主机上的代理进行通信,然后主机执行一个通用setuid ksh脚本,该脚本将实用程序作为参数与所需的任何参数一起执行。然后,setuid ksh脚本使用其参数调用另一个脚本 在我的例子中,下一个脚本execute_something.ksh设置一些环境变量,将cd设置为Rails根目录,并执行Rails runner Module.function-e,其中environment是传递的参数 这就是:Ruby on rails rails 3.2.1 rails runner在solaris 10上执行setuid脚本时失败,ruby-on-rails,ruby,solaris-10,Ruby On Rails,Ruby,Solaris 10,我们需要使用基于大型机的调度器而不是cron来执行实用程序任务。此计划程序与主机上的代理进行通信,然后主机执行一个通用setuid ksh脚本,该脚本将实用程序作为参数与所需的任何参数一起执行。然后,setuid ksh脚本使用其参数调用另一个脚本 在我的例子中,下一个脚本execute_something.ksh设置一些环境变量,将cd设置为Rails根目录,并执行Rails runner Module.function-e,其中environment是传递的参数 这就是: mainframe
mainframe -> agent -> setuid_script -> execute_something.ksh -> Module.function
当我像我自己一样直接调用execute_something.ksh时,它工作得很好。调用setuid脚本时,出现以下错误:
/[path]/bin/rails:15:in'force_encoding':未知编码名称-二进制参数错误
from/[path]/bin/rails:15:in main
这不是权限问题。所有涉及的文件要么归setuid用户所有,要么具有setgid组的完全组权限,并且属于该组。是的,杀伤力太大了,但这就是我得到的
setuid脚本继承我的环境,但setuid用户有一个EUID
另外,正在执行的rails脚本与安装在我的linux笔记本电脑上的脚本不同,我提到这是solaris问题
rails脚本是:
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'railties' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/
version = $1
ARGV.shift
end
end
gem 'railties', version
load Gem.bin_path('railties', 'rails', version)
这和我一样有效。我在PATH和LD_LIBRARY_PATH中明确删除了对我的主目录沙盒的所有引用-它仍然适用于我,而不适用于setuid用户
我没有在全局环境中更改内容的权限-我必须输入请求并等待。无法更改模块必须执行的方式
请某人-给我一些想法?我不认为这适用于很多人,但这不是一个有趣的难题吗
蒂亚
Carildarails命令的目的是调用script/rails(如果存在),因此您可以直接调用该脚本:
./script/rails runner Module.function -e <environment>
谢谢你,但当我试着这么做时,我得到了以下信息:./script/rails:4:in expand_path::不安全的操作-expand_path SecurityError from./script/rails:4:in“你使用的是什么版本的Ruby修补程序?还有,$SAFE在你的应用程序中的值是多少?Ruby 1.9.3p125;在rails控制台中,$SAFE显示0。在应用程序本身和我使用rails runner时,情况是否相同?谢谢,应该是的。听起来你有一些错误的权限。我问Ruby的版本,因为不久前有一个相关的bug。