expect-pty 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/CONTRIBUTING.md +10 -4
- data/README.md +3 -3
- data/docs/RELEASING.md +26 -12
- data/examples/kibitz/README.md +28 -20
- data/examples/kibitz/kibitz.rb +1 -0
- data/lib/expect/version.rb +1 -1
- data/test/integration/README.md +42 -23
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a2677ffa5b928375c26caefd595b51608a9e0e84eef0c923d683eb47229749a2
|
|
4
|
+
data.tar.gz: fe278b8bec5f635e71b0fd7ca9ca41978dbc3ca3eb0d3f82d6f0d6be2afd0282
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 50f8eef04336c2ad673dc0837b78176858c0f903555585f2ab99210b6e950e682af2a4ea64b3ca68b398bffbda07a08a44295097fb98c6b8299bf8db32cb3479
|
|
7
|
+
data.tar.gz: 6ba54b2d1c701272ce73f8b197c53655719868ff63c8aeb6479dccd0da8d2eedaef7e9e16a20adfc7bff7079feecc18efc8a4526cada4d015cd2b6fe6fdedbca
|
data/CHANGELOG.md
CHANGED
data/CONTRIBUTING.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# 参与贡献
|
|
2
2
|
|
|
3
|
-
欢迎中文或英文 issue 和 PR。库的公共 API 名称和错误信息使用英文;库内的责任划分、复杂生命周期和协议解释使用中文,RuboCop
|
|
3
|
+
欢迎中文或英文 issue 和 PR。库的公共 API 名称和错误信息使用英文;库内的责任划分、复杂生命周期和协议解释使用中文,RuboCop
|
|
4
|
+
等工具指令保持原格式。文档以现有文件的语言为准,示例中的可编辑命令保持直接清晰。
|
|
4
5
|
|
|
5
6
|
## 本地检查
|
|
6
7
|
|
|
@@ -12,12 +13,17 @@ bundle exec rake # RuboCop 和默认测试
|
|
|
12
13
|
script/ci # 另含示例、Gem 构建及隔离安装验证
|
|
13
14
|
```
|
|
14
15
|
|
|
15
|
-
修改转接或匹配时,先运行对应的 `test/*_test.rb`,再运行 `bundle exec rake`。默认测试不需要 SSH;真实 SSH
|
|
16
|
+
修改转接或匹配时,先运行对应的 `test/*_test.rb`,再运行 `bundle exec rake`。默认测试不需要 SSH;真实 SSH
|
|
17
|
+
集成测试的环境要求见 [测试说明](test/integration/README.md)。发布操作和历史验证分别见 [发布说明](docs/RELEASING.md)
|
|
18
|
+
与 [验证记录](docs/VERIFICATION.md)。
|
|
16
19
|
|
|
17
|
-
RuboCop 对生产代码保留有限的长度、ABC、嵌套、参数数量和分支复杂度门槛。测试及基准的场景编排豁免方法长度与 ABC
|
|
20
|
+
RuboCop 对生产代码保留有限的长度、ABC、嵌套、参数数量和分支复杂度门槛。测试及基准的场景编排豁免方法长度与 ABC
|
|
21
|
+
计数;协议状态机的分支豁免只放在对应方法,并注明原因。阈值用于提示复核,职责拆分仍应保持状态归属和异常恢复逻辑完整。
|
|
18
22
|
|
|
19
23
|
## 提交问题或改动
|
|
20
24
|
|
|
21
|
-
问题报告请附 Ruby
|
|
25
|
+
问题报告请附 Ruby
|
|
26
|
+
版本、操作系统、最小复现代码、预期与实际结果,以及必要的异常信息;日志中请删去凭据和会话敏感内容。修复行为缺陷时,先加入能在旧实现复现问题的回归测试。涉及缓冲、转义、背压或进程清理的改动,请对照 [内部状态与数据归属](docs/INTERNAL_CONTRACTS.md)
|
|
27
|
+
,说明超时、EOF 和失败后的恢复行为。
|
|
22
28
|
|
|
23
29
|
PR 请说明行为变化、运行过的命令及结果。不要把本机生成的 `tmp/`、日志或凭据加入提交。
|
data/README.md
CHANGED
|
@@ -16,7 +16,7 @@ RubyGems/Bundler 解析。推荐入口 **`require "expect/pty"`**;本项目提
|
|
|
16
16
|
项目和仓库名为 `expect-ruby`,Gem 名为 `expect-pty`。在应用的 Gemfile 中添加以下内容,然后运行 `bundle install`:
|
|
17
17
|
|
|
18
18
|
```ruby
|
|
19
|
-
gem "expect-pty", "~> 0.5.
|
|
19
|
+
gem "expect-pty", "~> 0.5.2", require: "expect/pty"
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
也可直接执行 `gem install expect-pty`。需要跟随开发分支时,可从 GitHub 安装:
|
|
@@ -29,8 +29,8 @@ gem "expect-pty", git: "https://github.com/gatework/expect-ruby.git", branch: "m
|
|
|
29
29
|
|
|
30
30
|
```sh
|
|
31
31
|
mkdir -p tmp
|
|
32
|
-
gem build expect-pty.gemspec --output tmp/expect-pty-0.5.
|
|
33
|
-
gem install ./tmp/expect-pty-0.5.
|
|
32
|
+
gem build expect-pty.gemspec --output tmp/expect-pty-0.5.2.gem
|
|
33
|
+
gem install ./tmp/expect-pty-0.5.2.gem
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
```ruby
|
data/docs/RELEASING.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# 发布版本
|
|
2
2
|
|
|
3
|
-
项目名为 `expect-ruby`,RubyGems 名为 `expect-pty`。使用 `script/release.rb --rubygems-only` 可仅发布 RubyGems;不加该选项时还会创建
|
|
3
|
+
项目名为 `expect-ruby`,RubyGems 名为 `expect-pty`。使用 `script/release.rb --rubygems-only` 可仅发布 RubyGems;不加该选项时还会创建
|
|
4
|
+
GitHub Release,附带同一个 Gem 和 `SHA256SUMS`。生成文件统一放在已被 Git 忽略的 `tmp/` 下。
|
|
4
5
|
|
|
5
6
|
## 准备版本
|
|
6
7
|
|
|
@@ -12,7 +13,8 @@
|
|
|
12
13
|
|
|
13
14
|
## 仅发布 RubyGems
|
|
14
15
|
|
|
15
|
-
本地已登录 `gem` 时,脚本直接使用已有凭据。如果 RubyGems 要求一次性验证码,`gem push` 会提示输入。此模式不调用 `gh`,不要求推送到
|
|
16
|
+
本地已登录 `gem` 时,脚本直接使用已有凭据。如果 RubyGems 要求一次性验证码,`gem push` 会提示输入。此模式不调用 `gh`,不要求推送到
|
|
17
|
+
GitHub,也不创建标签或 GitHub Release。
|
|
16
18
|
|
|
17
19
|
```sh
|
|
18
20
|
bundle install
|
|
@@ -20,9 +22,13 @@ ruby script/release.rb --rubygems-only --dry-run
|
|
|
20
22
|
ruby script/release.rb --rubygems-only
|
|
21
23
|
```
|
|
22
24
|
|
|
23
|
-
默认执行 `script/ci` 的检查、完整测试、构建和隔离安装验证,构建包保存在 `tmp/ci/expect-pty-版本号.gem`。随后复制到
|
|
25
|
+
默认执行 `script/ci` 的检查、完整测试、构建和隔离安装验证,构建包保存在 `tmp/ci/expect-pty-版本号.gem`。随后复制到
|
|
26
|
+
`tmp/release/版本号/candidate-*/` 的独占目录,核对包内文件并生成发布说明和校验文件。该副本贯穿后续发布,目录会保留供失败重试。正式发布前再次确认源码未变,上传
|
|
27
|
+
RubyGems 后下载远端包核对 SHA256。
|
|
24
28
|
|
|
25
|
-
正式发布逐个核对包内普通文件在目标 Git 提交中的存在性、原始字节和执行权限,同时核对 gemspec
|
|
29
|
+
正式发布逐个核对包内普通文件在目标 Git 提交中的存在性、原始字节和执行权限,同时核对 gemspec 的安装元数据及主页。
|
|
30
|
+
`git status` 为空不能替代这一检查:忽略规则可能隐藏被 glob 收入包的本地文件,`assume-unchanged` 和 `core.filemode`
|
|
31
|
+
也可能隐藏差异。候选包必须与已提交源码一致。
|
|
26
32
|
|
|
27
33
|
`--dry-run` 只做本地验证,可在提交前使用。它仍要求版本号和发布说明完整。
|
|
28
34
|
|
|
@@ -35,11 +41,13 @@ ruby script/release.rb --dry-run
|
|
|
35
41
|
ruby script/release.rb
|
|
36
42
|
```
|
|
37
43
|
|
|
38
|
-
正式发布先创建 GitHub Release,再上传 RubyGems,最后下载 RubyGems 上的包核对 SHA256。GitHub 上还没有标签时,会为当前提交创建
|
|
44
|
+
正式发布先创建 GitHub Release,再上传 RubyGems,最后下载 RubyGems 上的包核对 SHA256。GitHub 上还没有标签时,会为当前提交创建
|
|
45
|
+
`v版本号` 标签。
|
|
39
46
|
|
|
40
47
|
## GitHub Actions 发布
|
|
41
48
|
|
|
42
|
-
GitHub Runner 不会继承本机的 Gem 登录状态。要在 Actions 发布 RubyGems,需在仓库的 Settings → Secrets and variables →
|
|
49
|
+
GitHub Runner 不会继承本机的 Gem 登录状态。要在 Actions 发布 RubyGems,需在仓库的 Settings → Secrets and variables →
|
|
50
|
+
Actions 中配置 `RUBYGEMS_API_KEY`,使用具有 `Push rubygem` 权限的发布 Key。
|
|
43
51
|
|
|
44
52
|
```sh
|
|
45
53
|
git tag -a v0.3.3 -m 'Release v0.3.3'
|
|
@@ -49,22 +57,28 @@ gh workflow run release.yml --ref v0.3.3 --repo gatework/expect-ruby
|
|
|
49
57
|
|
|
50
58
|
也可以在 Actions → Release → Run workflow 选择对应版本标签。工作流仅支持手动触发,避免本地发布时出现第二次并发上传。
|
|
51
59
|
|
|
52
|
-
发布作业先验证标签与版本号一致,再复用 CI 的 Linux/macOS、Ruby 3.2/3.3/3.4/4.0 共 8 个环境。全部通过后,下载 Ubuntu / Ruby
|
|
60
|
+
发布作业先验证标签与版本号一致,再复用 CI 的 Linux/macOS、Ruby 3.2/3.3/3.4/4.0 共 8 个环境。全部通过后,下载 Ubuntu / Ruby
|
|
61
|
+
4.0 作业验证过的 Gem,交给同一个发布脚本;发布阶段不重新构建。
|
|
53
62
|
|
|
54
63
|
未配置 `RUBYGEMS_API_KEY` 时,GitHub Release 仍会创建,RubyGems 步骤会明确失败;此时可以下载 Release 中的原包,在本地使用已有登录状态完成上传。
|
|
55
64
|
|
|
56
65
|
## 失败后继续
|
|
57
66
|
|
|
58
|
-
保留脚本输出的 `Artifact` 路径,用该候选 Gem 重试发布;更换 RubyGems 工具版本或重新构建可能得到不同字节,同一个版本不得覆盖已有内容。也可以直接指定从
|
|
67
|
+
保留脚本输出的 `Artifact` 路径,用该候选 Gem 重试发布;更换 RubyGems 工具版本或重新构建可能得到不同字节,同一个版本不得覆盖已有内容。也可以直接指定从
|
|
68
|
+
CI 或 Release 下载的原包:
|
|
59
69
|
|
|
60
70
|
```sh
|
|
61
71
|
ruby script/release.rb --rubygems-only --artifact tmp/ci/expect-pty-0.3.3.gem
|
|
62
72
|
```
|
|
63
73
|
|
|
64
|
-
将示例路径替换为实际输出的 `Artifact` 路径。`--artifact` 会跳过构建和测试,但仍核对包与当前源码是否一致;需要同时恢复
|
|
74
|
+
将示例路径替换为实际输出的 `Artifact` 路径。`--artifact` 会跳过构建和测试,但仍核对包与当前源码是否一致;需要同时恢复
|
|
75
|
+
GitHub Release 时去掉 `--rubygems-only`。
|
|
65
76
|
|
|
66
|
-
工作流失败时优先使用 Re-run failed jobs,继续使用本次 CI 保存的产物。需要在本地恢复时,检出发布标签对应的干净源码,下载该
|
|
77
|
+
工作流失败时优先使用 Re-run failed jobs,继续使用本次 CI 保存的产物。需要在本地恢复时,检出发布标签对应的干净源码,下载该
|
|
78
|
+
Release 的 Gem,再通过 `--artifact` 指定它。
|
|
67
79
|
|
|
68
|
-
脚本会校验现有 RubyGems 版本和 GitHub Release 附件的 SHA256;一致时复用,不一致时中止。已有 GitHub Release
|
|
80
|
+
脚本会校验现有 RubyGems 版本和 GitHub Release 附件的 SHA256;一致时复用,不一致时中止。已有 GitHub Release
|
|
81
|
+
缺少附件时会补传,已有版本和附件不会被覆盖。
|
|
69
82
|
|
|
70
|
-
上传中断若留下 `starter` 状态的空附件,脚本会明确指出附件名称。先确认没有其他发布或上传在运行,再在 GitHub Release
|
|
83
|
+
上传中断若留下 `starter` 状态的空附件,脚本会明确指出附件名称。先确认没有其他发布或上传在运行,再在 GitHub Release
|
|
84
|
+
中删除该失败附件,使用原包重试;脚本不会自动删除可能仍在上传的附件。
|
data/examples/kibitz/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# 本地 Kibitz 示例与测试
|
|
2
2
|
|
|
3
|
-
参考 [Expect.pm 的 kibitz](https://github.com/jacoby/expect.pm/tree/master/examples/kibitz),使用本项目的 `Expect.open`
|
|
3
|
+
参考 [Expect.pm 的 kibitz](https://github.com/jacoby/expect.pm/tree/master/examples/kibitz),使用本项目的 `Expect.open`
|
|
4
|
+
块、`listeners=`、`on_sequence` 和 `Expect.interconnect` 连接两端输入与同一个交互进程。参考源码为上游提交
|
|
5
|
+
`2ea0e4ce20a896c95cb4c94e781f1b1f3145150d`。
|
|
4
6
|
|
|
5
7
|
需要 Ruby 3.2+ 和 macOS/Linux。示例和自动脚本只依赖标准库,不需要 SSH 服务或密码。
|
|
6
8
|
|
|
@@ -12,7 +14,8 @@
|
|
|
12
14
|
ruby examples/kibitz/kibitz.rb -- /bin/sh -i
|
|
13
15
|
```
|
|
14
16
|
|
|
15
|
-
程序打印一条完整的 `--join /tmp/expect-kibitz-.../peer.sock` 命令。在本机、同一账户的第二个终端执行这条命令,两端即可操作同一个
|
|
17
|
+
程序打印一条完整的 `--join /tmp/expect-kibitz-.../peer.sock` 命令。在本机、同一账户的第二个终端执行这条命令,两端即可操作同一个
|
|
18
|
+
shell。输入和输出在两端都可见,例如:
|
|
16
19
|
|
|
17
20
|
```sh
|
|
18
21
|
# 第一个终端设置 shell 变量
|
|
@@ -21,7 +24,8 @@ shared_value=42
|
|
|
21
24
|
printf '%s\n' "$shared_value"
|
|
22
25
|
```
|
|
23
26
|
|
|
24
|
-
任一端输入 `exit` 结束共享 shell;Ctrl-C 发给共享进程的前台任务。任一端按 Ctrl-] 结束自己的转接并断开连接,另一端随 EOF
|
|
27
|
+
任一端输入 `exit` 结束共享 shell;Ctrl-C 发给共享进程的前台任务。任一端按 Ctrl-] 结束自己的转接并断开连接,另一端随 EOF
|
|
28
|
+
结束。终端配置在退出时恢复。可以通过 `-- program args...` 运行其他交互程序;不传程序时使用 `$SHELL`,缺省 `/bin/sh`。
|
|
25
29
|
|
|
26
30
|
## 无子进程互传和可选参数
|
|
27
31
|
|
|
@@ -39,9 +43,11 @@ ruby examples/kibitz/kibitz.rb --noescape -- /bin/sh -i
|
|
|
39
43
|
ruby examples/kibitz/kibitz.rb --timeout 30 --log /tmp/my-kibitz-session.log -- /bin/sh -i
|
|
40
44
|
```
|
|
41
45
|
|
|
42
|
-
共享进程模式的日志记录该进程实际返回的字节,包括终端回显;无子进程模式记录对端返回的字节。日志使用 0600
|
|
46
|
+
共享进程模式的日志记录该进程实际返回的字节,包括终端回显;无子进程模式记录对端返回的字节。日志使用 0600
|
|
47
|
+
权限。进程正常结束时,发起端返回该进程的退出码;转义或对端 EOF 返回 0,超时或连接失败返回非零。加入端只能观察连接结束,不取得共享进程的退出码。
|
|
43
48
|
|
|
44
|
-
这是同账户本地示例:连接使用 0700 临时目录内的 0600 Unix socket,接受一位加入者后移除 socket,退出时清理目录。原例的用户邀请、跨主机
|
|
49
|
+
这是同账户本地示例:连接使用 0700 临时目录内的 0600 Unix socket,接受一位加入者后移除 socket,退出时清理目录。原例的用户邀请、跨主机
|
|
50
|
+
rlogin、FIFO 以及转义菜单没有移植;双方终端初始尺寸由发起端决定,未实现运行期间的窗口尺寸同步。
|
|
45
51
|
|
|
46
52
|
## 自动运行同样的两个终端流程
|
|
47
53
|
|
|
@@ -51,21 +57,23 @@ ruby examples/kibitz/test_kibitz.rb
|
|
|
51
57
|
bundle exec rake test:kibitz
|
|
52
58
|
```
|
|
53
59
|
|
|
54
|
-
脚本真正启动两份 `kibitz.rb`,通过两个独立 PTY 模拟两位用户,并执行打印出的 Unix socket 加入流程。共享模式运行真实
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
|
58
|
-
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
|
62
|
-
|
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
68
|
-
|
|
60
|
+
脚本真正启动两份 `kibitz.rb`,通过两个独立 PTY 模拟两位用户,并执行打印出的 Unix socket 加入流程。共享模式运行真实
|
|
61
|
+
`/bin/sh -i`,没有 mock 转发逻辑。
|
|
62
|
+
|
|
63
|
+
| 场景 | 检查 |
|
|
64
|
+
|-------------------|-------------------------------------------------------------------------|
|
|
65
|
+
| 共享 shell | 输入回显、双方命令、共享变量、两端输出、中文、stderr、失败后继续执行 |
|
|
66
|
+
| Ctrl-C 与进程 EOF | 第二端中断第一端启动的前台任务,最终输出到达两端,进程退出 |
|
|
67
|
+
| `--noproc` | 双向字节互传,发送端无本地回显 |
|
|
68
|
+
| 自定义转义 | `STOP` 分两次发送,前缀不泄漏,转义和尾部不进入对端 |
|
|
69
|
+
| 加入端转义 | Ctrl-] 关闭加入端,发起端响应 EOF |
|
|
70
|
+
| `--noescape` | Ctrl-] 字节被完整转发 |
|
|
71
|
+
| 非零退出 | 共享 shell 返回 7,发起程序也返回 7 |
|
|
72
|
+
| 超时 | 转接到期返回失败,另一端结束 |
|
|
73
|
+
| 每个场景 | 就绪时已关闭本地回显,退出后两端终端配置恢复,socket 清理、日志权限正确 |
|
|
74
|
+
|
|
75
|
+
每轮结果写入 `tmp/kibitz/` 的独立目录,可用 `EXPECT_LOG_DIR` 指定其他目录。`report.json` 包含各场景检查项与整体 `passed`
|
|
76
|
+
,各场景子目录保留 `session.log`。只有全部检查通过才返回 0。默认测试集还覆盖没有第二端加入时的超时清理:
|
|
69
77
|
|
|
70
78
|
```sh
|
|
71
79
|
bundle exec ruby -Itest test/kibitz_test.rb
|
data/examples/kibitz/kibitz.rb
CHANGED
data/lib/expect/version.rb
CHANGED
data/test/integration/README.md
CHANGED
|
@@ -8,9 +8,11 @@ SSH_HOST=127.0.0.1 SSH_USER=crate ruby test/integration/ssh_scripts.rb
|
|
|
8
8
|
SSH_HOST=127.0.0.1 SSH_USER=crate bundle exec rake test:ssh
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
脚本隐藏读取密码;也支持由运行环境提供 `EXPECT_PASSWORD`。密码不会作为 SSH 命令行参数传递,日志在认证完成后才开启。默认自动测试不连接
|
|
11
|
+
脚本隐藏读取密码;也支持由运行环境提供 `EXPECT_PASSWORD`。密码不会作为 SSH 命令行参数传递,日志在认证完成后才开启。默认自动测试不连接
|
|
12
|
+
SSH、不读取密码。
|
|
12
13
|
|
|
13
|
-
支持 `SSH_PORT`(默认 22)、`EXPECT_LOG_DIR`(日志根目录)、`SSH_KNOWN_HOSTS`。连接非本机主机时,必须提供已有的受信任
|
|
14
|
+
支持 `SSH_PORT`(默认 22)、`EXPECT_LOG_DIR`(日志根目录)、`SSH_KNOWN_HOSTS`。连接非本机主机时,必须提供已有的受信任
|
|
15
|
+
known_hosts,例如:
|
|
14
16
|
|
|
15
17
|
```sh
|
|
16
18
|
SSH_HOST=192.0.2.10 SSH_USER=operator SSH_PORT=22 \
|
|
@@ -18,23 +20,27 @@ SSH_HOST=192.0.2.10 SSH_USER=operator SSH_PORT=22 \
|
|
|
18
20
|
EXPECT_LOG_DIR=tmp/device-check ruby test/integration/ssh_scripts.rb
|
|
19
21
|
```
|
|
20
22
|
|
|
21
|
-
这是 POSIX shell 脚本测试;厂商专用 CLI(如交换机的 `show` 命令、分页提示符)需要对应设备的命令和预期输出,不能直接使用这些
|
|
23
|
+
这是 POSIX shell 脚本测试;厂商专用 CLI(如交换机的 `show` 命令、分页提示符)需要对应设备的命令和预期输出,不能直接使用这些
|
|
24
|
+
shell fixtures。
|
|
22
25
|
|
|
23
26
|
## 同一个登录会话执行的脚本
|
|
24
27
|
|
|
25
|
-
| 脚本
|
|
26
|
-
|
|
27
|
-
| `01_identity.sh` | 当前用户、远端 PTY、完成标记
|
|
28
|
-
| `02_output.sh`
|
|
29
|
-
| `03_delayed.sh`
|
|
30
|
-
| `04_failure.sh`
|
|
31
|
-
| `05_recovery.sh` | 上个脚本失败后继续执行,计算结果为 42 | 0
|
|
28
|
+
| 脚本 | 验证内容 | 预期退出码 |
|
|
29
|
+
|------------------|---------------------------------------|---------------|
|
|
30
|
+
| `01_identity.sh` | 当前用户、远端 PTY、完成标记 | 0 |
|
|
31
|
+
| `02_output.sh` | stdout、stderr、中文和输出顺序 | 0 |
|
|
32
|
+
| `03_delayed.sh` | 分三次延迟输出,确保日志完整 | 0 |
|
|
33
|
+
| `04_failure.sh` | 明确输出错误并退出 | 7(预期失败) |
|
|
34
|
+
| `05_recovery.sh` | 上个脚本失败后继续执行,计算结果为 42 | 0 |
|
|
32
35
|
|
|
33
|
-
fixtures 位于 `test/fixtures/ssh_scripts/`,都不修改目标文件或设备配置。文件内容通过 SSH 的交互 shell 传给独立
|
|
36
|
+
fixtures 位于 `test/fixtures/ssh_scripts/`,都不修改目标文件或设备配置。文件内容通过 SSH 的交互 shell 传给独立
|
|
37
|
+
`/bin/sh -c` 执行,不需要上传文件。每个脚本都有随机开始/结束标记,结束标记携带真实 `$?`;脚本输出和退出码都必须符合预期才算通过。
|
|
34
38
|
|
|
35
|
-
测试关闭终端回显和 shell 行编辑,使用单引号传输完整脚本,保留中文 UTF-8 和引号,避免 C locale 的交互式 readline
|
|
39
|
+
测试关闭终端回显和 shell 行编辑,使用单引号传输完整脚本,保留中文 UTF-8 和引号,避免 C locale 的交互式 readline
|
|
40
|
+
把高位字节当快捷键执行。末尾仍等待 shell 提示符,确认可以继续执行下一项。
|
|
36
41
|
|
|
37
|
-
另外执行两条日志控制命令:关闭日志后输出 `UNLOGGED_OUTPUT`,再以默认追加模式开启日志并输出 `APPEND_OK`。最后发送延迟输出及退出命令,只调用
|
|
42
|
+
另外执行两条日志控制命令:关闭日志后输出 `UNLOGGED_OUTPUT`,再以默认追加模式开启日志并输出 `APPEND_OK`。最后发送延迟输出及退出命令,只调用
|
|
43
|
+
`soft_close`,确认 `SESSION_FINAL_TAIL` 确实在关闭过程中写入日志。
|
|
38
44
|
|
|
39
45
|
## 检查和输出文件
|
|
40
46
|
|
|
@@ -43,11 +49,14 @@ fixtures 位于 `test/fixtures/ssh_scripts/`,都不修改目标文件或设备
|
|
|
43
49
|
- `session.log`:收到的原始数据,以及手工添加的 `[SEND] 脚本名 sha256=...` 和 `[EXIT] 脚本名 status=...`。
|
|
44
50
|
- `report.json`:主机、用户、远端 TTY、每项脚本输出和退出码、校验结果、SSH 退出码、日志字节数及 SHA-256。
|
|
45
51
|
|
|
46
|
-
只有认证后的输出进入日志。Expect 自动记录接收字节,发送的脚本名称和摘要由 `write_log` 明确写入,便于审核执行了哪个
|
|
52
|
+
只有认证后的输出进入日志。Expect 自动记录接收字节,发送的脚本名称和摘要由 `write_log` 明确写入,便于审核执行了哪个
|
|
53
|
+
fixture;fixture 文件中的原文可以用报告内的 SHA-256 核对。
|
|
47
54
|
|
|
48
|
-
共 11 项日志/流程检查:完整输出、执行顺序、即时
|
|
55
|
+
共 11 项日志/流程检查:完整输出、执行顺序、即时
|
|
56
|
+
flush、stdout/stderr、UTF-8、非零退出后恢复、覆盖模式、暂停记录、追加模式、关闭前尾部输出、密码不出现在日志中。另校验日志条目没有重复,日志句柄在停止记录和关闭会话后正确关闭。
|
|
49
57
|
|
|
50
|
-
成功返回进程退出码 0。认证失败、超时、脚本输出错误、意外退出码或日志校验失败均返回非零,并在有报告目录时留下 `passed: false`
|
|
58
|
+
成功返回进程退出码 0。认证失败、超时、脚本输出错误、意外退出码或日志校验失败均返回非零,并在有报告目录时留下 `passed: false`
|
|
59
|
+
的报告。不用仅看到终端输出就判断成功;请查看最终 PASS 和 `report.json` 的 `passed`。
|
|
51
60
|
|
|
52
61
|
## 无需 SSH 的回归测试
|
|
53
62
|
|
|
@@ -56,7 +65,8 @@ bundle exec ruby -Itest test/script_logging_test.rb
|
|
|
56
65
|
bundle exec rake test
|
|
57
66
|
```
|
|
58
67
|
|
|
59
|
-
`test/script_logging_test.rb` 使用真实本地 PTY 执行相同 fixtures,另外验证回调日志、借用 File 日志、错误退出/错误输出的反例、引号和
|
|
68
|
+
`test/script_logging_test.rb` 使用真实本地 PTY 执行相同 fixtures,另外验证回调日志、借用 File 日志、错误退出/错误输出的反例、引号和
|
|
69
|
+
shell 元字符、日志错误上抛,以及超时后继续收集日志。它和 SSH 脚本共享测试 helper,不依赖远端账户。
|
|
60
70
|
|
|
61
71
|
## SSH interact 人工和自动验证
|
|
62
72
|
|
|
@@ -67,13 +77,18 @@ ruby examples/ssh_interact.rb --auto
|
|
|
67
77
|
bundle exec rake test:ssh_interact
|
|
68
78
|
```
|
|
69
79
|
|
|
70
|
-
使用上述同一套 SSH 环境变量和隐藏密码输入。人工模式显示 `EXPECT_SCRIPT_PROMPT>`;输入命令有回显,Ctrl-C 传给远端前台任务。在命令结束、回到
|
|
80
|
+
使用上述同一套 SSH 环境变量和隐藏密码输入。人工模式显示 `EXPECT_SCRIPT_PROMPT>`;输入命令有回显,Ctrl-C 传给远端前台任务。在命令结束、回到
|
|
81
|
+
shell 提示符后按 Ctrl-],会关闭远端回显,执行 `MANUAL_AUTOMATION_RESUMED` 检查,再正常退出 SSH。也支持直接输入 `exit`:成功退出记为
|
|
82
|
+
`completion: remote_exit`,此路径不执行返回 expect 的检查。非零 SSH 退出仍判为失败。
|
|
71
83
|
|
|
72
|
-
`--auto` 创建真实本地 PTY,验证两次 `interact` 接管、当前用户和远端 TTY、stdout/stderr/中文、Ctrl-C、Ctrl-]、转义后的本地尾部不进入
|
|
84
|
+
`--auto` 创建真实本地 PTY,验证两次 `interact` 接管、当前用户和远端 TTY、stdout/stderr/中文、Ctrl-C、Ctrl-]、转义后的本地尾部不进入
|
|
85
|
+
SSH、恢复 `expect` 及终端与监听设置。4 项命令输出和 13 项交互/日志检查全部通过后才返回 0。
|
|
73
86
|
|
|
74
|
-
日志在认证之后开启;每次在 `tmp/ssh-interact/` 新建 0700 目录,保存 0600 的 `session.log` 和 `report.json
|
|
87
|
+
日志在认证之后开启;每次在 `tmp/ssh-interact/` 新建 0700 目录,保存 0600 的 `session.log` 和 `report.json`
|
|
88
|
+
。报告包含检查项、命令输出、SSH 退出码及日志摘要。自动模式也校验日志无重复、退出尾部不丢失、密码不出现在日志中。
|
|
75
89
|
|
|
76
|
-
无需 SSH 的回归位于 `test/interact_test.rb`,覆盖可见输入、Ctrl-C、两次接管、返回自动命令、超时、两端 EOF、回调异常和输出 IO
|
|
90
|
+
无需 SSH 的回归位于 `test/interact_test.rb`,覆盖可见输入、Ctrl-C、两次接管、返回自动命令、超时、两端 EOF、回调异常和输出 IO
|
|
91
|
+
故障时的终端恢复。`test/script_logging_test.rb` 另验证 CRLF 输出边界,包括空输出、末尾有/无换行和多个换行。
|
|
77
92
|
|
|
78
93
|
## `ssh_auto.rb` 环境检查
|
|
79
94
|
|
|
@@ -85,6 +100,10 @@ ruby examples/ssh_auto.rb --no-interact
|
|
|
85
100
|
bundle exec rake test:ssh_auto
|
|
86
101
|
```
|
|
87
102
|
|
|
88
|
-
该示例自动登录 `SSH_HOST`(默认 `127.0.0.1`),用本库的 `write` / `expect` 顺序执行文件顶部的 `COMMANDS`,显示真实输出并检查退出码。默认命令为
|
|
103
|
+
该示例自动登录 `SSH_HOST`(默认 `127.0.0.1`),用本库的 `write` / `expect` 顺序执行文件顶部的 `COMMANDS`,显示真实输出并检查退出码。默认命令为
|
|
104
|
+
`id`、`uname -srm`、`sw_vers`、`df -h /` 和 `uptime`,不修改系统设置;可直接修改数组来下发其他 macOS/POSIX shell 命令。它不依赖
|
|
105
|
+
`test/support`,`ScriptProbe.check` 只供测试脚本使用。
|
|
89
106
|
|
|
90
|
-
执行成功后默认进入 `interact`,输入有回显,Ctrl-C 发给远端前台任务;`exit` 或 Ctrl-] 结束连接。使用 `--no-interact`
|
|
107
|
+
执行成功后默认进入 `interact`,输入有回显,Ctrl-C 发给远端前台任务;`exit` 或 Ctrl-] 结束连接。使用 `--no-interact` 则执行完退出。
|
|
108
|
+
`EXPECT_LOG_DIR` 可指定日志目录,默认 `tmp/ssh-auto/`;每次创建独立 0600 日志,记录命令和远端输出,认证前关闭日志。此使用示例不生成
|
|
109
|
+
JSON 测试报告,详细日志断言仍由 `ssh_scripts.rb` 和 `ssh_interact.rb --auto` 验证。
|