interp

ReferenceTOPKeywords

コマンド名

interp - Tclインタープリタを作成、操作します。

構文

interp option ?arg arg ... ?

解説

本コマンドは1つ以上の新しいインタープリタを作成します。作成されたインタープリタは、 同じアプリケーション内に作成されているインタープリタと共存します。 最初に作成されていたインタープリタはmaster (マスタ)と呼ばれ、新しいインタープリタはslave(スレーブ)と呼ばれます。マスタは複数のスレーブを作成でき、各スレーブも自身がマスターとなってスレーブを作成できます。従ってインタープリタは階層的になります 。

各インタープリタは他のインタープリタから独立しており、コマンド、プロシージャ、グローバル変数は独立して存在しています。しかしalias と呼ばれるメカニズムを用いて、マスタとスレーブとの間の接続関係を作成することもできます。別名コマンドを作成することにより、マスタおよび他のスレーブ内のコマンドを呼び出すことができます。この他のインタープリタ間の接続方法は、唯一、環境変数( env変数 )があるだけです。 環境変数はアプリケーションにおける全てのインタープリタ間で共用されます。(openコマンドによって返される)ファイルハンドル等はインタープリタ間では共用されないことに注意してください。ファイルを共用したり、オープンしたファイルを他のインタプリタに引き渡すためには別途用意されているコマンドを明示的に使用する必要があります。

interpコマンドではsafe (安全な)インタープリタを作成することができます。 安全なインタープリタとは、機能が非常に制限されたスレーブインタープリタです。その目的は他のインタープリタにダメージを与えることなく、またアプリケーションの環境を損傷することなく安全にスクリプトを実行することにあります。例えば、全てのIOチャネル作成コマンドまたサブプロセス作成コマンドは、安全なインタープリタから遠ざけられます。 安全なインタープリタに関するより詳細な情報は下述のSAFE INTERPRETERSを参照して下さい。 危険な機能は安全なインタープリタから取り除かれるのではなく、隠されいる(hidden)だけですので、信用できる環境でのみ使用するインタープリタなら、危険な機能を持たせることもできます。 隠しコマンドの詳細な説明は下記の 隠しコマンドを参照して下さい。 alias (別名)メカニズムはスレーブインタープリタとマスタインタープリタ間の保護された通信( カーネルコールに類似している )のために使います。 別名メカニズムがどのように機能するかに関するより詳細情報は別名の呼び出しを参照して下さい。

インタープリタを識別する名前はTclリスト形式です。このリストはインタープリタ階層に従って順に名前を並べたものです。インタプリタを使用するときはこのようなリスト型でインタプリタ名を指定します。例えば、aが現在のインタープリタのスレーブであり、 aのなかにスレーブa1があり、更にa1の中にスレーブa11があるとき、aの中でスレーブa11を指定するにはリストa1 a11を記述します。例えばスレーブa11を削除するには

interp delete {a1 a11}

と記述します。後述のinterpコマンドはこのようなリスト形式でのスレーブ名を引数として受け取ります。interpコマンド自身を実行するのは{} (空のリスト) で識別されるインタープリタということになります。別名を除いて、スレーブインタープリタから名前によって自分のマスタインタープリタを参照することは不可能であることに注意してください。 そして、アプリケーションにおいて作成された最初のインタープリタを参照できるグローバル名もありません。この二つの制限は安全性確保を目的にしたものです。

interpコマンド

interpコマンドはスレーブインタープリタの作成や削除、及び操作に使われます。 そして、チャネルをインタープリタの間で共有または転送すために使われます。option 引数に応じて、以下の形式のいずれかを持つことができます。

interp alias srcPath srcCmd
interp alias srcPath srcCmd {}
interp alias srcPath srcCmd targetPath targetCmd ?arg arg ...?
interp aliases ?path?
interp create ?-safe? ?- -? ?path?
interp delete ?path ...?
interp eval path arg ?arg ...?
interp exists path
interp expose path hiddenName ?exposedCmdName?
interp hide path exposedCmdName ?hiddenCmdName?
interp hidden path
interp invokehidden path ?-global? hiddenCmdName ?arg ...?
interp issafe ?path?
interp marktrusted path
interp recursionlimit path ?newlimit?
interp share srcPath channelId destPath
interp slaves ?path?
interp target path alias
interp transfer srcPath channelId destPath
interp alias srcPath srcCmd
スレーブsrcPathの中にある別名コマンドsrcCmd に関連付けられたターゲットコマンドの名称とアーギュメントをTclリストで返します。(このリストは別名コマンドが作成されたとき指定されたアーギュメントと同じものです。srcCmd と、それに関連付けられたコマンドの名称とが異なっていることもあり得ます。)
 
interp alias srcPath srcCmd {}
スレーブsrcPathの中にある別名コマンドsrcCmd を削除します。関連付けられていたターゲットコマンド名が返ります。ターゲットコマンドが改名された場合、別名コマンドは削除されます。
 
interp alias srcPath srcCmd targetPath targetCmd ?arg arg ...?
このコマンドは指定スレーブに、他のスレーブのコマンドをリモート実行するための別名コマンドを作成します。他のスレーブは、同階層のものでも下位の階層ののものでも許されます。SrcPath srcCmd には別名コマンドを作成するスレーブとそのコマンド名称を指定します。SrcPath は、スレーブが階層構造である場合Tclリスト形式で与えます。最後の要素が目的のスレーブ名であり、前の要素は親スレーブです。 例えば、"a b"はインタープリタbを指定するものであり、 bはインタープリタaのスレーブであり、更に a は呼び出している(interpコマンドを実行している)インタープリタのスレーブです。 空リストは、コマンドを呼び出しているインタープリタを示します。TargetPath targetCmd はターゲットインタープリタとコマンド名を指定します。arg 引数は、必要に応じtargetCmd への追加引数を指定します。これらの引数はsrcCmd が呼び出されるとき、引数の前に追加されます。 TargetCmd は存在しない場合も既に存在する場合もありますが、このコマンドによって作成されることはありません。srcCmd コマンドが呼び出されるごとに、targetCmd コマンドが呼び出されます。より詳しい情報は別名の呼び出しを参照してください。
 
interp aliases ?path?
このコマンドはpath によって示されたインタープリタに定義されている全ての別名コマンド名をTclリストで返します。
 
interp create ?-safe ? ?--? ?path?
スレーブインタープリタを作成します。path に作成するスレーブ名を与えます。スレーブ名をTclリストで与えると、リストで示されたスレーブ階層の最下層に新しいスレーブを作成する指定になります。 上層のスレーブは既に存在していなければなりません。 例えば、path a b cである場合、cという新しいスレーブインタープリタがbスレーブの中に作成されます。作成されたスレーブの名称は後述のslave コマンドのコマンド名になります。 path が省略されると、Tclはスレーブ名をinterpx にします。x は0からはじまるユニークな整数です。例えばinterp0になります。 -safeスイッチが指定された場合(あるいはマスタインタープリタが安全なインタープリタであるなら)、新しいスレーブインタープリタは、限られた機能性を持つ安全なスレーブインタープリタとして作成されます。そうでない場合、そのスレーブはTcl固有のコマンドと変数の完全なセットを含むものとして作成されます。 - -スイッチはスイッチの終わりを示します。path -safeのような名称である場合、--スイッチが必要になります。 コマンドの結果は、新しいインタープリタ名です。 スレーブインタープリタ名はそのマスタスレーブ内でユニークでなければなりません。同名のスレーブインタープリタが既に存在する場合にはエラーが発生します。スレーブインタープリタの再帰コール制限数は親インタープリタの制限数となります。(ここまで翻訳見直しました。ちょっと休憩... 管理人 ってだれだ! 2007/05/24)
 
interp delete ?path ...?
省略可能のpath 引数によって与えられた0個または0以上のインタープリタを削除します。 各インタープリタに対して、 そのスレーブも削除します。コマンドは削除された各インタープリタのスレーブコマンドも削除します。各path 引数に対して、その名前によるインタープリタが存在しない場合、このコマンドはエラーを出力します。
 
interp eval path arg ?arg ...?
本コマンドはconcatコマンドと同じ方式でarg 引数の全てを連結して、生じた結果 文字列をpath で識別されたスレーブインタープリタにおけるTclスクリプトとして評価します。 この評価 ( エラーが発生するならば、 errorInfoerrorCode変数のようなエラー情報を含みます ) の結果はコール側のインタープリタに返されます。
 
interp exists path 
path で指定されたスレーブインタープリタが、このマスタに存在する場合には1を返し、 そうでない場合0を返します。path が省略されると、コール側のインタープリタが使われます。
 
interp expose hiddenName ?exposedCmdName ?
path に示されたインタープリタにおける隠されたコマンドhiddenName を公開し、新しい名前 exposedCmdName (現在、この名前が全て::なしの正当なグローバルネームスペース名しか受け入れられません)に改名します。 ターゲット名を持っている公開されたコマンドが既に存在すると、このコマンドは失敗します(参照:隠しコマンド)。
 
interp hide exposedCmdName ?hiddenCmdName ?
path に表示されたインタープリタにおいて、公開されたコマンドexposedCmdName を隠し、コマンドhiddenCmdName に改名します。hiddenCmdName が与えられない場合、同じ名前を保持します。ターゲット名を持っている隠されたコマンドが既に存在すると、このコマンドは失敗します。 現在、exposedCmdName hiddenCmdName の両方とも、ネームスペース修飾子を含むことができず、エラーが発生します。interp hideによって隠されたコマンドは、たとえ現在のネームスペースがグローバルなものではなくても、グローバルネームスペースにおいて検索されます。 これはスレーブが現在のネームスペースをグローバルなものと異なるものにすることによって、マスタインタープリタを騙して誤ったコマンドを隠すことを防止します(参照:隠しコマンド)。
 
interp hidden path
path で示されたインタープリタにおいて全ての隠されたコマンド名のリストを返します。
 
interp invokehidden path ?-global? hiddenCmdName ?arg ...?
path によって表示されたインタープリタにおいて、提供された引数によって隠されたコマンドhiddenCmdName を呼び出します。書き換えまたは評価は引数に適用されません。 -globalフラグが存在すると、隠されたコマンドはターゲットインタープリタにおけるグローバルレベルで呼び出されます。 それ以外の場合は、現在のコールフレームで呼び出され、このフレームと外側のコールフレームにおいてローカル変数にアクセスすることができます(参照:隠しコマンド)。
 
interp issafe ?path ?
path に指定されたインタープリタが安全であれば1、そうでなければ0を返します。
 
interp marktrusted path 
path で指定されたインタープリタに、「信用できる」というマークを付けます。 隠しコマンドを公開しません。このコマンドは信用されたインタープリタからしか呼び出すことができません。path で示されたインタープリタが既に信用されているならば、そのコマンドは効果 がありません。
 
interp recursionlimit path ?newlimit ?
path に指定されたインタープリタの許容できる最大のネスト深さを返します。 newlimit が指定されるならば、インタープリタの再帰限界は設定され、インタープリタでTcl_Eval()と関連するプロシージャへの呼び出しが newlimit 回以上のネスティングで、エラーを返します。newlimit値も返されます。newlimit 値は1からプラットホームでのnon-long整数の最大値の間の正整数でなければなりません。

このコマンドは、ただTclコールスタックの最大サイズを設定するだけです。 これだけでは、アプリケーションに使われるCスタック上のスタックオーバフローを防止できません。 マシンがCスタックのサイズの限界を持っていれば、このコマンドに設定された境界に到達する前にスタックオーバフローに遭遇するでしょう。 これを避けるには使用しているシステムにCスタックの最大サイズを増大させるメカニズムがあるかどうかを調べて使うといいでしょう。

 
interp share srcPath channelId destPath
channelId で示されたIOチャネルを、srcPath で示されたインタープリタと、destPath で示されたインタープリタの間で共有できる状態にします。 両方のインタープリタとも、IOチャネルに同じアクセス権を持っています。 両方のインタープリタは、関連するIOチャネルを閉じなければなりません。 インタープリタが破壊されたとき、このインタープリタの持つ全てのアクセス可能なIOチャネルは自動的に閉じられます。
 
interp slave ?path ?
path で示されたインタープリタと関連していた全てのスレーブインタープリタ名をTclリストで返します。 path が省略されるならば、起動されているインタープリタが使われます。
 
interp target path alias
別名のターゲットインタープリタを記述するTclリストを返します。この別名は、上述のinterp alias と同様に、インタープリタパスとソースコマンド名前で指定されます。 ターゲットインタープリタ名は、コール側のインタープリタに相対的なインタープリタパスとして返されます。 別名のターゲットインタープリタが、コール側のインタープリタである場合、空のリストが返されます。 別名のターゲットインタープリタがコール側のインタープリタ、あるいはその子孫の1つでない場合は、エラーが生成されます。 ターゲットコマンドがこの呼び出しの時に定義される必要はありません。
 
interp transfer srcPath channelId destPath
channelIdで示されたIOチャネルを、destPathで示されたインタープリタにおいて利用可能にし、srcPathで示されたインタープリタにおいて利用不可能にします。
 

slaveコマンド

interpコマンドによって作成された各スレーブインタープリタのために、新しいTclコマンドは、新しいインタープリタと同じ名前を持つマスタインタープリタの中で、作成されます。 このコマンドはインタープリタに対する様々な操作を呼び出すために使えます。一般 的フォーマットは以下の通りです。

slave command ?arg arg ...?

slave はインタープリタ名で、そしてcommand 及びargsは、コマンドの正確な動作を決定します。 このコマンドの正当なフォーマットは以下の通りです。

slave aliases
slave alias srcCmd
slave alias srcCmd {}
slave alias srcCmd targetCmd ?arg ..?
slave eval arg ?arg ..?
slave expose hiddenName ?exposedCmdName?
slave hide exposedCmdName ?hiddenCmdName?
slave hidden
slave invokehidden ?-global hiddenName ?arg ..?
slave issafe
slave marktrusted
slave recursionlimit ?newlimit?
slave aliases 
Tclリストを返します。その要素がslave における全ての別名の名前です。返された名前は、それらの別 名が作成された (それらが改名された場合、 コマンドの現在の名前と同じではない可能性もあります) 時に使われるsrcCmd 値です。
 
slave alias srcCmd
Tclリストを返します。その要素がsrcCmd という別名と関連したtargetCmd args です(これらの全てが、その別名が作成された時に指定された値です。)。改名された場合、スレーブにおける実際のソースコマンドがsrcCmd と異なる可能性があります。
 
slave alias srcCmd {}
スレーブインタープリタにおいてsrcCmd のための別名を削除します。 srcCmd は別名が作成された名前を示します。 ソースコマンドが改名された場合、改名されたコマンドは削除されます。
 
slave alias srcCmd targetCmd、?arg ...?
別名を作成します。したがって、srcCmd slave において呼び出されるたびtargetCmd もマスタにおいて呼び出されます。arg 引数は追加の引数としてtargetCmd に渡され、srcCmd の呼び出し中に渡されたあらゆる引数の前に追加されます。 詳細は下記のALIAS INVOCATIONを参照して下さい。
 
slave eval arg ?arg ...?
本コマンドはconcatコマンドと同じ方式でarg 引数の全てを連結した結果 文字列をTclスクリプトとしてslave で評価します。 この評価 ( エラーが発生すれば、errorInfoerrorCode変数のようなエラー情報を含みます ) の結果はコール側のインタープリタに返されます。
 
slave expose hiddenName ?exposedCmdName ?
本コマンドは、slave において隠されたコマンドhiddenName を公開し、新しい名前 exposedCmdName (現在、この名前が全て::なしの正当なグローバルネームスペース名しか受け入れられません)に改名します。 ターゲット名を持っている公開されたコマンドが既に存在すると、このコマンドは失敗します。 (参照:隠しコマンド)
 
slave hide exposedCmdName ?hiddenCmdName ?
slave インタープリタにおいて、公開されたコマンドexposedCmdName を隠して、コマンドhiddenCmdName に改名します。hiddenCmdName が与えられない場合、同じ名前を保持します。 ターゲット名を持っている隠されたコマンドが既に存在すると、このコマンドは失敗します。 現在、exposedCmdName hiddenCmdName の両方とも、ネームスペース修飾子を含むことができません。 そうしないとエラーが出力されます。 隠されるコマンドは現在のネームスペースがグローバルなものでなくても、グローバルネームスペースにおいて検索されます。 これは、スレーブが現在のネームスペースをグローバルなものと異なるものにすることによって、マスタインタープリタを騙して誤ったコマンドを隠すことを防止します。(参照:隠しコマンド)
 
slave hidden
slave において全ての隠されたコマンド名のリストを返します。
 
slave invokehidden ?-global? hiddenName ?arg ...?
slave において、提供された引数によって隠されたコマンドhiddenCmdName を呼び出します。 書き換えまたは評価は引数に適用されません。 -globalフラグが存在すると、隠されたコマンドはスレーブにおけるグローバルレベルで呼び出されます。 それ以外の場合は、現在のコールフレームで呼び出され、このフレームと外側のコールフレームにおいてローカル変数にアクセスすることができます。 (参照:隠しコマンド)
 
slave issafe
スレーブインタープリタがが安全であれば1、そうでなければ0を返します。
 
slave marktrusted
スレーブインタープリタに、「信用できる」というマークを付けます。 このコマンドは信用されたインタープリタからしか呼び出すことができません。 このコマンドはスレーブインタープリタにおいて、いかなる隠しコマンドを公開しません。 スレーブインタープリタが既に信用されるならば、このコマンドは効果がありません。
 
slave recursionlimit ?newlimit ?
slave インタープリタの許容する最大のネスト深さを返します。newlimit が指定されるならば、slave の再帰の限界は設定されます。slave (Tcl_Eval  )と関連するプロシージャへの呼び出しが、newlimit 回以上のネスティングでエラーを返します。newlimit値も返されます。newlimit 値は1から、プラットホームでのnon-long整数の最大値の間の正整数でなければなりません。

このコマンドはただTclコールスタックの最大サイズを設定するだけです。 これだけでは。アプリケーションに使われるCスタック上のスタックオーバフローを防止できません。 マシンにCスタックのサイズの限界を持っていれば、このコマンドに設定された境界に到達する前にスタックオーバフローに遭遇するかもしれません。 もしこれが起きた場合、該当するシステムにCスタックの最大サイズを増大させるメカニズムがあるかどうかを調べて使うといいでしょう。

安全なインタープリタ

安全なインタープリタは制限された機能性を持つものです。 従って、最も悪い敵から任意のスクリプトを実行しても安全であり、スクリプトは囲んでいるアプリケーションまたは他の計算環境への損害をもたらす恐れがありません。 インタープリタを安全にするために、いくつかのコマンドと変数はインタープリタから除かれます。 例えば、ディスク上でファイルを作成させるコマンドは除かれます。 また、execコマンドはサブプロセスによって損害を引き起こすことに使われるので削除されます。 これらの機能への制限されたアクセスは、マスタインタープリタで別名を作成することによって提供されます。 それらの引数をチェックし、これらの機能の安全なサブセットに制限されたアクセスを提供します。 例えば、ファイルの作成は特定なサブディレクトリにしか許可されないようにします。 またはサブプロセスの呼び出しは慎重に選択され、かつ固定したプログラムセットにだけ許可するようにします。

安全なインタープリタは-safeスイッチをinterp create コマンドに指定することによって作成されます。 更に、安全なインタープリタによって作成されたあらゆるスレーブも安全です。

安全なインタープリタは次の固有コマンドのセットを作成します。
after append array binary break catch clock close concat
continue eof error eval expr fblocked fcopy filename flush for
foreach format gets global if incr info interp join lappend
lindex linsert list llength lrange lreplace lsearch lsort namespace package
pid proc puts read regexp regsub rename return scan seek
set split string subst switch tell time trace unset update
uplevel upvar variable vwait while

次のコマンドはinterp create が安全なインタープリタを作成するときに隠されます。
cd encoding exec exit fconfigure file glob load open pwd socket source

これらのコマンドはTclのプロシージャまたは別名として再作成されます。あるいは、interp exposeによって再び公開できます。


Tclのサポートプロシージャのライブラリからの次のコマンドは安全なインタープリタに現れません。
auto_exec_ok auto_import auto_load auto_load_index auto_qualify unknown


安全なインタープリタはデフォルトのunknownコマンドを持っていません。 従って、Tclのデフォルトオートローディング機能が利用できないことを、特に注意して下さい。 通常オート‐ロードされるTclのコマンドにオート‐ロードのアクセス
auto_mkindex auto_mkindex_old auto_reset history parray pkg_mkIndex pkg::create
::safe::interpAddToAccessPath ::safe::interpCreate ::safe::interpConfigure ::safe::interpDelete
::safe::interpFindInAccessPath
 ::safe::interpInit ::safe::setLogCmd
tcl_endOfWord tcl_findLibrary tcl_startOfNextWord tcl_startOfPreviousWord tcl_wordBreakAfter  tcl_wordBreakBefore
は、安全なインタープリタにおけるunknownコマンドの明白な定義によってしか提供できません。これで sourceコマンドを公開することが必要になります。 これは、TclのSafe-Tclメカニズムで、安全なインタープリタ を作成することによって、最も容易に成し遂げられます。Safe-Tclは、オートローディングとパッケージのローディングをサポートするのに必要とされるsourceコマンド、 loadコマンド、及び他のTclコマンドの安全なバージョンを提供します。、

更に、env変数は安全なインタープリタに現れませんので、環境変数をほか他のインタープリタと共有できません。 ユーザーが鋭敏な情報を環境変数に格納できるので、env変数は安全性に危険をもたらします。 例えば、PGPマニュアルはPGPプライベートなキー保護パスワードを環境変数PGPPASSに格納することを勧めます。 安全なインタープリタで信用されないコードの実行を利用可能にするこの変数を作ることは、安全性にリスクを招きます。

拡張が安全なインタープリタにロードされると、それらも自身の機能性を制限し、危険なコマンドを消去します。 安全のための拡張管理の議論は Safe-TclloadTclコマンドに関するマニュアルのエントリを参照します。

安全なインタープリタは自身を含む、いかなるインタープリタの再帰限界を変更できません。

別名の呼び出し

別名メカニズムは、信用されないスクリプトを安全なスレーブにおいて実行したり、別 名のターゲットが信用されたマスタであるために、安全な使用を可能にするように、慎重に設計されました。 安全を保証する際の最も重要なことは、スレーブからマスタに渡された情報が、決してマスタにおいて評価、または書き換えられないことを保証することです。 評価、または書き換えが発生する場合、スレーブにおける有害なスクリプトは、マスタで任意のファンクションを呼び出すことが可能になる恐れがあります。 これは安全性を脅かします。

別名のソースがスレーブインタープリタにおいて呼び出されるとき、通常のTcl書き換えはコマンドの分析中に行いません。 いかなるインタープリタで行われた書き換えと同様に、これらの書き換えはソースインタープリタで実行されます。 ソースコマンドのコマンドプロシージャは、その引数を受け取って、それらを新しい一連の引数を作成するためtargetCmd args と共に連結させます。srcCmd のワードが”srcCmd arg1 arg2 ... argN ” と仮定すれば、ワードの新しいセットは”targetCmd arg arg ... arg arg1 arg2 ... argN”です。 ここでtargetCmd args は、別名が作成されたときに与えられた値です。 TargetCmdはターゲットインタープリタで、コマンドプロシージャの位 置を決定することに使われます。 そのコマンドプロシージャは引数の新しいセットと共に呼び出されます。 ターゲットインタープリタにおいてtargetCmd というコマンドがないと、エラーが発生します。 ワードに対して追加の書き換えは行いません。 正常なTcl評価メカニズムを利用せず、ターゲットコマンドプロシージャは、直接呼び出されます。 書き換えはこのように各ワードに関して、ちょうど1回だけ行われます。targetCmdargs は別名を作成したコマンドの分析中に書き換えされます。一方、arg1 - argN は別名のソースコマンドは、ソースインタープリタにおいて分析されるときに書き換えされます。

安全なインタープリタにおいて、別名のtargetCmds を書く時、重要な注意事項はコマンドへの引数を決して評価させないことです。 評価すると、スレーブインタープリタが、マスタにおいて任意のコードを実行することを可能にしてしまいます。 これはシステムの安全性を脅かします。

隠しコマンド

安全なインタープリタは、その中で実行するTclプログラムに利用可能な機能を非常に制限します。 信用されないTclプログラムが、この機能に直接なアクセスすることを可能にするのは安全ではありません。 なぜなら、それが環境に対する様々な攻撃のために使われる可能性があるからです。 しかしながら、安全なインタープリタの文脈に、危険な機能を合法的に使う必要があります。 例えば、しばしばプログラムはインタープリタへ sourceされなければなりません。 もう1つの例はTkです。そこで、ウィンドウは特定のインタープリタのウィンドウの階層にバインドされます。 いくらかの潜在的に危険な機能、 例えばウィンドウ管理は、インタープリタ文脈の中で、これらのウィンドウ上で実行されなければなりません。

interpコマンドは隠しコマンドの形でこの問題の解決策を提供します。 安全なインタープリタから危険なコマンドを完全に削除する代りに、これらのコマンドを隠します。 それらはインタープリタにおいて実行中のTclスクリプトに利用不可能になります。しかし、 interp invoke を使って安全なインタープリタの文脈において、このような隠されたコマンドが、安全なインタープリタのあらゆる信用された先祖によって呼び出すことができます。 隠されたコマンドと公開されたコマンドは別々のネームスペースにあります。 1つのインタープリタで同じ名前の隠されたコマンドと公開されたコマンドを定義することは可能です。

スレーブインタープリタにおける隠されたコマンドは、別名の呼び出しによりマスタにおいて呼ばれたプロシージャのボディ中に呼び出されることも可能です。 例えば、 sourceの別名はスレーブインタープリタにおいて作成されます。 それがスレーブインタープリタにおいて呼び出されるとき、あるプロシージャがsourceオペレーションが許可されるかどうかをチェックするために、マスタインタープリタにおいて呼ばれます。 このプロシージャは、スレーブインタープリタの隠された sourceコマンドを呼び出して、実際にファイルの内容をsourceします。 注意すべきなのは、スレーブインタープリタに sourceというコマンドが2つ存在することです。それは別名と隠しコマンドです。

マスタインタープリタが別名呼び出しを扱うことの一部として、隠しコマンドを呼び出すかもしれないので、別 名呼び出しによって渡した引数を評価することを避けることに、十分な注意は払われなければなりません。 そうでないと、悪意のあるスレーブインタープリタによって、信用されたマスタインタープリタ上で危険なコマンドを実行するかもしれません。 この話題のより完全な議論はALIAS INVOCATIONセクションを参照して下さい。 この問題を回避するため、interp invokehiddenの引数に適用される書き換え、または評価がないようにすることです。

安全なインタープリタは自らまたはそれらの子孫における隠しコマンドを呼び出すことを許可されません。 これは安全なスレーブがそれ自体あるいはそれらの子孫における隠された機能性へのアクセスを得ることを防止します。

あるインタープリタにおける隠されたコマンドの集合は、interp expose interp hideを使い、信用されたインタープリタによって操作されます。interp expose コマンドは、隠されたコマンドをpath で示されたインタープリタの公開されたコマンド集合に移動します。 コマンドはこの過程の中でプロセスにおいて潜在的に改名されます。 コマンドはターゲットされた名前が既に存在すると、この操作が失敗します。同様に、interp hideは公開されたコマンドを該当するインタープリタの隠されたコマンド集合に移動します。 安全なインタープリタは、自ら、及び子孫のいずれかにおける隠されたコマンド集合と公開されたコマンド集合の間で、コマンドを移動することが許可されません。

現在、隠しコマンド名はネームスペース修飾子を含むことができません。 そして、あるネームスペースのコマンドを隠す前にまずこのコマンドをグローバルネームスペースに改名しなければなりません。interp hideによって隠されたコマンドは、たとえ現在のネームスペースがグローバルなものでなくても、グローバルネームスペースにおいて検索されます。 これは、スレーブが現在のネームスペースをグローバルなものと異なるものにすることによって、マスタインタープリタを騙して誤ったコマンドを隠すことを防止します。

感謝

このメカニズムはNathaniel Borenstein とMarshall Roseによって実現されたSafe-Tclプロトタイプに基づいています。

参照

load, safe, Tcl_CreateSlave

キーワード

alias, master interpreter, safe interpreter, slave interpreter


Copyright © 1995-1996 Sun Microsystems, Inc. Copyright © 1995-1997 Roger E. Critchlow Jr.