From bfd2af710636ddec36bbb0cec805e05e0dca69af Mon Sep 17 00:00:00 2001 From: denny Date: Wed, 10 Jul 2024 21:26:11 +0800 Subject: [PATCH] Add ssh completion (#891) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Read ssh config from `/etc/ssh/ssh_config` and `~/.ssh/config`. Given: ![螢幕擷取畫面 2024-07-09 232722](https://github.com/nushell/nu_scripts/assets/5771562/9294efd7-42c0-4a6c-9dac-06a6a87f67c5) Will show: ![螢幕擷取畫面 2024-07-09 232640](https://github.com/nushell/nu_scripts/assets/5771562/a8e3844b-ac91-417b-a973-c31366ae1460) --- custom-completions/ssh/README.md | 40 +++++++++++++++++ custom-completions/ssh/ssh-completions.nu | 52 +++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 custom-completions/ssh/README.md create mode 100644 custom-completions/ssh/ssh-completions.nu diff --git a/custom-completions/ssh/README.md b/custom-completions/ssh/README.md new file mode 100644 index 0000000..21b7fe0 --- /dev/null +++ b/custom-completions/ssh/README.md @@ -0,0 +1,40 @@ +# SSH completions + +A Nushell extern definition and completers for the ssh command. + +This module provides extern definitions for most of the ssh command options and flags. + +## Usage + +Simply import the extern definitions with + +```nu +source path/to/ssh-completions.nu +``` + +This script will parse `/etc/ssh/ssh_config` and `~/.ssh/config` to fetch SSH config hosts. + +Given the following config: + +``` +Host my-ip + HostName 192.168.50.237 +Host mydomain + HostName mydomain.example.com +Host my-domain-2 + HostName mydomain-2.example.com +Host my_domain_3 + HostName mydomain_3.example.com +``` + + +When you press the tab key, it will display: + +``` +❯ | ssh +my-ip 192.168.50.237 +mydomain mydomain.example.com +my-domain-2 mydomain-2.example.com +my_domain_3 mydomain_3.example.com + +``` \ No newline at end of file diff --git a/custom-completions/ssh/ssh-completions.nu b/custom-completions/ssh/ssh-completions.nu new file mode 100644 index 0000000..137edf2 --- /dev/null +++ b/custom-completions/ssh/ssh-completions.nu @@ -0,0 +1,52 @@ +export extern "ssh" [ + destination?: string@"nu-complete ssh-host" + -4 # Forces ssh to use IPv4 addresses only. + -6 # Forces ssh to use IPv6 addresses only. + -A # Enables forwarding of connections from an authentication agent such as ssh-agent(1). + -a # Disables forwarding of the authentication agent connection. + -B: string # bind_interface + -b: string # bind_address + -C # Requests compression of all data + -c: string # cipher_spec + -D # [bind_address:]port + -E: string # log_file + -e # escape_char + -F: string # configfile + -f # Requests ssh to go to background just before command execution. + -G # Causes ssh to print its configuration after evaluating Host and Match blocks and exit. + -g # Allows remote hosts to connect to local forwarded ports + -I: string # pkcs11 + -i: string # identity_file + -J: string # destination + -K # Enables GSSAPI-based authentication and forwarding(delegation) of GSSAPI credentials to the server. + -k # Disables forwarding (delegation) of GSSAPI credentials to the server. + -L: string # [bind_address:]port:host:hostport / [bind_address:]port:remote_socket / local_socket:host:hostport / local_socket:remote_socket + -l: string # login_name + -M # Places the ssh client into “master” mode for connection sharing. + -m: string # mac_spec + -N # Do not execute a remote command. + -n # Redirects stdin from /dev/null (5) for details. + -O: string # ctl_cmd + -o: string # option +] + +def "nu-complete ssh-host" [] { + let files = [ + '/etc/ssh/ssh_config', + '~/.ssh/config' + ] | filter { |file| $file | path exists } + + $files | each { |file| + let lines = $file | open | lines | str trim + let hosts = $lines + | parse --regex '^Host\s+(?.+)' + | get host + + let hostnames = $lines + | parse --regex '^HostName\s+(?.+)' + | get hostname + $hosts | zip $hostnames | each { || + {'value': $in.0, 'description': $in.1} + } + } | flatten +} \ No newline at end of file