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, 在 a 中 a11 的 限 定 的 名 字 是 列 表 a1 a11。 下 面 描 述 的 interp命 令 接 受 限 定 的 解 释 器 名 字 作 为 参 数 ; 命 令 在 其 中 求 值 的 解 释 器 总 是 可 以 作 为 {}来 引 用 (空 列 表 或 字 符 串 )。 注 意 除 了 通 过 别 名 之 外 , 在 一 个 从 解 释 器 中 不 可 能 通 过 名 字 引 用 一 个 主 (祖 先 )解 释 器 。 还 有 , 没 有 通 过 它 可 以 引 用 在 应 用 中 建 立 的 第 一 个 解 释 器 的 全 局 名 字 。 这 两 种 限 制 的 目 的 都 是 为 了 安 全 。

INTERP 命 令 COMMAND

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

interp alias srcPath srcCmd 返 回 一 个 Tcl 列 表 , 它 的 元 素 是 与 叫 做 srcCmd的 别 名 有 关 的 targetCmd 和 args(在 建 立 别 名 时 指 定 所 有 这 些 值 ; 在 从 解 释 器 中 实 际 的 源 命 令 如 果 被 重 命 名 的 话 可 能 与 srcCmd 不 同 )。
interp alias
srcPath srcCmd {} 删 除 在 从 解 释 器 中 用 srcPath 标 识 的 给 srcCmd 的 别 名 。 srcCmd 引 用 在 其 下 建 立 别 名 的 名 字 ; 如 果 源 命 令 已 经 被 重 命 名 , 则 删 除 重 命 名 后 的 命 令 。
interp alias
srcPath srcCmd targetPath targetCmd ?arg arg ...? 这 个 命 令 在 一 个 从 解 释 器 和 其 他 解 释 器 之 间 建 立 一 个 别 名 (关 于 在 一 个 从 解 释 器 和 它 的 主 解 释 器 之 间 建 立 别 名 请 参 见 下 面 的 alias 从 命 令 )。 在 这 个 命 令 中 , 两 个 从 解 释 器 可 以 在 调 用 这 个 命 令 的 解 释 器 底 下 的 解 释 器 层 次 中 的 任 何 位 置 。 SrcPath和 srcCmd 标 识 这 个 别 名 的 来 源 。 SrcPath 是 一 个 Tcl 列 表 , 它 的 元 素 选 择 一 个 特 定 的 解 释 器 。 例 如 , “a b”标 识 一 个 解 释 器 b, 它 是 解 释 器 a 的 一 个 从 解 释 器 , a解 释 器 是 调 用 (命 令 )的 解 释 器 的 一 个 从 解 释 器 。 一 个 空 列 表 指 定 调 用 这 个 命 令 的 解 释 器 。 srcCmd给 出 一 个 新 命 令 的 名 字 , 将 在 源 解 释 器 中 建 立 它 。 TargetPath和 targetCmd 指 定 一 个 目 标 解 释 器 和 命 令 , 和 arg 参 数 , 如 果 有 的 话 , 给 targetCmd 指 定 增 补 的 参 数 , 它 们 在 srcCmd 调 用 中 指 定 的 所 有 参 数 的 前 面 。 TargetCmd在 这 个 调 用 的 时 候 可 以 被 取 消 定 义 (undefine)了 , 或 者 它 已 经 存 在 了 ; 它 不 由 这 个 命 令 来 建 立 。 别 名 安 排 在 源 解 释 器 中 调 用 给 定 源 命 令 的 时 候 在 目 标 解 释 器 中 调 用 给 定 目 标 命 令 。 详 情 参 见 下 面 的 ALIAS INVOCATION (别 名 调 用 )章 节 。
interp aliases
?path? 这 个 命 令 返 回 给 在 用 path 表 示 的 解 释 器 中 定 义 的 别 名 的 所 有 源 命 令 的 名 字 一 个 Tcl 列 表 。
interp create
?-safe? ?--? ?path? 建 立 用 path 标 识 的 一 个 从 解 释 器 和 叫 做 从 命 令 (slave command)的 一 个 新 命 令 。 从 命 令 的 名 字 是 path的 最 后 一 个 成 员 。 在 其 中 建 立 新 的 从 解 释 器 和 从 命 令 的 解 释 器 由 从 path 中 去 除 最 后 一 个 成 员 所 获 得 的 路 径 来 标 识 。 例 如 , 如 果 path 是 a 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 脚 本 来 求 值 。 把 这 个 求 值 的 结 果 (如 果 发 生 错 误 的 话 , 包 括 象 errorInfo和 errorCode 变 量 这 样 的 错 误 信 息 )返 回 给 调 用 (命 令 )的 解 释 器 。
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 则 保 持 相 同 的 名 字 。 如 果 有 目 标 名 字 的 一 个 隐 藏 的 命 令 已 │ 经 存 在 , 这 个 命 令 失 败 。 目 前 exposedCmdName 和 hiddenCmdName二 者 不 │ 能 不 能 包 含 名 字 空 间 限 定 符 , 否 则 将 引 发 一 个 错 误 。 即 使 当 前 名 字 空 间 不 │ 是 全 局 名 字 空 间 , 仍 在 全 局 名 字 空 间 中 查 找 要 被 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 是 解 释 器 的 名 字 , command 和 args确 定 这 个 命 令 的 具 体 行 为 。 这 个 命 令 有 效 形 式 有 :
slave
aliases 返 回 一 个 Tcl 列 表 , 它 的 元 素 是 在 slave 中 的 所 有 别 名 的 名 字 。 返 回 的 名 字 是 建 立 别 名 时 使 用 的 srcCmd 的 值 (如 果 它 们 已 经 被 重 命 名 , 则 它 可 以 同 这 个 命 令 的 当 前 的 名 字 不 相 同 )。
slave
alias srcCmd 返 回 一 个 Tcl 列 表 , 它 的 元 素 是 与 叫 做 srcCmd 的 别 名 相 关 的 targetCmd 和 args(在 建 立 这 个 别 名 的 时 候 指 定 所 有 这 些 值 ; 在 从 解 释 器 中 的 实 际 的 源 命 令 如 果 被 重 命 令 则 可 能 与 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 脚 本 来 求 值 。 把 这 个 求 值 的 结 果 (如 果 有 错 误 发 生 , 包 括 象 errorInfo 和 errorCode 变 量 这 样 的 错 误 信 息 )返 回 给 调 用 (命 令 )的 解 释 器 。
slave
expose hiddenName ?exposedCmdName? │ 这 个 命 令 暴 露 在 slave 的 隐 藏 的 命 令 hiddenName, 最 终 把 它 带 回 在 一 个 │ 新 的 exposedCmdName 名 字 之 下 (目 前 只 接 受 没 有 任 何 :: 的 一 个 全 局 名 字 │ 空 间 名 字 )。 如 果 有 目 标 名 字 的 一 个 暴 露 的 命 令 已 经 存 在 , 这 个 命 令 失 │ 败 。 隐 藏 命 令 的 详 情 参 见 下 面 的 HIDDEN COMMANDS (隐 藏 命 令 )章 节 。 │
slave
hide exposedCmdName ?hiddenCmdName? │ 这 个 命 令 隐 藏 在 从 解 释 器 中 暴 露 的 命 令 exposedCmdName, 并 把 它 重 命 名 │ 成 隐 藏 命 令 hiddenCmdName, 如 果 未 给 出 hiddenCmdName 则 保 持 相 同 的 名 │ 字 。 如 果 有 目 标 名 字 的 一 个 隐 藏 的 命 令 已 经 存 在 , 这 个 命 令 失 败 。 目 前 │ exposedCmdName和 hiddenCmdName二 者 不 能 不 能 包 含 名 字 空 间 限 定 符 , 否 │ 则 将 引 发 一 个 错 误 。 即 使 当 前 名 字 空 间 不 是 全 局 名 字 空 间 , 仍 在 全 局 名 字 │ 空 间 中 查 找 要 被 隐 藏 的 命 令 。 这 防 止 从 解 释 器 通 过 使 当 前 的 名 字 空 间 不 同 │ 于 全 局 名 字 空 间 (的 方 式 ), 来 愚 弄 主 解 释 器 去 隐 藏 错 误 的 命 令 。 隐 藏 命 令 │ 的 详 情 参 见 下 面 的 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-Tcl 和 load Tcl 命 令 的 手 册 条 目 。

别 名 调 用 ALIAS INVOCATION

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

隐 藏 命 令 HIDDEN COMMANDS

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

interp 命 令 提 供 了 对 这 个 问 题 的 一 种 隐 藏 命 令 形 式 的 解 决 方 案 。 不 是 从 安 全 解 释 │ 器 中 整 个 的 删 除 危 险 的 命 令 , 而 是 隐 藏 这 些 命 令 , 所 以 它 们 变 成 对 在 这 个 解 释 器 │ 中 执 行 的 Tcl 脚 本 是 不 可 获 得 的 。 但 是 , 这 个 安 全 解 释 器 的 任 何 可 信 任 的 祖 先 可 │ 以 使 用 interp invoke, 在 这 个 安 全 解 释 器 的 上 下 文 中 , 调 用 这 些 隐 藏 命 令 。 隐 │ 藏 命 令 和 暴 露 命 令 驻 留 在 分 开 的 名 字 空 间 中 。 在 一 个 解 释 器 中 可 以 定 义 叫 相 同 名 │ 字 的 隐 藏 命 令 和 暴 露 命 令 。 │ 在 别 名 调 用 期 间 , 在 主 解 释 器 中 调 用 的 过 程 体 中 可 以 调 用 在 从 解 释 器 中 的 隐 藏 命 │ 令 。 例 如 , 在 一 个 从 解 释 器 中 可 以 给 source 建 立 一 个 别 名 。 当 在 这 个 从 解 释 器 │ 中 调 用 它 的 时 候 , 调 用 在 主 解 释 器 中 的 一 个 过 程 来 检 查 这 个 操 作 是 否 是 允 许 的 (比 │ 如 , 是 否 允 许 这 个 从 解 释 器 访 问 的 它 要 求 source 的 文 件 )。 接 着 这 个 过 程 在 从 解 │ 释 器 中 调 用 隐 藏 的 source命 令 来 实 际 装 载 (source)这 个 文 件 的 内 容 。 注 意 在 从 解 │ 释 器 中 存 在 来 着 两 个 叫 source 的 命 令 : 别 名 和 隐 藏 命 令 。 │ 因 为 一 个 主 解 释 器 可 以 把 调 用 一 个 隐 藏 命 令 作 为 处 理 一 个 别 名 调 用 的 一 部 分 , 必 │ 须 非 常 小 心 的 避 免 对 通 过 别 名 调 用 传 递 来 的 任 何 参 数 进 行 求 值 。 否 则 , 恶 意 的 从 │ 解 释 器 可 以 导 致 一 个 可 信 任 的 代 表 它 们 来 执 行 危 险 的 命 令 。 这 个 主 题 的 完 整 讨 论 │ 参 见 ALIAS INVOCATION (别 名 调 用 )章 节 。 要 避 免 这 个 问 题 , 对 interp │ invokehidden的 参 数 不 要 进 行 替 换 或 求 值 。 │ 不 允 许 安 全 解 释 器 调 用 它 自 身 中 或 它 后 代 中 的 隐 藏 命 令 。 这 防 止 安 全 从 解 释 器 访 │ 问 在 自 身 中 或 它 们 的 后 代 中 的 隐 藏 命 令 。 │ 一 个 可 信 任 的 解 释 器 可 以 使 用 interp expose和 interp 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