multiSSH3 6.35__tar.gz → 6.37__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.
- {multissh3-6.35/multiSSH3.egg-info → multissh3-6.37}/PKG-INFO +5 -3
- {multissh3-6.35 → multissh3-6.37}/README.md +4 -2
- {multissh3-6.35 → multissh3-6.37}/mssh_complete.py +1136 -473
- {multissh3-6.35 → multissh3-6.37/multiSSH3.egg-info}/PKG-INFO +5 -3
- {multissh3-6.35 → multissh3-6.37}/multiSSH3.py +28 -7
- {multissh3-6.35 → multissh3-6.37}/tests/bench_complete.py +7 -3
- {multissh3-6.35 → multissh3-6.37}/tests/complete_shell_harness.py +25 -0
- {multissh3-6.35 → multissh3-6.37}/tests/conftest.py +17 -0
- {multissh3-6.35 → multissh3-6.37}/tests/shells/Dockerfile.current +6 -2
- {multissh3-6.35 → multissh3-6.37}/tests/shells/Dockerfile.modern +6 -2
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_blesh.py +15 -1
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_diagnose.py +189 -12
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_engine.py +377 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_index.py +8 -2
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_keys.py +157 -12
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_picker.py +145 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_shells.py +899 -5
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_store.py +11 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_harness_smoke.py +13 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_runtime_dir.py +28 -0
- {multissh3-6.35 → multissh3-6.37}/LICENSE +0 -0
- {multissh3-6.35 → multissh3-6.37}/MANIFEST.in +0 -0
- {multissh3-6.35 → multissh3-6.37}/multiSSH3.egg-info/SOURCES.txt +0 -0
- {multissh3-6.35 → multissh3-6.37}/multiSSH3.egg-info/dependency_links.txt +0 -0
- {multissh3-6.35 → multissh3-6.37}/multiSSH3.egg-info/entry_points.txt +0 -0
- {multissh3-6.35 → multissh3-6.37}/multiSSH3.egg-info/top_level.txt +0 -0
- {multissh3-6.35 → multissh3-6.37}/pytest.ini +0 -0
- {multissh3-6.35 → multissh3-6.37}/setup.cfg +0 -0
- {multissh3-6.35 → multissh3-6.37}/setup.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/data/run_command_golden.json +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/shells/Dockerfile.bash5.1 +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/shells/Dockerfile.bash5.3 +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/shells/Dockerfile.centos7 +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/shells/Dockerfile.legacy +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/shells/run_matrix.sh +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_cli_branches.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_cli_option_words.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_cli_processing.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_closed_output.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_color_helpers.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_command_terminal.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_compact_hostnames.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_cli.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_context.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_editor.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_eval.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_hosts.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_hoststate.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_lex.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_mssh_helpers.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_password_spellings.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_probe.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_start.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_suggest.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_terminal.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_untrusted.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_complete_zsh_options.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_config_cli.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_config_validate.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_config_values.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_control_master_config.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_copy_id.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_curses_branches.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_curses_event_loop.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_curses_tui.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_curses_wide_chars.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_expand_hostnames.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_file_trust.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_helpers_extra.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_history_replay.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_host.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_host_validity.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_hosts_file.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_identities_only.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_ipmi_lockout_wait.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_ipmi_logins.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_key_path_home.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_login_drop_retry.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_main_lifecycle.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_narrow_terminal.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_no_hosts.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_option_no_effect.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_options_after_command.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_output_merge.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_output_robustness.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_packaging.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_password_handling.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_passwords_out_of_ps.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_run_command.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_run_command_branches.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_run_command_characterization.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_run_command_exit.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_run_on_hosts.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_run_on_hosts_modes.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_runtime_branch_matrix.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_shared_lines.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_smoke_optional.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_ssh_error_text.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_ssh_timeouts.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_sshpass_exit.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_start_run_on_hosts.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_stopped_commands.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_stream_reader.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_streamed_output.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_tui_ssh_notices.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_unavailable_hosts.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_underscore_settings.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_waiting.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/test_wide_wrap.py +0 -0
- {multissh3-6.35 → multissh3-6.37}/tests/vt_grid.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: multiSSH3
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.37
|
|
4
4
|
Summary: Run commands on multiple hosts via SSH
|
|
5
5
|
Home-page: https://github.com/yufei-pan/multiSSH3
|
|
6
6
|
Author: Yufei Pan
|
|
@@ -504,6 +504,8 @@ Ranking uses the rest of the line on both sides of the cursor: after `mssh gpu[0
|
|
|
504
504
|
|
|
505
505
|
Completion never removes what you typed, prints nothing, and falls back to the shell's normal completion when anything is slow or missing.
|
|
506
506
|
|
|
507
|
+
In bash with readline's `completion-ignore-case` on (`set completion-ignore-case on` in `~/.inputrc`, or `bind` at any time: it is read at every TAB), what you typed matches in any case, and the candidate's own spelling goes in: `mssh storage-e<TAB>` gives `Storage-East`. Names differing only in case stay different names, as mssh compares host, alias and user names exactly; when they alone are left, which readline cannot tell apart, the one in the case you typed goes in, else the most likely. The words of a command before the one being completed and the directories of a path stay as typed, and an option name typed in its own case is never turned into another (`-S` stays `-S`, never `-s`). Letters match as your locale lowers them: in a non-UTF-8 locale (`LANG=C`, or a locale the system lacks) only ASCII letters, in a Turkish UTF-8 one `I` goes with `ı` and `İ` with `i`.
|
|
508
|
+
|
|
507
509
|
In zsh, TAB needs zsh's completion system: `compinit` has to run when zsh starts, before or after the mssh block in `~/.zshrc` (oh-my-zsh, prezto and the like run it, and so does Ubuntu's `/etc/zsh/zshrc`). `mssh --completion install` says so when `~/.zshrc` does not seem to start it. Grey suggestions, warnings and Ctrl-R work without it.
|
|
508
510
|
|
|
509
511
|
It learns from an index of your history and hosts, kept in mssh's private runtime directory (`$XDG_RUNTIME_DIR/multiSSH3`, else `/run/user/<uid>/multiSSH3`, `/dev/shm/multiSSH3-<uid>` or `multiSSH3-<uid>` in the temp dir) and rebuilt in the background when its sources change. `mssh --completion install` builds it right away. A reboot clears it: the first TAB after one starts the build and, until the index is ready (about a second for a long history), offers options and what your shell history holds. `mssh-complete rebuild` rebuilds it now; `mssh-complete eval` replays your history and shows how much typing completion saves.
|
|
@@ -826,7 +828,7 @@ mssh -f ./data/ allServers /tmp/data/
|
|
|
826
828
|
- By default mssh set this to true to speed up operations on large host lists with some unreachable hosts.
|
|
827
829
|
- Unreachable hosts will be tried again when their timeout expires.
|
|
828
830
|
- A skipped host is not run and counts as a failed host: it shows return code 255 ( what ssh returns when it cannot connect ) with a line saying it was skipped, and the summary lists it after `failed_hosts:` as `Skipped N hosts unreachable in a recent run, without trying them: ...`. So mssh does not exit 0 or print `Success` when it skipped a host.
|
|
829
|
-
- mssh stores the current run unreachable hosts in memory and if `skip_unreachable` is true, it will store them in `unavailable_hosts.csv` in mssh's private runtime directory: `$XDG_RUNTIME_DIR/multiSSH3`, else `/run/user/<uid>/multiSSH3`, `/dev/shm/multiSSH3-<uid>`, or a `multiSSH3-<uid>` folder in the system temp folder (the first that only you can write to). If none can be used, they are only kept for the current run.
|
|
831
|
+
- mssh stores the current run unreachable hosts in memory and if `skip_unreachable` is true, it will store them in `unavailable_hosts.csv` in mssh's private runtime directory: `$XDG_RUNTIME_DIR/multiSSH3`, else `/run/user/<uid>/multiSSH3`, `/dev/shm/multiSSH3-<uid>`, or a `multiSSH3-<uid>` folder in the system temp folder (the first that only you can write to, or could make). mssh reads them back from that one only, not from a later place an older session left them in. If none can be used, they are only kept for the current run.
|
|
830
832
|
- To force mssh to not use unreachable hosts from previous runs, you can use `-a, -nsu, --no_skip_unreachable` to set `skip_unreachable` to false.
|
|
831
833
|
|
|
832
834
|
### `-a, -nsu, --no_skip_unreachable` | not _`DEFAULT_SKIP_UNREACHABLE`_
|
|
@@ -974,7 +976,7 @@ Option names count in full only: `--user` is not `--username` and `-c` is not `-
|
|
|
974
976
|
|
|
975
977
|
Putting the command after `--` is no substitute for quotes: every word after the hosts is a command of its own, so `mssh web1 -- bash -c 'echo hi'` runs `bash`, `-c` and `echo hi` one after another (when each word is a single word, as in `mssh web1 -- ls -la`, mssh asks whether to join them).
|
|
976
978
|
|
|
977
|
-
Below is a sample help message output from multiSSH3 6.
|
|
979
|
+
Below is a sample help message output from multiSSH3 6.37 @ 2026-10-21 (no config file, 120 columns; the lines after the options list the programs found on that machine)
|
|
978
980
|
|
|
979
981
|
```bash
|
|
980
982
|
$ mssh -h
|
|
@@ -478,6 +478,8 @@ Ranking uses the rest of the line on both sides of the cursor: after `mssh gpu[0
|
|
|
478
478
|
|
|
479
479
|
Completion never removes what you typed, prints nothing, and falls back to the shell's normal completion when anything is slow or missing.
|
|
480
480
|
|
|
481
|
+
In bash with readline's `completion-ignore-case` on (`set completion-ignore-case on` in `~/.inputrc`, or `bind` at any time: it is read at every TAB), what you typed matches in any case, and the candidate's own spelling goes in: `mssh storage-e<TAB>` gives `Storage-East`. Names differing only in case stay different names, as mssh compares host, alias and user names exactly; when they alone are left, which readline cannot tell apart, the one in the case you typed goes in, else the most likely. The words of a command before the one being completed and the directories of a path stay as typed, and an option name typed in its own case is never turned into another (`-S` stays `-S`, never `-s`). Letters match as your locale lowers them: in a non-UTF-8 locale (`LANG=C`, or a locale the system lacks) only ASCII letters, in a Turkish UTF-8 one `I` goes with `ı` and `İ` with `i`.
|
|
482
|
+
|
|
481
483
|
In zsh, TAB needs zsh's completion system: `compinit` has to run when zsh starts, before or after the mssh block in `~/.zshrc` (oh-my-zsh, prezto and the like run it, and so does Ubuntu's `/etc/zsh/zshrc`). `mssh --completion install` says so when `~/.zshrc` does not seem to start it. Grey suggestions, warnings and Ctrl-R work without it.
|
|
482
484
|
|
|
483
485
|
It learns from an index of your history and hosts, kept in mssh's private runtime directory (`$XDG_RUNTIME_DIR/multiSSH3`, else `/run/user/<uid>/multiSSH3`, `/dev/shm/multiSSH3-<uid>` or `multiSSH3-<uid>` in the temp dir) and rebuilt in the background when its sources change. `mssh --completion install` builds it right away. A reboot clears it: the first TAB after one starts the build and, until the index is ready (about a second for a long history), offers options and what your shell history holds. `mssh-complete rebuild` rebuilds it now; `mssh-complete eval` replays your history and shows how much typing completion saves.
|
|
@@ -800,7 +802,7 @@ mssh -f ./data/ allServers /tmp/data/
|
|
|
800
802
|
- By default mssh set this to true to speed up operations on large host lists with some unreachable hosts.
|
|
801
803
|
- Unreachable hosts will be tried again when their timeout expires.
|
|
802
804
|
- A skipped host is not run and counts as a failed host: it shows return code 255 ( what ssh returns when it cannot connect ) with a line saying it was skipped, and the summary lists it after `failed_hosts:` as `Skipped N hosts unreachable in a recent run, without trying them: ...`. So mssh does not exit 0 or print `Success` when it skipped a host.
|
|
803
|
-
- mssh stores the current run unreachable hosts in memory and if `skip_unreachable` is true, it will store them in `unavailable_hosts.csv` in mssh's private runtime directory: `$XDG_RUNTIME_DIR/multiSSH3`, else `/run/user/<uid>/multiSSH3`, `/dev/shm/multiSSH3-<uid>`, or a `multiSSH3-<uid>` folder in the system temp folder (the first that only you can write to). If none can be used, they are only kept for the current run.
|
|
805
|
+
- mssh stores the current run unreachable hosts in memory and if `skip_unreachable` is true, it will store them in `unavailable_hosts.csv` in mssh's private runtime directory: `$XDG_RUNTIME_DIR/multiSSH3`, else `/run/user/<uid>/multiSSH3`, `/dev/shm/multiSSH3-<uid>`, or a `multiSSH3-<uid>` folder in the system temp folder (the first that only you can write to, or could make). mssh reads them back from that one only, not from a later place an older session left them in. If none can be used, they are only kept for the current run.
|
|
804
806
|
- To force mssh to not use unreachable hosts from previous runs, you can use `-a, -nsu, --no_skip_unreachable` to set `skip_unreachable` to false.
|
|
805
807
|
|
|
806
808
|
### `-a, -nsu, --no_skip_unreachable` | not _`DEFAULT_SKIP_UNREACHABLE`_
|
|
@@ -948,7 +950,7 @@ Option names count in full only: `--user` is not `--username` and `-c` is not `-
|
|
|
948
950
|
|
|
949
951
|
Putting the command after `--` is no substitute for quotes: every word after the hosts is a command of its own, so `mssh web1 -- bash -c 'echo hi'` runs `bash`, `-c` and `echo hi` one after another (when each word is a single word, as in `mssh web1 -- ls -la`, mssh asks whether to join them).
|
|
950
952
|
|
|
951
|
-
Below is a sample help message output from multiSSH3 6.
|
|
953
|
+
Below is a sample help message output from multiSSH3 6.37 @ 2026-10-21 (no config file, 120 columns; the lines after the options list the programs found on that machine)
|
|
952
954
|
|
|
953
955
|
```bash
|
|
954
956
|
$ mssh -h
|