ユーティリティタスクを実行するには、cronではなくメインフレームベースのスケジューラを使用する必要があります。このスケジューラーは、ホスト上のエージェントと通信します。エージェントは、必要な引数とともに実行するユーティリティを引数として取る一般的なsetuidkshスクリプトを実行します。次に、setuid kshスクリプトは、その引数を使用して別のスクリプトを呼び出します。
私の場合、次のスクリプト(execute_something.ksh
)は、いくつかの環境変数cd
sを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ユーザーではなく、引き続き機能しますPATH
。LD_LIBRARY_PATH
私には地球環境で物事を変更する権限がありません-私はリクエストを入れて待つ必要があります。モジュールの実行方法を変更する方法はありません。
誰かお願いします-私にいくつかのアイデアを教えてください?これは多くの人に当てはまるとは思いませんが、面白いパズルではありませんか?
TIA。
カリルダ