power-ssh 1.0.0__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.
Files changed (39) hide show
  1. power_ssh-1.0.0/LICENSE.md +21 -0
  2. power_ssh-1.0.0/PKG-INFO +376 -0
  3. power_ssh-1.0.0/README.md +360 -0
  4. power_ssh-1.0.0/pyproject.toml +30 -0
  5. power_ssh-1.0.0/setup.cfg +4 -0
  6. power_ssh-1.0.0/src/PowerSsh/__init__.py +8 -0
  7. power_ssh-1.0.0/src/PowerSsh/__main__.py +6 -0
  8. power_ssh-1.0.0/src/PowerSsh/about_page.py +200 -0
  9. power_ssh-1.0.0/src/PowerSsh/check_system.py +521 -0
  10. power_ssh-1.0.0/src/PowerSsh/cli.py +437 -0
  11. power_ssh-1.0.0/src/PowerSsh/domain/__init__.py +3 -0
  12. power_ssh-1.0.0/src/PowerSsh/domain/backup.py +110 -0
  13. power_ssh-1.0.0/src/PowerSsh/domain/dns.py +536 -0
  14. power_ssh-1.0.0/src/PowerSsh/domain/fixconfig.py +161 -0
  15. power_ssh-1.0.0/src/PowerSsh/domain/host.py +200 -0
  16. power_ssh-1.0.0/src/PowerSsh/domain/output.py +58 -0
  17. power_ssh-1.0.0/src/PowerSsh/domain/rcpath.py +230 -0
  18. power_ssh-1.0.0/src/PowerSsh/domain/server.py +258 -0
  19. power_ssh-1.0.0/src/PowerSsh/domain/service.py +147 -0
  20. power_ssh-1.0.0/src/PowerSsh/domain/sudoers.py +172 -0
  21. power_ssh-1.0.0/src/PowerSsh/domain/transfer.py +290 -0
  22. power_ssh-1.0.0/src/PowerSsh/menu_language.py +751 -0
  23. power_ssh-1.0.0/src/PowerSsh/menu_model.py +283 -0
  24. power_ssh-1.0.0/src/PowerSsh/menu_painter.py +566 -0
  25. power_ssh-1.0.0/src/PowerSsh/menu_session.py +136 -0
  26. power_ssh-1.0.0/src/PowerSsh/self_management.py +79 -0
  27. power_ssh-1.0.0/src/PowerSsh/system_log.py +92 -0
  28. power_ssh-1.0.0/src/PowerSsh/tui.py +565 -0
  29. power_ssh-1.0.0/src/power_ssh.egg-info/PKG-INFO +376 -0
  30. power_ssh-1.0.0/src/power_ssh.egg-info/SOURCES.txt +37 -0
  31. power_ssh-1.0.0/src/power_ssh.egg-info/dependency_links.txt +1 -0
  32. power_ssh-1.0.0/src/power_ssh.egg-info/entry_points.txt +2 -0
  33. power_ssh-1.0.0/src/power_ssh.egg-info/requires.txt +1 -0
  34. power_ssh-1.0.0/src/power_ssh.egg-info/top_level.txt +1 -0
  35. power_ssh-1.0.0/tests/test_about.py +1074 -0
  36. power_ssh-1.0.0/tests/test_domain.py +386 -0
  37. power_ssh-1.0.0/tests/test_hello.py +112 -0
  38. power_ssh-1.0.0/tests/test_language.py +167 -0
  39. power_ssh-1.0.0/tests/test_tui.py +309 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Cloudgen Wong <cloudgen.wong@gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,376 @@
1
+ Metadata-Version: 2.4
2
+ Name: power-ssh
3
+ Version: 1.0.0
4
+ Summary: PowerSsh runs OpenSSH sshd and this login's SSH client from a text menu.
5
+ Author-email: Wilgat Wong <wilgat.wong@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/cloudgen/PowerSsh
8
+ Project-URL: Repository, https://github.com/cloudgen/PowerSsh
9
+ Project-URL: Issues, https://github.com/cloudgen/PowerSsh/issues
10
+ Keywords: CLI,TUI,SSH,sshd,OpenSSH
11
+ Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
12
+ Description-Content-Type: text/markdown
13
+ License-File: LICENSE.md
14
+ Requires-Dist: ChronicleLogger>=1.3.1
15
+ Dynamic: license-file
16
+
17
+ # PowerSsh - OpenSSH sshd and this login's SSH client, on a text menu
18
+
19
+ ![Version](https://img.shields.io/badge/Version-1.0.0-blue?style=flat-square)
20
+ ![License](https://img.shields.io/badge/License-MIT-green?style=flat-square)
21
+ [![CIAO](https://img.shields.io/badge/Philosophy-CIAO%20(Caution%20%E2%80%A2%20Intentional%20%E2%80%A2%20Anti--fragile%20%E2%80%A2%20Over--engineered)-purple.svg)](https://github.com/cloudgen/ciao)
22
+ [![Stars](https://img.shields.io/github/stars/cloudgen/PowerSsh?style=flat-square)](https://github.com/cloudgen/PowerSsh)
23
+ [![Python](https://img.shields.io/badge/Python-3-blue?style=flat-square)]()
24
+ [![PyPI](https://img.shields.io/pypi/v/power-ssh?style=flat-square)](https://pypi.org/project/power-ssh/)
25
+
26
+ PowerSsh is the Python program behind the `sshd-cli` command. On a terminal, starting it with no arguments opens a text menu. The menu runs OpenSSH `sshd` on this machine and the OpenSSH client for this login (`~/.ssh/config`, `ssh`, and folder copy).
27
+
28
+ The typed verb `hello` prints one welcome line and does not draw the menu. The menu itself does not print that line until you type `hello`.
29
+
30
+ This tree is **1.0.0**. Pip installs the distribution **`power-ssh`**. The import package is **`PowerSsh`**. The last `/bin/sh` release is **1.35.1** and lives in `legacy/` for reference.
31
+
32
+ ## Features
33
+
34
+ - Text menu on a terminal. The first row is the current folder and a local clock (`HH:MM:SS`) when the row has room
35
+ - Numbered rows line up in display columns. Wide characters count as two. A rounded input box sits along the bottom
36
+ - **client-side** (1): dns, ssh, download, upload. On POSIX Linux also backup-config and sync-config. On Termux, Git Bash, and Windows cmd, those two stay off the list and sync-from-remote (18) is shown
37
+ - **server-side** (2): status. start, stop, and restart when this login may run the daemon (Termux, Git Bash, Windows cmd, or POSIX root)
38
+ - **system-log** (3): view-log (31), clear-log (32), log-folder (33)
39
+ - **language** (4): thirteen languages, numbers 41–53, saved for the next run
40
+ - **sudoers** (5): a draft that allows only `backup-config`, numbers 51–55. Hidden on Termux, Git Bash, and Windows cmd
41
+ - **self-management** (8): version (82), about (83), and pip rows 84–87
42
+ - **Exit** (9)
43
+ - Typed verbs for the same work, plus `hello`, `fix-config`, `port`, `config`, `host-keys`, `auth-keys`, `wake-lock`, `wake-unlock`, `install` (Termux OpenSSH packages), and `rc-test`
44
+ - `fix-config` comments OpenSSH client keywords this OS does not support, and every run does that quietly for `~/.ssh/config`
45
+ - Download and upload of a folder as tar.gz. An MSYS or Git Bash reader uses a finished file. Other readers keep the pipe
46
+
47
+ ## Advantages
48
+
49
+ 1. **Menu or command.** `sshd-cli` on a terminal opens the menu and does not call pip. With no terminal and no verb, it prints help and returns 0. `sshd-cli hello` prints `Welcome to PowerSsh 1.0.0.` and does not draw the menu. `sshd-cli status` reports sshd without opening the menu.
50
+ 2. **The HelloTui screen stays.** Path line, clock `HH:MM:SS`, display columns, the input box, Esc, and the language, log, and pip boards keep their numbers (3, 4, 8, 9 and the children under them).
51
+ 3. **The login class is visible.** When sudoers, backup, or start/stop/restart cannot be offered, the menu prints an info line and omits those numbers. The typed command still refuses, and it does not wrap `sudo`.
52
+ 4. **Lifecycle is pip.** `version-check`, `self-update`, `self-install`, and `self-uninstall` use `python -m pip` and the distribution name `power-ssh`. `self-uninstall` on the command line needs `--force`. They do not use root.
53
+
54
+ ## Quick Installation
55
+
56
+ **Python dependency:** `ChronicleLogger>=1.3.1` (required). Pip installs it with PowerSsh.
57
+
58
+ ### PyPI (registry)
59
+
60
+ ```bash
61
+ python -m pip install power-ssh
62
+ ```
63
+
64
+ This installs the console command **`sshd-cli`** and the import package **`PowerSsh`**. The name in `pyproject.toml` is `power-ssh`. This tree is **1.0.0**.
65
+
66
+ ### Local install (checkout)
67
+
68
+ ```bash
69
+ git clone https://github.com/cloudgen/PowerSsh.git
70
+ cd PowerSsh
71
+ python3 -m venv venv
72
+ source venv/bin/activate
73
+ python -m pip install -e .
74
+ ```
75
+
76
+ From this checkout, before that install, `./sshd-cli` runs the package in `src/`.
77
+
78
+ ### Main menu
79
+
80
+ After install, on a terminal, `sshd-cli` with no arguments prints this menu. The clock is local time, `HH:MM:SS`. `9` leaves. `0` on a later board goes back. A number that is not on the list prints an error and lets you choose again.
81
+
82
+ ```text
83
+ $ sshd-cli
84
+ Path: /tmp/work 13:57:48
85
+ 1. **client-side** : *this login OpenSSH client (~/.ssh/config, ssh, folders)*
86
+ 2. **server-side** : *this host OpenSSH sshd (listen, keys, port)*
87
+ 3. **system-log** : *view, clear, and the log folder*
88
+ 4. **language** : *display language for this menu*
89
+ 5. **sudoers** : *grant and drafts for passwordless sudo*
90
+ 8. **self-management**: *version, about, and pip lifecycle*
91
+ 9. **Exit** : *leave*
92
+
93
+ ╭───────────────────────────────────────────────────────────────────────────────────╮
94
+ │ > │
95
+ ╰───────────────────────────────────────────────────────────────────────────────────╯
96
+ **PowerSsh**(*1.0.0*) │ main menu │ Up/Down • Enter
97
+ ```
98
+
99
+ Termux omits sudoers and prints an info line:
100
+
101
+ ```text
102
+ $ sshd-cli
103
+ Path: /tmp/work 13:57:49
104
+ 1. **client-side** : *this login OpenSSH client (~/.ssh/config, ssh, folders)*
105
+ 2. **server-side** : *this host OpenSSH sshd (listen, keys, port)*
106
+ 3. **system-log** : *view, clear, and the log folder*
107
+ 4. **language** : *display language for this menu*
108
+ 8. **self-management**: *version, about, and pip lifecycle*
109
+ 9. **Exit** : *leave*
110
+ [INFO] sudoers not available for termux
111
+
112
+ ╭───────────────────────────────────────────────────────────────────────────────────╮
113
+ │ > │
114
+ ╰───────────────────────────────────────────────────────────────────────────────────╯
115
+ **PowerSsh**(*1.0.0*) │ main menu │ Up/Down • Enter
116
+ ```
117
+
118
+ Git Bash prints `sudoers not available for gitbash`. Windows cmd prints `sudoers not available for windows-cmd`. The rows are the same as the Termux menu.
119
+
120
+ client-side on POSIX Linux:
121
+
122
+ ```text
123
+ Path: /tmp/work 13:57:52
124
+ 11. **dns** : *this login ~/.ssh/config Host list*
125
+ 12. **ssh** : *connect with a Host from that list*
126
+ 13. **download** : *tar.gz a remote folder into this directory*
127
+ 14. **upload** : *tar.gz a local folder onto that Host*
128
+ 15. **backup-config**: *copy ~/.ssh/config to the project store*
129
+ 16. **sync-config** : *copy the project store back to ~/.ssh/config*
130
+ 0. **Back** : *return to the main menu*
131
+
132
+ ╭───────────────────────────────────────────────────────────────────────────────────╮
133
+ │ > │
134
+ ╰───────────────────────────────────────────────────────────────────────────────────╯
135
+ **PowerSsh**(*1.0.0*) │ client-side │ Up/Down • Enter
136
+ ```
137
+
138
+ server-side when start, stop, and restart are on the list:
139
+
140
+ ```text
141
+ Path: /tmp/work 13:57:54
142
+ 21. **status** : *show whether sshd is listening*
143
+ 22. **start** : *start sshd for this login*
144
+ 23. **stop** : *stop sshd for this login*
145
+ 24. **restart**: *stop sshd, then start it*
146
+ 0. **Back** : *return to the main menu*
147
+
148
+ ╭───────────────────────────────────────────────────────────────────────────────────╮
149
+ │ > │
150
+ ╰───────────────────────────────────────────────────────────────────────────────────╯
151
+ **PowerSsh**(*1.0.0*) │ server-side │ Up/Down • Enter
152
+ ```
153
+
154
+ system-log:
155
+
156
+ ```text
157
+ Path: /tmp/work 13:57:59
158
+ 31. **view-log** : *list a log file and show it*
159
+ 32. **clear-log** : *empty one log file*
160
+ 33. **log-folder**: *show the log folder*
161
+ 0. **Back** : *return to the main menu*
162
+
163
+ ╭───────────────────────────────────────────────────────────────────────────────────╮
164
+ │ > │
165
+ ╰───────────────────────────────────────────────────────────────────────────────────╯
166
+ **PowerSsh**(*1.0.0*) │ system-log │ Up/Down • Enter
167
+ ```
168
+
169
+ language:
170
+
171
+ ```text
172
+ Path: /tmp/work 13:57:56
173
+ 41. **English** : *use English for this menu*
174
+ 42. **简体中文** : *use 简体中文 for this menu*
175
+ 43. **繁體中文** : *use 繁體中文 for this menu*
176
+ 44. **Español** : *use Español for this menu*
177
+ 45. **العربية** : *use العربية for this menu*
178
+ 46. **Français** : *use Français for this menu*
179
+ 47. **Português** : *use Português for this menu*
180
+ 48. **Русский** : *use Русский for this menu*
181
+ 49. **Deutsch** : *use Deutsch for this menu*
182
+ 50. **日本語** : *use 日本語 for this menu*
183
+ 51. **한국어** : *use 한국어 for this menu*
184
+ 52. **Nederlands**: *use Nederlands for this menu*
185
+ 53. **Ελληνικά** : *use Ελληνικά for this menu*
186
+ 0. **Back** : *return to the main menu*
187
+
188
+ ╭───────────────────────────────────────────────────────────────────────────────────╮
189
+ │ > │
190
+ ╰───────────────────────────────────────────────────────────────────────────────────╯
191
+ **PowerSsh**(*1.0.0*) │ language │ Up/Down • Enter
192
+ ```
193
+
194
+ sudoers:
195
+
196
+ ```text
197
+ Path: /tmp/work 13:57:55
198
+ 51. **generate-sudoer-request** : *write a JSON grant you can read*
199
+ 52. **submit-sudoer-request** : *check the JSON grant before a person installs it*
200
+ 53. **print-sudoers** : *print the sudoers draft*
201
+ 54. **print-sudoers-install-script**: *print the install script for that draft*
202
+ 55. **remove-project-sudoers** : *remove the project sudoers draft*
203
+ 0. **Back** : *return to the main menu*
204
+
205
+ ╭───────────────────────────────────────────────────────────────────────────────────╮
206
+ │ > │
207
+ ╰───────────────────────────────────────────────────────────────────────────────────╯
208
+ **PowerSsh**(*1.0.0*) │ sudoers │ Up/Down • Enter
209
+ ```
210
+
211
+ self-management:
212
+
213
+ ```text
214
+ Path: /tmp/work 13:57:58
215
+ 82. **version** : *show the installed version*
216
+ 83. **about** : *version and this computer*
217
+ 84. **version-check** : *compare this install with pip*
218
+ 85. **self-update** : *upgrade this package with pip*
219
+ 86. **self-uninstall**: *remove this package with pip*
220
+ 87. **self-install** : *install this package with pip*
221
+ 0. **Back** : *return to the main menu*
222
+
223
+ ╭───────────────────────────────────────────────────────────────────────────────────╮
224
+ │ > │
225
+ ╰───────────────────────────────────────────────────────────────────────────────────╯
226
+ **PowerSsh**(*1.0.0*) │ self-management │ Up/Down • Enter
227
+ ```
228
+
229
+ dns:
230
+
231
+ ```text
232
+ Path: /tmp/work 13:58:01
233
+ 111. **Edit** : *change this Host (dns, ip, user, Termux, identity, Old OpenSSH)*
234
+ 112. **Add** : *new Host in this login ~/.ssh/config*
235
+ 113. **Delete**: *remove a Host*
236
+ 114. **Unset** : *drop extra settings (user, port, …) — not dns or ip*
237
+ 0. **Back** : *return to the main menu*
238
+
239
+ ╭───────────────────────────────────────────────────────────────────────────────────╮
240
+ │ > │
241
+ ╰───────────────────────────────────────────────────────────────────────────────────╯
242
+ **PowerSsh**(*1.0.0*) │ dns │ Up/Down • Enter
243
+ ```
244
+
245
+ ## Usage
246
+
247
+ On a terminal:
248
+
249
+ ```bash
250
+ sshd-cli
251
+ ```
252
+
253
+ The English menu is the main-menu capture above. The clock on that screen is local time in `HH:MM:SS`.
254
+
255
+ ```text
256
+ Path: /tmp/work 13:57:48
257
+ 1. **client-side** : *this login OpenSSH client (~/.ssh/config, ssh, folders)*
258
+ 2. **server-side** : *this host OpenSSH sshd (listen, keys, port)*
259
+ 3. **system-log** : *view, clear, and the log folder*
260
+ 4. **language** : *display language for this menu*
261
+ 5. **sudoers** : *grant and drafts for passwordless sudo*
262
+ 8. **self-management**: *version, about, and pip lifecycle*
263
+ 9. **Exit** : *leave*
264
+
265
+ ╭───────────────────────────────────────────────────────────────────────────────────╮
266
+ │ > │
267
+ ╰───────────────────────────────────────────────────────────────────────────────────╯
268
+ **PowerSsh**(*1.0.0*) │ main menu │ Up/Down • Enter
269
+ ```
270
+
271
+ Help, without opening the menu:
272
+
273
+ ```bash
274
+ sshd-cli help
275
+ sshd-cli hello
276
+ sshd-cli status
277
+ sshd-cli --json status
278
+ ```
279
+
280
+ `--json` prints one JSON object and no human line. `--json` or `--quiet` with no verb prints help and returns 0.
281
+
282
+ ## Screenshots
283
+
284
+ These pictures are the PowerSsh 1.0.0 text menu. The status line reads PowerSsh 1.0.0. The current directory in the pictures is `/tmp/work`.
285
+
286
+ ![POSIX front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-posix.png)
287
+ ![Termux front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-termux.png)
288
+ ![Git Bash front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-git-bash.png)
289
+ ![Windows cmd front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-windows-cmd.png)
290
+ ![client-side](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/client.png)
291
+ ![server-side](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/server.png)
292
+ ![system-log](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/system-log.png)
293
+ ![language](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/language.png)
294
+ ![sudoers](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/sudoers.png)
295
+ ![self-management](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/self-management.png)
296
+ ![dns](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/dns.png)
297
+ ![Simplified Chinese front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-zh-Hans.png)
298
+ ![Traditional Chinese front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-zh-Hant.png)
299
+ ![Japanese front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-ja.png)
300
+ ![Korean front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-ko.png)
301
+ ![Spanish front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-es.png)
302
+ ![French front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-fr.png)
303
+ ![Portuguese front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-pt.png)
304
+ ![German front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-de.png)
305
+ ![Russian front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-ru.png)
306
+ ![Arabic front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-ar.png)
307
+ ![Dutch front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-nl.png)
308
+ ![Greek front](https://raw.githubusercontent.com/cloudgen/PowerSsh/main/screenshots/front-el.png)
309
+
310
+ ## Examples
311
+
312
+ Welcome line, no menu:
313
+
314
+ ```bash
315
+ sshd-cli hello
316
+ ```
317
+
318
+ ```text
319
+ Welcome to PowerSsh 1.0.0.
320
+ ```
321
+
322
+ Add a Host in this login's `~/.ssh/config`, then connect. The name and address here are examples, not a machine on your network:
323
+
324
+ ```bash
325
+ sshd-cli dns add dns lab-a ip 203.0.113.10 user alice
326
+ sshd-cli ssh lab-a
327
+ ```
328
+
329
+ Comment keywords this OS does not support:
330
+
331
+ ```bash
332
+ sshd-cli fix-config --input-file ./client-config --output-file ./client-config
333
+ ```
334
+
335
+ Remove this package:
336
+
337
+ ```bash
338
+ sshd-cli self-uninstall --force
339
+ ```
340
+
341
+ ## Platform Compatibility
342
+
343
+ | Login | Menu notes |
344
+ |-------|------------|
345
+ | POSIX Linux, root | sudoers, backup-config, sync-config, and start/stop/restart. A systemd unit is started with `systemctl` |
346
+ | POSIX Linux, not root | sudoers and backup stay. start/stop/restart stay off the server board. The typed commands refuse and do not wrap `sudo` |
347
+ | Termux | No sudoers and no backup-config. sync-from-remote is on the client board. `sshd-cli install` may run `pkg install -y openssh termux-auth`. start also takes a wake lock |
348
+ | Git Bash | Same row hiding as Termux. A gzip reader on this kind of host uses a finished archive and `scp` |
349
+ | Windows cmd | Same row hiding as Termux. `Windows_NT` alone keeps the streamed pipe |
350
+ | Cygwin | Not treated as Git Bash and not treated as Windows cmd |
351
+
352
+ macOS, Debian (including Ubuntu), Fedora and Red Hat, Alpine, BusyBox, and other Linux keep the streamed pipe for download and upload. Alpine comments active `GSSAPI*` client keywords. Termux comments active host-key and public-key algorithm keywords.
353
+
354
+ ## Related Projects
355
+
356
+ - [OpenSSH](https://www.openssh.com/) — the client and the sshd this program runs
357
+ - [ChronicleLogger](https://pypi.org/project/ChronicleLogger/) — the required log package
358
+ - [CIAO](https://github.com/cloudgen/ciao) — the defensive style this project follows
359
+ - [PowerSsh](https://github.com/cloudgen/PowerSsh) — this repository. The command is `sshd-cli`
360
+ - [power-ssh](https://pypi.org/project/power-ssh/) — the package index page
361
+
362
+ ## Contributing
363
+
364
+ ```bash
365
+ ./tests/run.sh
366
+ ```
367
+
368
+ The runner discovers Python tests under `tests/`. The old shell tests under `tests/legacy-shell/` are not that runner. Use a temporary home and minted Host names in new tests.
369
+
370
+ ## License
371
+
372
+ MIT. See [LICENSE.md](LICENSE.md).
373
+
374
+ ## Last Update
375
+
376
+ 2026-10-23 — PowerSsh 1.0.0. The distribution name is `power-ssh`. The public repository is https://github.com/cloudgen/PowerSsh. The console command stays `sshd-cli`. The text menu keeps the HelloTui screen and carries the sshd-cli boards. The `/bin/sh` program remains available as `legacy/sshd-cli.sh` at 1.35.1.