sshscript 4.0.1__tar.gz → 4.0.2__tar.gz
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.
- {sshscript-4.0.1 → sshscript-4.0.2}/API_GUIDE.md +15 -13
- {sshscript-4.0.1 → sshscript-4.0.2}/CHANGELOG.md +10 -0
- {sshscript-4.0.1/src/sshscript.egg-info → sshscript-4.0.2}/PKG-INFO +8 -6
- {sshscript-4.0.1 → sshscript-4.0.2}/README.md +7 -5
- {sshscript-4.0.1 → sshscript-4.0.2}/VERSIONING.md +4 -4
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/_version.py +1 -1
- {sshscript-4.0.1 → sshscript-4.0.2/src/sshscript.egg-info}/PKG-INFO +8 -6
- {sshscript-4.0.1 → sshscript-4.0.2}/tools/sync_api_guide.py +1 -1
- {sshscript-4.0.1 → sshscript-4.0.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/.github/dependabot.yml +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/.github/pull_request_template.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/.github/workflows/ci.yml +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/.github/workflows/codeql.yml +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/.github/workflows/release.yml +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/.gitignore +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/CODE_OF_CONDUCT.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/CONTRIBUTING.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/EXCEPTIONS.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/LICENSE.txt +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/MANIFEST.in +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/RELEASING.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/SECURITY.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/SUPPORT.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/pyproject.toml +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/setup.cfg +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/_sshscript_cli.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/__init__.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/__init__.pyi +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/_runtime.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/channelgeneric.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/channelssh.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/channelsubprocess.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/channelutils.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/commandjob.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/commandjob.pyi +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/commandresult.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/commandresult.pyi +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/consolejob.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/dollar.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/dollarchanger.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/dollarparser.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/errorutils.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/patching.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/py.typed +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/session.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/session.pyi +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/sessionsettings.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/sessionwrapper.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/sessionwrapper.pyi +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/spyimporter.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/sshconfig.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/sshscript.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/stdio.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/tokenparser.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/README.console-authentication.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/README.console-results.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/README.dollar-syntax-tests.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/README.module-tests.md +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/check_package_asserts.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/dollar_syntax.spy +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/dollar_syntax_fixture.spy +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/language_fixture.spy +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_channelgeneric_expect.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_check_file.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_command_api.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_command_job.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_console_authentication.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_console_job.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_console_results.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_dollar_command_escapes.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_file_transfer.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_logger_api.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_logger_integration.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_native_auth_runner.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_native_console_authentication.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_openssh_integration.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_production_contract.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_public_types.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_python_version.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_recommended_examples.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_release_inputs.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_session_close_reporting.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_session_proxy_cleanup.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_session_settings.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_spy_source_mapping.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_spy_thread_session.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_ssh_config.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_ssh_security.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_sshscript_dollar_syntax.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_sshscript_module.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_stdin_contract.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_stdio_dynamic_string.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_syntax_error.spy +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_update_check.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_version_policy.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript.egg-info/SOURCES.txt +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript.egg-info/dependency_links.txt +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript.egg-info/entry_points.txt +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript.egg-info/requires.txt +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript.egg-info/top_level.txt +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/tools/check_baseline_examples.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/tools/check_public_types.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/tools/check_release.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/tools/prepare_release.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/tools/publish_release.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/tools/run_checks.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/tools/run_native_auth_ci.py +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/tools/setup_openssh_ci.sh +0 -0
- {sshscript-4.0.1 → sshscript-4.0.2}/tools/version_policy.py +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Recommended SSHScript API
|
|
2
2
|
|
|
3
3
|
This is the canonical entry point for new code and AI-generated examples.
|
|
4
|
-
**Current contract: 4.0.
|
|
5
|
-
SSHScript 4.0.
|
|
4
|
+
**Current contract: 4.0.2**, Python 3.11+. Sections marked **4.0** require
|
|
5
|
+
SSHScript 4.0.2; installing `sshscript==3.1.5` does not provide them.
|
|
6
6
|
Examples labelled 3.1.5 remain verified compatibility examples for that baseline.
|
|
7
7
|
Pin the exact artifact version and record it with execution diagnostics when
|
|
8
8
|
handing off automation. See [version policy and migration](VERSIONING.md).
|
|
@@ -29,9 +29,11 @@ identifiers and handoff reports are future work, not a current API guarantee.
|
|
|
29
29
|
| Long-running program | **4.0:** `start(timeout=None)`, `stop()`, `wait()` |
|
|
30
30
|
| Session-wide failure/output policy | **4.0:** `set(...)`, `get(...)`, or matching properties |
|
|
31
31
|
|
|
32
|
-
##
|
|
32
|
+
## One command, one retained result (4.0; compatible with 3.1.5)
|
|
33
33
|
|
|
34
|
-
Install the
|
|
34
|
+
Install the current release with `python -m pip install "sshscript==4.0.2"`.
|
|
35
|
+
For reproducing only the historical compatibility baseline, explicitly install
|
|
36
|
+
`sshscript==3.1.5`; the 4.0 sections require the current release.
|
|
35
37
|
An argv list is one command, not a batch. Shell-looking argument text stays data.
|
|
36
38
|
|
|
37
39
|
<!-- example: {"id":"argv", "profile":"3.1.5", "stdout":"a; b\n"} -->
|
|
@@ -67,7 +69,7 @@ with closing(Session()) as local:
|
|
|
67
69
|
print(f"failed: {error.returncode}")
|
|
68
70
|
```
|
|
69
71
|
|
|
70
|
-
##
|
|
72
|
+
## SSH and optional dollar syntax (4.0; compatible with 3.1.5)
|
|
71
73
|
|
|
72
74
|
Replace the example host with your configured host and verified known-host key.
|
|
73
75
|
CI executes this block with a local SSH protocol fixture in place of the login;
|
|
@@ -99,7 +101,7 @@ print(result.stdout)
|
|
|
99
101
|
|
|
100
102
|
## 4.0: settings and managed jobs
|
|
101
103
|
|
|
102
|
-
Use SSHScript 4.0.
|
|
104
|
+
Use SSHScript 4.0.2 for the following examples. CLI `-v`, `--stderr`, and
|
|
103
105
|
`--debug` override root defaults only for that execution. Child Sessions copy
|
|
104
106
|
their parent's settings. `set()` validates before changing anything; `get()`
|
|
105
107
|
returns a copy. Explicit command options override Session policy.
|
|
@@ -118,7 +120,7 @@ the settings dictionary at creation; the policy object itself is shared, so
|
|
|
118
120
|
custom policies with mutable state must account for reuse. Changing the setting
|
|
119
121
|
does not reconfigure existing connections.
|
|
120
122
|
|
|
121
|
-
<!-- example: {"id":"settings", "profile":"4.0.
|
|
123
|
+
<!-- example: {"id":"settings", "profile":"4.0.2", "stdout":"True\n1\n"} -->
|
|
122
124
|
```python
|
|
123
125
|
from contextlib import closing
|
|
124
126
|
import paramiko
|
|
@@ -140,7 +142,7 @@ semantics; do not combine it with `command_timeout`.
|
|
|
140
142
|
For an indefinite command such as tcpdump, use `start(timeout=None)`. This safe
|
|
141
143
|
local example uses a small Python process instead of capturing network traffic:
|
|
142
144
|
|
|
143
|
-
<!-- example: {"id":"stop", "profile":"4.0.
|
|
145
|
+
<!-- example: {"id":"stop", "profile":"4.0.2", "stdout":"cancelled confirmed\n"} -->
|
|
144
146
|
```python
|
|
145
147
|
from contextlib import closing
|
|
146
148
|
import sys
|
|
@@ -179,7 +181,7 @@ legacy SSH behavior which appended a newline to strings: if a consumer
|
|
|
179
181
|
needs a line, migrate `input=password` to `input=password + "\n"` explicitly.
|
|
180
182
|
Published 3.1.5 still has the legacy SSH behavior.
|
|
181
183
|
|
|
182
|
-
<!-- example: {"id":"exact-stdin", "profile":"4.0.
|
|
184
|
+
<!-- example: {"id":"exact-stdin", "profile":"4.0.2", "stdout":"'abc'\n'abc\\n'\n"} -->
|
|
183
185
|
```python
|
|
184
186
|
from contextlib import closing
|
|
185
187
|
import sys
|
|
@@ -248,7 +250,7 @@ or unpack exactly `stdout, stderr, exitcode`. This changes the released 3.1.5
|
|
|
248
250
|
console contract: old `stdout, stderr = shell(command)` must be migrated.
|
|
249
251
|
Shell calls accept command strings; argv execution belongs to Session.
|
|
250
252
|
|
|
251
|
-
<!-- example: {"id":"shell-result", "profile":"4.0.
|
|
253
|
+
<!-- example: {"id":"shell-result", "profile":"4.0.2", "stdout":"first 0\n"} -->
|
|
252
254
|
```python
|
|
253
255
|
from contextlib import closing
|
|
254
256
|
from sshscript import Session
|
|
@@ -304,7 +306,7 @@ matching: `iter_stdout()` yields chunks, not packets or lines. Put `stop()` in
|
|
|
304
306
|
`finally`, so condition matches, exceptions, and KeyboardInterrupt all trigger
|
|
305
307
|
cleanup. This credential-free example uses a continuous Python process:
|
|
306
308
|
|
|
307
|
-
<!-- example: {"id":"stream-condition", "profile":"4.0.
|
|
309
|
+
<!-- example: {"id":"stream-condition", "profile":"4.0.2", "stdout":"cancelled confirmed\n"} -->
|
|
308
310
|
```python
|
|
309
311
|
from contextlib import closing
|
|
310
312
|
import sys
|
|
@@ -369,7 +371,7 @@ the current Bash console's channel, cwd, environment and identity. It does not
|
|
|
369
371
|
launch through the underlying Session. Ordinary `console(command)` / `$command`
|
|
370
372
|
still waits and returns `CommandResult`; no migration is needed for finite commands.
|
|
371
373
|
|
|
372
|
-
<!-- example: {"id":"console-stream", "profile":"4.0.
|
|
374
|
+
<!-- example: {"id":"console-stream", "profile":"4.0.2", "stdout":"cancelled confirmed\nconsole-alive\n"} -->
|
|
373
375
|
```python
|
|
374
376
|
from contextlib import closing
|
|
375
377
|
import shlex
|
|
@@ -509,7 +511,7 @@ remains available for other authentication prompt formats.
|
|
|
509
511
|
These transcripts require a real local account and its authentication policy;
|
|
510
512
|
they are manual examples, separate from the credential-free CI examples above.
|
|
511
513
|
Read passwords with `getpass` rather than storing them in the script. The new
|
|
512
|
-
behavior requires 4.0.
|
|
514
|
+
behavior requires 4.0.2 and does not apply to the installed 3.1.5 release.
|
|
513
515
|
|
|
514
516
|
Open a root console through sudo and allow up to 15 seconds for entry:
|
|
515
517
|
|
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
This project records user-visible changes here. Release artifacts and their
|
|
4
4
|
provenance are available from the linked GitHub Release and PyPI pages.
|
|
5
5
|
|
|
6
|
+
## 4.0.2 — 2026-10-09
|
|
7
|
+
|
|
8
|
+
- Align the README, current installation commands, website title, navigation,
|
|
9
|
+
footer, and version metadata with the current 4.0 release.
|
|
10
|
+
- Point general PyPI and GitHub Release links to current entry points; retain
|
|
11
|
+
explicitly labelled historical releases and existing documentation URLs.
|
|
12
|
+
- Check current website version labels and release links during documentation
|
|
13
|
+
validation, including rendered header/footer links and anchors.
|
|
14
|
+
- Preserve the 4.0.1 public execution contract; no runtime behavior changes.
|
|
15
|
+
|
|
6
16
|
## 4.0.1 — 2026-10-08
|
|
7
17
|
|
|
8
18
|
- Settle the legacy command worker before propagating timeout/transport errors;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sshscript
|
|
3
|
-
Version: 4.0.
|
|
3
|
+
Version: 4.0.2
|
|
4
4
|
Summary: Python automation for local processes, SSH, and SSHScript .spy files
|
|
5
5
|
Author-email: "Yeh, Hsin-Yuan" <iapyeh@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -47,7 +47,7 @@ output and status, distinguish failure from timeout, and make cleanup and
|
|
|
47
47
|
unknown termination explicit. A successful command exit is evidence about
|
|
48
48
|
that command; verify the deployment or other application outcome separately.
|
|
49
49
|
|
|
50
|
-
**Current release:** [4.0.
|
|
50
|
+
**Current release:** [4.0.2](https://github.com/iapyeh/sshscript/releases/tag/v4.0.2)
|
|
51
51
|
(Production/Stable) · **Python:** 3.11 or newer · **Tested:** Python
|
|
52
52
|
3.11–3.14 on Linux and macOS
|
|
53
53
|
|
|
@@ -57,7 +57,8 @@ that command; verify the deployment or other application outcome separately.
|
|
|
57
57
|
[Security](https://github.com/iapyeh/sshscript/security/policy) ·
|
|
58
58
|
[Support](https://github.com/iapyeh/sshscript/blob/release/SUPPORT.md)
|
|
59
59
|
|
|
60
|
-
**Version 4.0.
|
|
60
|
+
**Version 4.0.2** maintains the 4.0 execution contract introduced in 4.0.1.
|
|
61
|
+
This patch aligns the published documentation and installation links.
|
|
61
62
|
Upgrade 3.1.5 automation using the migration guide and application regressions.
|
|
62
63
|
See [version policy and migration](VERSIONING.md) before upgrading automation.
|
|
63
64
|
|
|
@@ -114,7 +115,7 @@ pin SSHScript and all transitive dependencies in your application's lock file.
|
|
|
114
115
|
To install this release explicitly:
|
|
115
116
|
|
|
116
117
|
```sh
|
|
117
|
-
python3 -m pip install "sshscript==
|
|
118
|
+
python3 -m pip install "sshscript==4.0.2"
|
|
118
119
|
```
|
|
119
120
|
|
|
120
121
|
Use `python3 -m pip install --upgrade sshscript` to upgrade. The optional
|
|
@@ -123,7 +124,8 @@ it never installs an update by itself.
|
|
|
123
124
|
|
|
124
125
|
## 60-second local quickstart
|
|
125
126
|
|
|
126
|
-
This example
|
|
127
|
+
This example runs on 4.0.2 and retains compatibility with the 3.1.5 command API.
|
|
128
|
+
The metadata below records that older compatibility baseline.
|
|
127
129
|
|
|
128
130
|
<!-- example: {"id":"readme-quickstart", "profile":"3.1.5", "stdout":"sshscript is ready\nexit code: 0\n"} -->
|
|
129
131
|
```python
|
|
@@ -374,7 +376,7 @@ Unknown and changed host keys are rejected unless the caller explicitly
|
|
|
374
376
|
supplies a different Paramiko policy. Do not use automatic key acceptance in a
|
|
375
377
|
production workflow unless a separate trusted bootstrap process has already
|
|
376
378
|
verified the key. See the
|
|
377
|
-
[SSHScript
|
|
379
|
+
[SSHScript documentation](https://iapyeh.github.io/sshscript/v3a/) for
|
|
378
380
|
nested connections, timeouts, file transfer, `sudo`, `su`, and interactive
|
|
379
381
|
programs.
|
|
380
382
|
|
|
@@ -16,7 +16,7 @@ output and status, distinguish failure from timeout, and make cleanup and
|
|
|
16
16
|
unknown termination explicit. A successful command exit is evidence about
|
|
17
17
|
that command; verify the deployment or other application outcome separately.
|
|
18
18
|
|
|
19
|
-
**Current release:** [4.0.
|
|
19
|
+
**Current release:** [4.0.2](https://github.com/iapyeh/sshscript/releases/tag/v4.0.2)
|
|
20
20
|
(Production/Stable) · **Python:** 3.11 or newer · **Tested:** Python
|
|
21
21
|
3.11–3.14 on Linux and macOS
|
|
22
22
|
|
|
@@ -26,7 +26,8 @@ that command; verify the deployment or other application outcome separately.
|
|
|
26
26
|
[Security](https://github.com/iapyeh/sshscript/security/policy) ·
|
|
27
27
|
[Support](https://github.com/iapyeh/sshscript/blob/release/SUPPORT.md)
|
|
28
28
|
|
|
29
|
-
**Version 4.0.
|
|
29
|
+
**Version 4.0.2** maintains the 4.0 execution contract introduced in 4.0.1.
|
|
30
|
+
This patch aligns the published documentation and installation links.
|
|
30
31
|
Upgrade 3.1.5 automation using the migration guide and application regressions.
|
|
31
32
|
See [version policy and migration](VERSIONING.md) before upgrading automation.
|
|
32
33
|
|
|
@@ -83,7 +84,7 @@ pin SSHScript and all transitive dependencies in your application's lock file.
|
|
|
83
84
|
To install this release explicitly:
|
|
84
85
|
|
|
85
86
|
```sh
|
|
86
|
-
python3 -m pip install "sshscript==
|
|
87
|
+
python3 -m pip install "sshscript==4.0.2"
|
|
87
88
|
```
|
|
88
89
|
|
|
89
90
|
Use `python3 -m pip install --upgrade sshscript` to upgrade. The optional
|
|
@@ -92,7 +93,8 @@ it never installs an update by itself.
|
|
|
92
93
|
|
|
93
94
|
## 60-second local quickstart
|
|
94
95
|
|
|
95
|
-
This example
|
|
96
|
+
This example runs on 4.0.2 and retains compatibility with the 3.1.5 command API.
|
|
97
|
+
The metadata below records that older compatibility baseline.
|
|
96
98
|
|
|
97
99
|
<!-- example: {"id":"readme-quickstart", "profile":"3.1.5", "stdout":"sshscript is ready\nexit code: 0\n"} -->
|
|
98
100
|
```python
|
|
@@ -343,7 +345,7 @@ Unknown and changed host keys are rejected unless the caller explicitly
|
|
|
343
345
|
supplies a different Paramiko policy. Do not use automatic key acceptance in a
|
|
344
346
|
production workflow unless a separate trusted bootstrap process has already
|
|
345
347
|
verified the key. See the
|
|
346
|
-
[SSHScript
|
|
348
|
+
[SSHScript documentation](https://iapyeh.github.io/sshscript/v3a/) for
|
|
347
349
|
nested connections, timeouts, file transfer, `sudo`, `su`, and interactive
|
|
348
350
|
programs.
|
|
349
351
|
|
|
@@ -9,11 +9,11 @@ claim that a command or deployment is safe or successful.
|
|
|
9
9
|
| Version | Contract and status |
|
|
10
10
|
| --- | --- |
|
|
11
11
|
| 3.1.5 | Published baseline described in API_GUIDE.md; one-shot Session commands return CommandResult, but persistent console calls return two live buffers. |
|
|
12
|
-
| 4.0.
|
|
12
|
+
| 4.0.2 | Production contract: completed console results, settings, managed jobs and authenticated-console handshakes; incompatible with parts of 3.1.5. |
|
|
13
13
|
|
|
14
|
-
Version 4.0.1
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
Version 4.0.1 introduced the published 4.0 contract after release validation.
|
|
15
|
+
Version 4.0.2 is a documentation and link maintenance patch with the same public
|
|
16
|
+
execution contract. Native-system validation limits remain documented.
|
|
17
17
|
Use the normal Python Session API as the canonical entry point; optional .spy
|
|
18
18
|
syntax follows the same versioned execution contract.
|
|
19
19
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sshscript
|
|
3
|
-
Version: 4.0.
|
|
3
|
+
Version: 4.0.2
|
|
4
4
|
Summary: Python automation for local processes, SSH, and SSHScript .spy files
|
|
5
5
|
Author-email: "Yeh, Hsin-Yuan" <iapyeh@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -47,7 +47,7 @@ output and status, distinguish failure from timeout, and make cleanup and
|
|
|
47
47
|
unknown termination explicit. A successful command exit is evidence about
|
|
48
48
|
that command; verify the deployment or other application outcome separately.
|
|
49
49
|
|
|
50
|
-
**Current release:** [4.0.
|
|
50
|
+
**Current release:** [4.0.2](https://github.com/iapyeh/sshscript/releases/tag/v4.0.2)
|
|
51
51
|
(Production/Stable) · **Python:** 3.11 or newer · **Tested:** Python
|
|
52
52
|
3.11–3.14 on Linux and macOS
|
|
53
53
|
|
|
@@ -57,7 +57,8 @@ that command; verify the deployment or other application outcome separately.
|
|
|
57
57
|
[Security](https://github.com/iapyeh/sshscript/security/policy) ·
|
|
58
58
|
[Support](https://github.com/iapyeh/sshscript/blob/release/SUPPORT.md)
|
|
59
59
|
|
|
60
|
-
**Version 4.0.
|
|
60
|
+
**Version 4.0.2** maintains the 4.0 execution contract introduced in 4.0.1.
|
|
61
|
+
This patch aligns the published documentation and installation links.
|
|
61
62
|
Upgrade 3.1.5 automation using the migration guide and application regressions.
|
|
62
63
|
See [version policy and migration](VERSIONING.md) before upgrading automation.
|
|
63
64
|
|
|
@@ -114,7 +115,7 @@ pin SSHScript and all transitive dependencies in your application's lock file.
|
|
|
114
115
|
To install this release explicitly:
|
|
115
116
|
|
|
116
117
|
```sh
|
|
117
|
-
python3 -m pip install "sshscript==
|
|
118
|
+
python3 -m pip install "sshscript==4.0.2"
|
|
118
119
|
```
|
|
119
120
|
|
|
120
121
|
Use `python3 -m pip install --upgrade sshscript` to upgrade. The optional
|
|
@@ -123,7 +124,8 @@ it never installs an update by itself.
|
|
|
123
124
|
|
|
124
125
|
## 60-second local quickstart
|
|
125
126
|
|
|
126
|
-
This example
|
|
127
|
+
This example runs on 4.0.2 and retains compatibility with the 3.1.5 command API.
|
|
128
|
+
The metadata below records that older compatibility baseline.
|
|
127
129
|
|
|
128
130
|
<!-- example: {"id":"readme-quickstart", "profile":"3.1.5", "stdout":"sshscript is ready\nexit code: 0\n"} -->
|
|
129
131
|
```python
|
|
@@ -374,7 +376,7 @@ Unknown and changed host keys are rejected unless the caller explicitly
|
|
|
374
376
|
supplies a different Paramiko policy. Do not use automatic key acceptance in a
|
|
375
377
|
production workflow unless a separate trusted bootstrap process has already
|
|
376
378
|
verified the key. See the
|
|
377
|
-
[SSHScript
|
|
379
|
+
[SSHScript documentation](https://iapyeh.github.io/sshscript/v3a/) for
|
|
378
380
|
nested connections, timeouts, file transfer, `sudo`, `su`, and interactive
|
|
379
381
|
programs.
|
|
380
382
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_native_console_authentication.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|