Manpages

______________________________________________________________________________

NAME

interp - 建 立 和 操 纵 Tcl 解 释 器

总 览 SYNOPSIS

interp option ?arg arg ...? _________________________________________________________________

描 述 DESCRIPTION

这 个 命 令 建 立 一 个 或 多 个 新 的 Tcl 解 释 器 , 并 使 其 与 建 立 (它 们 的 )解 释 器 在 相 同 的 应 用 中 共 存 。 建 立 解 释 器 的 解 释 器 叫 做 主 解 释 器 (master)而 新 解 释 器 叫 做 从 解 释 器 (slave)。 主 解 释 器 可 以 建 立 任 意 数 目 的 从 解 释 器 , 每 个 从 解 释 器 也 可 以 自 己 建 立 增 添 的 从 解 释 器 而 成 为 它 们 的 主 解 释 器 , 这 将 导 致 解 释 器 的 一 个 等 级 层 次 (hierarchy)。 每 个 解 释 器 相 对 其 他 解 释 器 是 独 立 的 : 它 有 给 命 令 、 过 程 、 和 全 局 变 量 的 自 己 的 名 字 空 间 。 一 个 主 解 释 器 可 以 使 用 叫 别 名 (alias)的 机 制 建 立 它 的 从 解 释 器 与 它 自 身 间 的 连 接 。 别 名 是 在 一 个 从 解 释 器 中 的 一 个 命 令 , 调 用 它 时 , 导 致 在 它 的 主 解 释 器 或 其 他 从 解 释 器 中 调 用 一 个 命 令 。 解 释 器 之 间 的 唯 一 其 他 连 接 是 通 过 环 境 变 量 (env 变 量 ), 它 通 常 被 在 这 个 应 用 中 的 所 有 解 释 器 共 享 。 注 意 给 文 件 的 名 字 空 间 (比 如 由 open命 令 返 回 的 名 字 )不 在 解 释 器 之 间 共 享 。 提 供 显 式 的 命 令 来 共 享 文 件 和 把 到 打 开 文 件 的 引 用 从 一 个 解 释 器 转 换 (transfer)到 另 一 个 。

interp命 令 还 提 供 对 安 全 (safe)解 释 器 的 支 持 。 一 个 安 全 解 释 器 是 一 个 功 能 被 严 格 限 制 了 的 从 解 释 器 , 这 样 就 可 以 执 行 不 可 信 任 的 脚 本 而 不 用 害 怕 它 们 毁 坏 其 他 解 释 器 或 这 个 应 用 的 环 境 。 例 如 , 安 全 解 释 器 不 能 访 问 所 有 IO 通 道 建 立 命 令 和 子 过 程 建 立 命 令 。 详 情 参 见 下 面 的 SAFE INTERPRETERS (安 全 的 解 释 器 ) 章 节 。 未 从 安 全 的 解 释 器 中 去 除 有 危 险 的 功 能 ; 但 是 , 它 们 是 隐 藏 的 , 所 以 只 有 可 信 任 的 解 释 器 可 以 获 得 到 它 们 的 访 问 。 隐 藏 命 令 的 详 细 解 释 请 参 见 下 面 的 HIDDEN COMMANDS (隐 藏 命 令 ) 章 节 。 可 以 使 用 别 名 机 制 来 在 从 解 释 器 和 它 的 主 解 释 器 之 间 进 行 受 保 护 的 通 信 (类 似 于 一 个 内 核 调 用 )。 别 名 机 制 工 作 的 详 情 参 见 下 面 的 ALIAS INVOCATION (别 名 调 用 )章 节 。 一 个 限 定 的 (qualified)解 释 器 的 名 字 是 一 个 适 当 的 Tcl 列 表 , 它 包 含 在 这 个 解 释 器 层 次 中 它 的 祖 先 的 一 个 子 集 , 终 结 于 以 它 的 直 接 上 级 (immediate)主 解 释 器 命 名 的 字 符 串 。 解 释 器 名 字 是 相 对 于 在 其 中 使 用 它 的 哪 个 解 释 器 的 。 例 如 , 如 果 a 是 当 前 解 释 器 的 一 个 从 解 释 器 并 且 它 有 一 个 从 解 释 器 a1, 它 依 次 有 一 个 从 解 释 器 a11, 在 aa11 的 限 定 的 名 字 是 列 表 a1 a11。 下 面 描 述 的 interp命 令 接 受 限 定 的 解 释 器 名 字 作 为 参 数 ; 命 令 在 其 中 求 值 的 解 释 器 总 是 可 以 作 为 {}来 引 用 (空 列 表 或 字 符 串 )。 注 意 除 了 通 过 别 名 之 外 , 在 一 个 从 解 释 器 中 不 可 能 通 过 名 字 引 用 一 个 主 (祖 先 )解 释 器 。 还 有 , 没 有 通 过 它 可 以 引 用 在 应 用 中 建 立 的 第 一 个 解 释 器 的 全 局 名 字 。 这 两 种 限 制 的 目 的 都 是 为 了 安 全 。

INTERP 命 令 COMMAND

使 用 interp 命 令 建 立 、 删 除 、 和 操 纵 从 解 释 器 , 并 在 解 释 器 之 间 共 享 或 转 换 通 道 。 依 赖 于 option 参 数 , 它 可 以 有 下 列 一 些 形 式 :

interp alias srcPath srcCmd 返 回 一 个 Tcl 列 表 , 它 的 元 素 是 与 叫 做 srcCmd的 别 名 有 关 的 targetCmdargs(在 建 立 别 名 时 指 定 所 有 这 些 值 ; 在 从 解 释 器 中 实 际 的 源 命 令 如 果 被 重 命 名 的 话 可 能 与 srcCmd 不 同 )。
interp alias
srcPath srcCmd {} 删 除 在 从 解 释 器 中 用 srcPath 标 识 的 给 srcCmd 的 别 名 。 srcCmd 引 用 在 其 下 建 立 别 名 的 名 字 ; 如 果 源 命 令 已 经 被 重 命 名 , 则 删 除 重 命 名 后 的 命 令 。
interp alias
srcPath srcCmd targetPath targetCmd ?arg arg ...? 这 个 命 令 在 一 个 从 解 释 器 和 其 他 解 释 器 之 间 建 立 一 个 别 名 (关 于 在 一 个 从 解 释 器 和 它 的 主 解 释 器 之 间 建 立 别 名 请 参 见 下 面 的 alias 从 命 令 )。 在 这 个 命 令 中 , 两 个 从 解 释 器 可 以 在 调 用 这 个 命 令 的 解 释 器 底 下 的 解 释 器 层 次 中 的 任 何 位 置 。 SrcPathsrcCmd 标 识 这 个 别 名 的 来 源 。 SrcPath 是 一 个 Tcl 列 表 , 它 的 元 素 选 择 一 个 特 定 的 解 释 器 。 例 如 , “a b”标 识 一 个 解 释 器 b, 它 是 解 释 器 a 的 一 个 从 解 释 器 , a解 释 器 是 调 用 (命 令 )的 解 释 器 的 一 个 从 解 释 器 。 一 个 空 列 表 指 定 调 用 这 个 命 令 的 解 释 器 。 srcCmd给 出 一 个 新 命 令 的 名 字 , 将 在 源 解 释 器 中 建 立 它 。 TargetPathtargetCmd 指 定 一 个 目 标 解 释 器 和 命 令 , 和 arg 参 数 , 如 果 有 的 话 , 给 targetCmd 指 定 增 补 的 参 数 , 它 们 在 srcCmd 调 用 中 指 定 的 所 有 参 数 的 前 面 。 TargetCmd在 这 个 调 用 的 时 候 可 以 被 取 消 定 义 (undefine)了 , 或 者 它 已 经 存 在 了 ; 它 不 由 这 个 命 令 来 建 立 。 别 名 安 排 在 源 解 释 器 中 调 用 给 定 源 命 令 的 时 候 在 目 标 解 释 器 中 调 用 给 定 目 标 命 令 。 详 情 参 见 下 面 的 ALIAS INVOCATION (别 名 调 用 )章 节 。
interp aliases
?path? 这 个 命 令 返 回 给 在 用 path 表 示 的 解 释 器 中 定 义 的 别 名 的 所 有 源 命 令 的 名 字 一 个 Tcl 列 表 。
interp create
?-safe? ?--? ?path? 建 立 用 path 标 识 的 一 个 从 解 释 器 和 叫 做 从 命 令 (slave command)的 一 个 新 命 令 。 从 命 令 的 名 字 是 path的 最 后 一 个 成 员 。 在 其 中 建 立 新 的 从 解 释 器 和 从 命 令 的 解 释 器 由 从 path 中 去 除 最 后 一 个 成 员 所 获 得 的 路 径 来 标 识 。 例 如 , 如 果 patha b c 则 一 个 新 的 从 解 释 器 和 叫 做 c的 从 命 令 建 立 在 用 路 径 a b 标 识 的 从 解 释 器 中 。 可 以 使 用 从 命 令 先 下 面 描 述 的 那 样 操 纵 新 解 释 器 。 如 果 省 略 了 path, Tcl 建 立 interpx 形 式 的 一 个 唯 一 的 名 字 , 这 里 的 x是 一 个 整 数 , 并 用 于 解 释 器 和 从 命 令 。 如 果 指 定 了 -safe开 关 (或 者 主 解 释 器 是 一 个 安 全 解 释 器 ), 新 的 从 解 释 器 将 建 立 成 功 能 有 限 的 一 个 安 全 解 释 器 ; 否 则 从 解 释 器 将 包 含 Tcl 内 置 命 令 和 变 量 的 全 集 。 使 用 -- 开 关 来 标 记 开 关 的 结 束 ; 如 果 路 径 是 象 -safe 这 样 的 一 个 特 殊 的 值 的 时 候 需 要 这 个 开 关 。 这 个 命 令 的 结 果 是 新 解 释 器 的 名 字 。 一 个 从 解 释 器 的 名 字 在 它 的 主 解 释 器 的 所 有 从 解 释 器 中 必 须 是 唯 一 的 ; 如 果 在 这 个 主 解 释 器 中 用 给 定 名 字 (标 识 )的 一 个 从 解 释 器 已 经 存 在 则 发 生 一 个 错 误 。
interp delete
?path ...? 删 除 用 可 选 的 path 参 数 给 出 的 零 个 或 多 个 解 释 器 , 并 且 对 于 每 个 解 释 器 , 它 还 删 除 它 的 所 有 从 解 释 器 。 这 个 命 令 还 删 除 给 每 个 被 删 除 的 解 释 器 的 从 命 令 。 对 于 每 个 path 参 数 , 如 果 叫 这 个 名 字 的 解 释 器 不 存 在 , 这 个 名 字 将 引 发 一 个 错 误 。
interp eval
path arg ?arg ...? 这 个 命 令 用 与 concat命 令 相 同 的 方 式 串 联 所 有 的 arg 参 数 , 接 着 在 用 path 标 识 的 解 释 器 中 把 结 果 字 符 串 作 为 一 个 Tcl 脚 本 来 求 值 。 把 这 个 求 值 的 结 果 (如 果 发 生 错 误 的 话 , 包 括 象 errorInfoerrorCode 变 量 这 样 的 错 误 信 息 )返 回 给 调 用 (命 令 )的 解 释 器 。
interp exists
path 如 果 在 这 个 主 解 释 器 中 存 在 用 path 指 定 的 从 解 释 器 则 返 回 1, 否 则 返 回 0。 如 果 省 略 了 path, 使 用 调 用 (命 令 )的 解 释 器 。
interp expose
path hiddenName ?exposedCmdName? 在 用 path 表 示 (denote)的 解 释 器 中 , 使 隐 藏 的 命 令 hiddenName 露 (expose), 最 终 把 它 带 回 在 一 个 新 的 exposedCmdName 名 字 之 下 (目 前 只 接 受 没 有 任 何 :: 的 一 个 全 局 名 字 空 间 名 字 )。 如 果 有 目 标 名 字 的 一 个 暴 露 的 命 令 已 经 存 在 , 这 个 命 令 失 败 。 隐 藏 命 令 的 详 情 参 见 下 面 的 HIDDEN COMMANDS (隐 藏 命 令 )章 节 。
interp hide
path exposedCmdName ?hiddenCmdName? 在 用 path 表 示 (denote)的 解 释 器 中 , 使 暴 露 的 命 令 exposedCmdName 藏 , 并 把 它 重 命 名 成 隐 藏 命 令 hiddenCmdName, 如 果 未 给 出 hiddenCmdName 则 保 持 相 同 的 名 字 。 如 果 有 目 标 名 字 的 一 个 隐 藏 的 命 令 已 经 存 在 , 这 个 命 令 失 败 。 目 前 exposedCmdNamehiddenCmdName二 者 不 能 不 能 包 含 名 字 空 间 限 定 符 , 否 则 将 引 发 一 个 错 误 。 即 使 当 前 名 字 空 间 不 是 全 局 名 字 空 间 , 仍 在 全 局 名 字 空 间 中 查 找 要 被 interp hide隐 藏 的 命 令 。 这 防 止 从 解 释 器 通 过 使 当 前 的 名 字 空 间 不 同 于 全 局 名 字 空 间 (的 方 式 ), 来 愚 弄 主 解 释 器 去 隐 藏 错 误 的 命 令 。 隐 藏 命 令 的 详 情 参 见 下 面 的 HIDDEN COMMANDS (隐 藏 命 令 )章 节 。
interp hidden
path 返 回 在 用 path 标 识 的 解 释 器 中 所 有 隐 藏 命 令 的 名 字 的 一 个 列 表 。
interp invokehidden
path ?-global? hiddenCmdName ?arg ...? 在 由 path 表 示 的 解 释 器 中 用 提 供 的 参 数 调 用 隐 藏 命 令 hiddenCmdName 。 对 参 数 不 (进 行 )替 换 或 求 值 。 如 果 存 在 -global 标 志 , 在 目 标 解 释 器 的 全 局 层 次 上 调 用 隐 藏 命 令 ; 否 则 在 当 前 的 调 用 框 架 (frame)上 调 用 它 并 且 可 以 访 问 调 用 框 架 内 部 和 外 部 的 局 部 变 量 。 隐 藏 命 令 的 详 情 请 参 见 下 面 的 HIDDEN COMMANDS (隐 藏 命 令 )章 节 。
interp issafe
?path? 如 果 由 path 指 定 的 解 释 器 是 安 全 的 则 返 回 1, 否 则 返 回 0
interp marktrusted
path 标 记 用 path 标 识 的 解 释 器 是 可 信 任 的 。 不 暴 露 隐 藏 命 令 。 这 个 命 令 只 能 在 可 信 任 的 解 释 器 中 调 用 。 如 果 由 path标 识 的 解 释 器 已 经 是 可 信 任 的 , 则 这 个 命 令 没 有 影 响 。
interp share
srcPath channelId destPath 在 用 srcPath 标 识 的 解 释 器 和 用 destPath 标 识 的 解 释 器 之 间 导 致 用 channelId标 识 的 IO 通 道 变 成 共 享 的 。 两 个 解 释 器 在 这 个 IO通 道 上 由 相 同 的 权 限 。 两 个 解 释 器 必 须 关 闭 它 来 关 闭 低 层 的 IO 通 道 ; 在 销 毁 一 个 解 释 器 的 时 候 自 动 关 闭 在 这 个 解 释 器 中 可 访 问 的 IO 通 道 。
interp slaves
?path? 返 回 与 用 path 标 识 的 解 释 器 相 关 的 所 有 从 解 释 器 的 名 字 的 一 个 Tcl 列 表 。 如 果 省 略 了 path, 使 用 调 用 (命 令 )的 解 释 器 。
interp target
path alias 返 回 描 述 给 一 个 别 名 的 目 标 解 释 器 的 一 个 Tcl 列 表 。 用 一 个 解 释 器 路 径 和 源 命 令 名 指 定 这 个 别 名 , 就 象 在 上 面 的 interp alias 中 那 样 。 目 标 解 释 器 的 名 字 被 返 回 为 相 对 于 调 用 (命 令 )的 解 释 器 的 一 个 解 释 器 路 径 。 如 果 给 这 个 别 名 的 目 标 解 释 器 是 调 用 (命 令 )的 解 释 器 则 返 回 一 个 空 列 表 。 如 果 给 别 名 的 目 标 解 释 器 不 是 调 用 (命 令 )的 解 释 器 或 是 它 的 后 代 之 一 则 生 成 一 个 错 误 。 在 调 用 这 个 命 令 的 时 候 目 标 命 令 不 是 必 须 定 义 的 。
interp transfer
srcPath channelId destPath 导 致 用 channelId 标 识 的 IO 通 道 , 在 用 destPath 标 识 的 解 释 器 中 变 成 可 获 得 的 , 而 在 用 srcPath 标 识 的 解 释 器 中 变 成 不 可 获 得 的 。

SLAVE 命 令 COMMAND

对 于 每 个 用 interp 建 立 的 从 解 释 器 , 在 主 解 释 器 中 建 立 名 字 与 这 个 新 解 释 器 相 同 的 一 个 新 Tcl 命 令 。 可 以 使 用 这 个 命 令 调 用 在 这 个 解 释 器 上 的 各 种 操 作 。 它 有 下 面 的 一 般 形 式 :

slave command ?arg arg ...?

Slave 是 解 释 器 的 名 字 , commandargs确 定 这 个 命 令 的 具 体 行 为 。 这 个 命 令 有 效 形 式 有 :
slave
aliases 返 回 一 个 Tcl 列 表 , 它 的 元 素 是 在 slave 中 的 所 有 别 名 的 名 字 。 返 回 的 名 字 是 建 立 别 名 时 使 用 的 srcCmd 的 值 (如 果 它 们 已 经 被 重 命 名 , 则 它 可 以 同 这 个 命 令 的 当 前 的 名 字 不 相 同 )。
slave
alias srcCmd 返 回 一 个 Tcl 列 表 , 它 的 元 素 是 与 叫 做 srcCmd 的 别 名 相 关 的 targetCmdargs(在 建 立 这 个 别 名 的 时 候 指 定 所 有 这 些 值 ; 在 从 解 释 器 中 的 实 际 的 源 命 令 如 果 被 重 命 令 则 可 能 与 srcCmd不 同 )。
slave
alias srcCmd {} 在 从 解 释 器 中 删 除 给 srcCmd 的 别 名 。 srcCmd 参 照 在 其 下 建 立 别 名 的 那 个 名 字 ; 如 果 源 命 令 已 经 被 重 命 名 , 则 删 除 重 命 名 后 的 命 令 。
slave
alias srcCmd targetCmd ?arg ..? 建 立 一 个 别 名 , 当 在 slave 中 调 用 srcCmd 的 时 候 , 在 主 解 释 器 中 调 用 targetCmd 。 把 arg 参 数 作 为 补 充 的 参 数 传 递 给 targetCmd , 这 些 参 数 在 srcCmd 的 调 用 中 传 递 的 任 何 参 数 之 前 。 详 情 参 见 下 面 的 ALIAS INVOCATION (别 名 调 用 )章 节 。
slave
eval arg ?arg ..? 这 个 命 令 用 与 concat 命 令 相 同 的 方 式 串 联 所 有 的 arg 参 数 , 接 着 在 slave 中 把 结 果 字 符 串 作 为 一 个 Tcl 脚 本 来 求 值 。 把 这 个 求 值 的 结 果 (如 果 有 错 误 发 生 , 包 括 象 errorInfoerrorCode 变 量 这 样 的 错 误 信 息 )返 回 给 调 用 (命 令 )的 解 释 器 。
slave
expose hiddenName ?exposedCmdName? 这 个 命 令 暴 露 在 slave 的 隐 藏 的 命 令 hiddenName, 最 终 把 它 带 回 在 一 个 新 的 exposedCmdName 名 字 之 下 (目 前 只 接 受 没 有 任 何 :: 的 一 个 全 局 名 字 空 间 名 字 )。 如 果 有 目 标 名 字 的 一 个 暴 露 的 命 令 已 经 存 在 , 这 个 命 令 失 败 。 隐 藏 命 令 的 详 情 参 见 下 面 的 HIDDEN COMMANDS (隐 藏 命 令 )章 节 。
slave
hide exposedCmdName ?hiddenCmdName? 这 个 命 令 隐 藏 在 从 解 释 器 中 暴 露 的 命 令 exposedCmdName, 并 把 它 重 命 名 成 隐 藏 命 令 hiddenCmdName, 如 果 未 给 出 hiddenCmdName 则 保 持 相 同 的 名 字 。 如 果 有 目 标 名 字 的 一 个 隐 藏 的 命 令 已 经 存 在 , 这 个 命 令 失 败 。 目 前 exposedCmdNamehiddenCmdName二 者 不 能 不 能 包 含 名 字 空 间 限 定 符 , 否 则 将 引 发 一 个 错 误 。 即 使 当 前 名 字 空 间 不 是 全 局 名 字 空 间 , 仍 在 全 局 名 字 空 间 中 查 找 要 被 隐 藏 的 命 令 。 这 防 止 从 解 释 器 通 过 使 当 前 的 名 字 空 间 不 同 于 全 局 名 字 空 间 (的 方 式 ), 来 愚 弄 主 解 释 器 去 隐 藏 错 误 的 命 令 。 隐 藏 命 令 的 详 情 参 见 下 面 的 HIDDEN COMMANDS (隐 藏 命 令 )章 节 。
slave
hidden 返 回 在 slave 中 所 有 隐 藏 的 名 字 的 一 个 列 表 。
slave
invokehidden ?-global hiddenName ?arg ..? 这 个 命 令 在 slave 中 用 提 供 的 参 数 调 用 隐 藏 的 命 令 hiddenName。 对 这 些 参 数 不 进 行 求 值 或 替 换 。 如 果 给 出 了 -global标 志 , 则 在 这 个 从 解 释 器 的 全 局 层 次 上 调 用 这 个 命 令 ; 否 则 在 当 前 调 用 框 架 上 调 用 它 并 可 访 问 这 个 调 用 框 架 内 部 或 外 部 的 局 部 变 量 。 隐 藏 命 令 的 详 情 参 见 下 面 的 HIDDEN COMMANDS (隐 藏 命 令 )章 节 。
slave
issafe 如 果 从 解 释 器 是 安 全 的 则 返 回 1, 否 则 返 回 0
slave
marktrusted 标 记 从 解 释 器 为 可 以 信 任 的 。 只 可 以 被 可 信 任 的 解 释 器 调 用 。 这 个 命 令 不 暴 露 在 这 个 从 解 释 器 中 的 任 何 隐 含 命 令 。 如 果 这 个 命 令 已 经 是 可 以 信 任 的 了 , 则 这 个 命 令 没 有 影 响 。

安 全 解 释 器 SAFE INTERPRETERS

一 个 安 全 解 释 器 是 一 个 功 能 受 限 制 的 解 释 器 , 所 以 执 行 从 最 恶 毒 的 敌 人 那 里 来 的 任 意 脚 本 都 是 安 全 的 而 不 用 害 怕 这 个 脚 本 毁 坏 包 围 它 的 (enclosing)应 用 或 你 的 计 算 环 境 的 其 余 部 分 。 要 使 一 个 解 释 器 安 全 , 要 从 这 个 解 释 器 中 删 除 特 定 的 命 令 和 变 量 。 例 如 , 删 除 在 磁 盘 上 建 立 文 件 的 命 令 , 和 删 除 exec命 令 , 因 为 它 可 通 过 子 进 程 导 致 破 坏 。 通 过 建 立 到 主 解 释 器 的 别 名 , 它 小 心 的 检 查 它 们 的 参 数 并 提 供 对 设 施 的 一 个 安 全 子 集 的 受 限 制 的 访 问 , 可 以 提 供 对 这 些 设 施 的 有 限 的 访 问 。 例 如 , 在 一 个 特 定 的 子 目 录 中 允 许 文 件 建 立 , 和 允 许 对 仔 细 选 择 的 和 一 个 固 定 的 程 序 的 集 合 的 子 进 程 调 用 。 通 过 给 interp create 命 令 指 定 -safe开 关 来 建 立 一 个 安 全 的 解 释 器 。 进 而 , 一 个 安 全 解 释 器 建 立 的 任 何 从 解 释 器 都 是 安 全 的 。 建 立 的 安 全 解 释 器 准 确 的 有 下 列 的 内 置 的 命 令 集 :

after append array binary break case catch clock close concat continue eof error eval expr fblocked fcopy fileevent flush for foreach format gets global history 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 trace unset update uplevel upvar variable vwait while

interp create 建 立 一 个 安 全 解 释 器 时 下 列 命 令 是 隐 藏 的 : cd

exec

exit

fconfigure file

glob

load

open pwd

socket

source

vwait 以 后 这 些 命 令 可 以 作 为 Tcl 过 程 或 别 名 来 重 新 建 立 , 或 用 interp expose暴 露 出 来 。 除 此 之 外 , 在 一 个 安 全 解 释 器 中 不 存 在 env变 量 , 所 以 不 能 同 其 他 解 释 器 共 享 环 境 变 量 。 env 变 量 可 能 造 成 一 次 安 全 冒 险 , 因 为 用 户 可 能 在 某 个 环 境 变 量 中 存 储 敏 感 信 息 。 例 如 , PGP 手 册 建 议 在 环 境 变 量 PGPPASS 中 存 储 PGP 私 有 密 钥 。 让 不 可 信 任 代 码 可 以 在 安 全 解 释 器 中 访 问 这 个 变 量 将 招 致 一 次 安 全 冒 险 。 如 果 扩 展 被 装 载 到 安 全 解 释 器 中 , 它 们 也 可 以 限 制 它 们 自 己 功 能 来 排 除 不 安 全 的 命 令 。 对 扩 展 的 安 全 性 的 管 理 的 讨 论 参 见 Safe-Tclload Tcl 命 令 的 手 册 条 目 。

别 名 调 用 ALIAS INVOCATION

精 心 的 设 计 了 别 名 机 制 , 所 以 在 安 全 的 从 解 释 器 中 执 行 不 可 信 任 的 脚 本 是 安 全 的 而 别 名 的 目 标 是 一 个 可 信 任 的 主 解 释 器 。 最 保 证 安 全 性 的 最 重 要 的 事 情 是 确 保 从 从 解 释 器 传 递 到 主 解 释 器 的 信 息 在 主 解 释 器 中 永 不 被 求 值 或 替 换 ; 如 果 这 种 情 况 发 生 了 , 它 将 开 启 在 从 解 释 器 中 的 某 个 邪 恶 的 脚 本 来 在 主 解 释 器 中 调 用 任 意 函 数 , 这 将 危 及 安 全 。 当 从 解 释 器 中 调 用 一 个 别 名 的 源 (命 令 )的 时 候 , 在 分 析 这 个 命 令 时 进 行 常 规 的 Tcl 替 换 。 在 源 解 释 器 中 完 成 这 些 替 换 , 就 象 对 在 这 个 解 释 器 中 的 调 用 的 其 他 命 令 一 样 。 源 命 令 的 命 令 过 程 接 受 它 的 参 数 并 把 它 们 与 给 这 个 别 名 的 targetCmdargs 融 合 起 来 建 立 一 个 新 的 参 数 数 组 。 如 果 srcCmd的 字 是 ’’srcCmd arg1 arg2 ... argN’’, 则 新 的 字 集 将 是 ’’targetCmd arg arg ... arg arg1 arg2 ... argN’’。 这 里 的 targetCmdargs 是 在 建 立 别 名 的 时 候 提 供 的 值 。 接 着 用 TargetCmd来 在 目 标 解 释 器 中 定 位 (locate)一 个 命 令 过 程 , 并 且 用 新 的 参 数 集 来 调 用 这 个 命 令 过 程 。 如 果 在 目 标 解 释 器 中 没 有 叫 做 targetCmd 的 命 令 则 发 生 一 个 错 误 。 在 这 个 字 上 不 进 行 补 充 的 替 换 :不 通 过 常 规 的 Tcl 求 值 机 制 , 直 接 调 用 目 标 命 令 过 程 。 所 以 在 每 个 字 上 精 确 的 进 行 一 次 替 换 : 在 分 析 建 立 这 个 别 名 的 命 令 的 时 候 替 换 targetCmdargs, 当 在 源 解 释 器 中 分 析 这 个 别 名 的 源 命 令 的 时 候 替 换 arg1 - argN。 在 安 全 解 释 器 中 给 别 名 写 targetCmds 的 时 候 , 给 它 的 参 数 永 远 不 被 求 值 或 替 换 是 非 常 重 要 的 , 因 为 这 将 提 供 一 种 逃 逸 机 制 , 使 从 解 释 器 可 以 执 行 在 主 解 释 器 中 的 任 意 代 码 。 这 将 危 及 系 统 的 安 全 。

隐 藏 命 令 HIDDEN COMMANDS

安 全 解 释 器 严 重 的 限 制 了 在 其 中 执 行 的 Tcl 程 序 可 获 得 的 功 能 。 允 许 不 可 信 任 的 Tcl 程 序 访 问 这 些 功 能 是 不 安 全 的 , 因 为 它 们 可 以 在 这 个 环 境 中 被 用 于 各 种 攻 击 。 但 是 , 有 时 在 安 全 解 释 器 的 上 下 文 中 有 使 用 危 险 的 功 能 的 合 理 需 要 。 例 如 , 有 时 一 个 程 序 必 须 source 到 解 释 器 中 。 另 一 个 例 子 是 Tk, 在 这 里 窗 口 被 绑 定 到 与 一 个 特 定 解 释 器 关 联 的 窗 口 层 次 当 中 ; 一 些 潜 在 的 危 险 函 数 , 比 如 窗 口 管 理 , 必 须 在 这 个 解 释 器 上 下 文 中 的 那 些 窗 口 上 进 行 。

interp 命 令 提 供 了 对 这 个 问 题 的 一 种 隐 藏 命 令 形 式 的 解 决 方 案 。 不 是 从 安 全 解 释 器 中 整 个 的 删 除 危 险 的 命 令 , 而 是 隐 藏 这 些 命 令 , 所 以 它 们 变 成 对 在 这 个 解 释 器 中 执 行 的 Tcl 脚 本 是 不 可 获 得 的 。 但 是 , 这 个 安 全 解 释 器 的 任 何 可 信 任 的 祖 先 可 以 使 用 interp invoke, 在 这 个 安 全 解 释 器 的 上 下 文 中 , 调 用 这 些 隐 藏 命 令 。 隐 藏 命 令 和 暴 露 命 令 驻 留 在 分 开 的 名 字 空 间 中 。 在 一 个 解 释 器 中 可 以 定 义 叫 相 同 名 字 的 隐 藏 命 令 和 暴 露 命 令 。 在 别 名 调 用 期 间 , 在 主 解 释 器 中 调 用 的 过 程 体 中 可 以 调 用 在 从 解 释 器 中 的 隐 藏 命 令 。 例 如 , 在 一 个 从 解 释 器 中 可 以 给 source 建 立 一 个 别 名 。 当 在 这 个 从 解 释 器 中 调 用 它 的 时 候 , 调 用 在 主 解 释 器 中 的 一 个 过 程 来 检 查 这 个 操 作 是 否 是 允 许 的 (比 如 , 是 否 允 许 这 个 从 解 释 器 访 问 的 它 要 求 source 的 文 件 )。 接 着 这 个 过 程 在 从 解 释 器 中 调 用 隐 藏 的 source命 令 来 实 际 装 载 (source)这 个 文 件 的 内 容 。 注 意 在 从 解 释 器 中 存 在 来 着 两 个 叫 source 的 命 令 : 别 名 和 隐 藏 命 令 。 因 为 一 个 主 解 释 器 可 以 把 调 用 一 个 隐 藏 命 令 作 为 处 理 一 个 别 名 调 用 的 一 部 分 , 必 须 非 常 小 心 的 避 免 对 通 过 别 名 调 用 传 递 来 的 任 何 参 数 进 行 求 值 。 否 则 , 恶 意 的 从 解 释 器 可 以 导 致 一 个 可 信 任 的 代 表 它 们 来 执 行 危 险 的 命 令 。 这 个 主 题 的 完 整 讨 论 参 见 ALIAS INVOCATION (别 名 调 用 )章 节 。 要 避 免 这 个 问 题 , 对 interp invokehidden的 参 数 不 要 进 行 替 换 或 求 值 。 不 允 许 安 全 解 释 器 调 用 它 自 身 中 或 它 后 代 中 的 隐 藏 命 令 。 这 防 止 安 全 从 解 释 器 访 问 在 自 身 中 或 它 们 的 后 代 中 的 隐 藏 命 令 。 一 个 可 信 任 的 解 释 器 可 以 使 用 interp exposeinterp hide 来 操 纵 一 个 解 释 器 中 的 隐 藏 命 令 的 集 合 。 interp expose 命 令 把 在 用 path 标 识 的 解 释 器 中 一 个 隐 藏 命 令 移 动 到 暴 露 命 令 的 集 合 中 , 在 这 个 过 程 中 可 能 重 命 名 这 个 命 令 。 如 果 叫 目 标 名 字 的 一 个 暴 露 的 命 令 已 经 存 在 , 这 个 操 作 失 败 。 类 似 的 , interp hide 把 在 这 个 解 释 器 中 的 一 个 暴 露 命 令 移 动 到 隐 藏 命 令 的 集 合 中 。 不 允 许 安 全 解 释 器 在 它 自 身 中 或 它 的 后 代 中 的 隐 藏 命 令 和 暴 露 命 令 的 集 合 之 间 移 动 命 令 。 目 前 , 隐 藏 命 令 的 名 字 不 能 包 含 名 字 空 间 限 定 符 , 并 且 在 你 可 以 隐 藏 它 之 前 必 须 首 先 把 在 一 个 名 字 空 间 中 的 命 令 重 命 令 到 全 局 名 字 空 中 。 在 全 局 名 字 空 间 中 查 找 要 被 interp hide 隐 藏 的 命 令 。 这 防 止 从 解 释 器 通 过 使 当 前 的 名 字 空 间 不 同 于 全 局 名 字 空 间 (的 方 式 ), 来 愚 弄 主 解 释 器 去 隐 藏 错 误 的 命 令 。

感 谢 CREDITS

这 个 机 制 基 于 由 Nathaniel Borenstein 和 Marshall Rose 实 现 的 Safe-Tcl 原 型 。

参 见 SEE ALSO

load(n), safe(n), Tcl_CreateSlave(3)

关 键 字 KEYWORDS

alias, master interpreter, safe interpreter, slave interpreter

[中 文 版 维 护 人 ]

寒 蝉 退 士

[中 文 版 最 新 更 新 ]

2001/10/09

《 中 国 Linux 论 坛 man 手 册 页 翻 译 计 划 》 :

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh