______________________________________________________________________________
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 手 册 页 翻 译 计 划 》 :
跋
本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh