1

ユーティリティタスクを実行するには、cronではなくメインフレームベースのスケジューラを使用する必要があります。このスケジューラーは、ホスト上のエージェントと通信します。エージェントは、必要な引数とともに実行するユーティリティを引数として取る一般的なsetuidkshスクリプトを実行します。次に、setuid kshスクリプトは、その引数を使用して別のスクリプトを呼び出します。

私の場合、次のスクリプト(execute_something.ksh)は、いくつかの環境変数cdsをRailsルートに設定しrails runner Module.function -e <environment>、environmentが渡される引数である場合に実行します。

だから〜だ:

mainframe -> agent -> setuid_script -> execute_something.ksh -> Module.function

私が直接呼び出すexecute_something.kshと、私自身のように、それはうまく機能します。setuidスクリプトを呼び出すと、次のエラーが発生します。

/ [path] / bin / rails:15:in `force_encoding':不明なエンコーディング名-BINARY(ArgumentError)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)

これは私として機能します。のホームディレクトリサンドボックスへのすべての参照を明示的に削除しました。これは、setuidユーザーではなく、引き続き機能しますPATHLD_LIBRARY_PATH

私には地球環境で物事を変更する権限がありません-私はリクエストを入れて待つ必要があります。モジュールの実行方法を変更する方法はありません。

誰かお願いします-私にいくつかのアイデアを教えてください?これは多くの人に当てはまるとは思いませんが、面白いパズルではありませんか?

TIA。

カリルダ

4

1 に答える 1

0

railsコマンドの目的は、スクリプト/ railsが存在する場合はそれを呼び出すことであるため、そのスクリプトを直接呼び出すことができます。

./script/rails runner Module.function -e <environment> 
于 2012-06-07T01:43:34.683 に答える