multiSSH3 6.36__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.36/multiSSH3.egg-info → multissh3-6.37}/PKG-INFO +4 -2
- {multissh3-6.36 → multissh3-6.37}/README.md +3 -1
- {multissh3-6.36 → multissh3-6.37}/mssh_complete.py +1114 -470
- {multissh3-6.36 → multissh3-6.37/multiSSH3.egg-info}/PKG-INFO +4 -2
- {multissh3-6.36 → multissh3-6.37}/multiSSH3.py +2 -3
- {multissh3-6.36 → multissh3-6.37}/tests/bench_complete.py +7 -3
- {multissh3-6.36 → multissh3-6.37}/tests/complete_shell_harness.py +25 -0
- {multissh3-6.36 → multissh3-6.37}/tests/conftest.py +17 -0
- {multissh3-6.36 → multissh3-6.37}/tests/shells/Dockerfile.current +6 -2
- {multissh3-6.36 → multissh3-6.37}/tests/shells/Dockerfile.modern +6 -2
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_blesh.py +15 -1
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_diagnose.py +189 -12
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_engine.py +377 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_index.py +8 -2
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_keys.py +157 -12
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_picker.py +145 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_shells.py +899 -5
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_store.py +11 -0
- {multissh3-6.36 → multissh3-6.37}/LICENSE +0 -0
- {multissh3-6.36 → multissh3-6.37}/MANIFEST.in +0 -0
- {multissh3-6.36 → multissh3-6.37}/multiSSH3.egg-info/SOURCES.txt +0 -0
- {multissh3-6.36 → multissh3-6.37}/multiSSH3.egg-info/dependency_links.txt +0 -0
- {multissh3-6.36 → multissh3-6.37}/multiSSH3.egg-info/entry_points.txt +0 -0
- {multissh3-6.36 → multissh3-6.37}/multiSSH3.egg-info/top_level.txt +0 -0
- {multissh3-6.36 → multissh3-6.37}/pytest.ini +0 -0
- {multissh3-6.36 → multissh3-6.37}/setup.cfg +0 -0
- {multissh3-6.36 → multissh3-6.37}/setup.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/data/run_command_golden.json +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/shells/Dockerfile.bash5.1 +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/shells/Dockerfile.bash5.3 +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/shells/Dockerfile.centos7 +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/shells/Dockerfile.legacy +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/shells/run_matrix.sh +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_cli_branches.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_cli_option_words.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_cli_processing.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_closed_output.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_color_helpers.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_command_terminal.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_compact_hostnames.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_cli.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_context.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_editor.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_eval.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_hosts.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_hoststate.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_lex.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_mssh_helpers.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_password_spellings.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_probe.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_start.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_suggest.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_terminal.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_untrusted.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_complete_zsh_options.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_config_cli.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_config_validate.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_config_values.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_control_master_config.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_copy_id.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_curses_branches.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_curses_event_loop.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_curses_tui.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_curses_wide_chars.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_expand_hostnames.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_file_trust.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_harness_smoke.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_helpers_extra.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_history_replay.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_host.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_host_validity.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_hosts_file.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_identities_only.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_ipmi_lockout_wait.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_ipmi_logins.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_key_path_home.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_login_drop_retry.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_main_lifecycle.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_narrow_terminal.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_no_hosts.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_option_no_effect.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_options_after_command.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_output_merge.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_output_robustness.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_packaging.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_password_handling.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_passwords_out_of_ps.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_run_command.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_run_command_branches.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_run_command_characterization.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_run_command_exit.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_run_on_hosts.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_run_on_hosts_modes.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_runtime_branch_matrix.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_runtime_dir.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_shared_lines.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_smoke_optional.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_ssh_error_text.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_ssh_timeouts.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_sshpass_exit.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_start_run_on_hosts.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_stopped_commands.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_stream_reader.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_streamed_output.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_tui_ssh_notices.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_unavailable_hosts.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_underscore_settings.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_waiting.py +0 -0
- {multissh3-6.36 → multissh3-6.37}/tests/test_wide_wrap.py +0 -0
- {multissh3-6.36 → 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.
|
|
@@ -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.
|
|
@@ -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
|