assh

Delphi源码 2025-08-16

assh

概述

一个透明的包装器,为SSH增加了对正则支持,别名网关动态主机名graphvizjson输出YAML配置等的支持。

lib-ssh将assh作为代理人;这意味着它与:

  • SSH
  • SCP
  • rsync
  • git
  • 桌面应用程序取决于lib-sshssh (即,塔,atom.io,SSH隧道经理)

有关具体示例,请参见第三方集成

特征

配置功能

  • 正则支持
  • 别名gate - > gate.domain.tld
  • 网关- >透明的SSH连接链
  • 包括:在多个文件中的拆分配置
  • 本地命令执行:最后是remoteCommand的逆转
  • 模板:相当于主机,但您无法直接连接到模板,非常适合继承
  • 继承:从主机或模板中制作主机继承
  • 可变扩展:从环境中解析变量
  • 智能proxyCommand :使用netcatsocat作为默认后备时,RAW TCP连接
  • 费率限制:配置每主机或全球利率限制
  • JSON输出
  • GraphViz :主机的GraphViz重复

使用命令行的网关

assh可以将ProxyCommand与Openssh透明的NetCat功能一起使用,也可以使用扩展配置的痛苦。

使用hostb作为网关连接到hosta

流程图 
    方向tb

    是的[你]
    一个[hosta]
    b [hostb]
    FW((防火墙))

    样式FW填充:#F00,颜色:#FFF

    y == x fw
    fw .-> a
    
    Y-> b
    b-> a

加载中
$ ssh hosta/hostb
user@hosta $

相当于ssh -o ProxyCommand="ssh hostb nc %h %p" hosta


使用hosta作为网关连接到hostb ,使用hostc作为网关。

流程图 
    方向tb

    是的[你]
    一个[hosta]
    b [hostb]
    C [hostc]
    FW((防火墙))

    样式FW填充:#F00,颜色:#FFF

    y == x fw
    FW ..-> a
    
    Y-> c
    C-> b
    b-> a
加载中
$ ssh hosta/hostb/hostc
user@hosta $

等效于ssh -o ProxyCommand="ssh -o ProxyCommand='ssh hostc nc %h %p' hostb nc %h %p" hosta

使用配置文件中的网关

您可以定义Openssh的“带有NetCat的ProxyCommand”功能,具有简单的语法,更高级的工作流和独特的后备功能。

让我们考虑以下assh .yml文件

 hosts :
  hosta :
    Hostname : 1.2.3.4

  hostb :
    Hostname : 5.6.7.8
    Gateways : hosta

  hostc :
    Hostname : 9.10.11.12
    Gateways : hostb

  hostd :
    Hostname : 13.14.15.16
    GatewayConnectTimeout : 2
    Gateways :
    - direct
    - hosta
  • ssh hosta > ssh 1.2.3.4
  • ssh hostb b-> ssh -o ProxyCommand="ssh hostb nc %h %p" hosta
  • ssh hostc > ssh -o ProxyCommand="ssh -o ProxyCommand='ssh hostc nc %h %p' hostb nc %h %p" hosta
  • ssh hostd - >
    • assh将尝试进入ssh 13.14.15.16
    • 然后,在ssh -o ProxyCommand="ssh hostd nc %h %p" hosta
    • 此方法使您可以在可能的情况下具有最佳的性能,但是如果您不在公司之外,请确保您的命令可以正常工作

引擎盖功能下

  • 在需要时自动再生~/.ssh/config文件
  • 检查父进程确定日志级别(如果使用ssh -vvassh将在调试模式下自动运行)
  • 自动创建ControlPath目录,因此您可以在ControlPath选项中使用SLASHES ,可以使用ControlMasterMkdir: true配置。

钩子

事件

beforeconnect

assh试图连接到远程SSH端口之前, BeforeConnect被称为。

注意:每个SSH连接将调用BeforeConnect ;如果您使用多个网关,则将为每个网关调用,直到一个人成功连接。


Golang模板变量的示例:

 // Host: http://god*o*c.org*/moul.io/assh/pkg/config/#Host
{{. Host . Name }}                                  //  localhost
{{. Host . HostName }}                              //  127.0.0.1
{{. Host . Port }}                                  //  22
{{. Host . User }}                                  //  moul
{{. Host . Prototype }}                             //  moul@127.0.0.1:22
{{. Host }}                                       //  {"HostName":"localhost","Port":22","User":"moul","ControlPersist":"yes",...}
{{ printf "%s:%s" . Host . HostName . Host . Port }}    //  localhost:22 
连接

一旦assh连接到远程SSH端口, OnConnect就会立即调用。

注意: OnConnect不知道身份验证过程,并且将始终提出。


Golang模板变量的示例:

 // Host: http://god*o*c.org*/moul.io/assh/pkg/config/#Host
{{. Host . Name }}                                  //  localhost
{{. Host . HostName }}                              //  127.0.0.1
{{. Host . Port }}                                  //  22
{{. Host . User }}                                  //  moul
{{. Host . Prototype }}                             //  moul@127.0.0.1:22
{{. Host }}                                       //  {"HostName":"localhost","Port":22","User":"moul","ControlPersist":"yes",...}
{{ printf "%s:%s" . Host . HostName . Host . Port }}    //  localhost:22

// Stats: http://godoc.o***rg/moul.io/assh/pkg/commands/#ConnectionStats
{{. Stats . ConnectedAt }}                           //  2016-07-20 11:19:23.467900594 +0200 CEST 
OnConnectError

assh未能打开新的TCP连接时,请使用OnConnectError


Golang模板变量的示例:

 // Host: http://god*o*c.org*/moul.io/assh/pkg/config/#Host
{{. Host . Name }}                                  //  localhost
{{. Host . HostName }}                              //  127.0.0.1
{{. Host . Port }}                                  //  22
{{. Host . User }}                                  //  moul
{{. Host . Prototype }}                             //  moul@127.0.0.1:22
{{. Host }}                                       //  {"HostName":"localhost","Port":22","User":"moul","ControlPersist":"yes",...}
{{ printf "%s:%s" . Host . HostName . Host . Port }}    //  localhost:22

// Error
{{. Error }}                                      //  dial tcp: lookup localhost: no such host 
OnDisconnect

当assh插座关闭时, OnDisconnect被称为。

警告:如果关闭SSH连接时看不到通知,则可能配置了ControlMasterOnDisconnectssh程序没有链接,而是与其插座相关联,即使退出ssh程序也可能会活着。


Golang模板变量的示例:

 // Host: http://god*o*c.org*/moul.io/assh/pkg/config/#Host
{{. Host . Name }}                                  //  localhost
{{. Host . HostName }}                              //  127.0.0.1
{{. Host . Port }}                                  //  22
{{. Host . User }}                                  //  moul
{{. Host . Prototype }}                             //  moul@127.0.0.1:22
{{. Host }}                                       //  {"HostName":"localhost","Port":22","User":"moul","ControlPersist":"yes",...}
{{ printf "%s:%s" . Host . HostName . Host . Port }}    //  localhost:22

// Stats: http://godoc.o***rg/moul.io/assh/pkg/commands/#ConnectionStats
{{. Stats . ConnectedAt }}                           //  2016-07-20 11:19:23.467900594 +0200 CEST
{{. Stats . WrittenBytes }}                          //  3613
{{. Stats . WrittenBytesHuman }}                     //  3.6kb
{{. Stats . DisconnectAt }}                          //  2016-07-20 11:19:29,520515792 +0200 CEST
{{. Stats . ConnectionDuration }}                    //  6.052615198s
{{. Stats . ConnectionDurationHuman }}               //  6s
{{. Stats . AverageSpeed }}                          //  596.933bps
{{. Stats . AverageSpeedHuman }}                     //  3.4kb/s 
beforeconfigwrite

assh重写~/.ssh/config文件之前, BeforeConfigWrite被调用。


Golang模板变量的示例:

{{. SSHConfigPath }}                               // ~/.ssh/config 

钩司机

执行驱动程序

Exec驱动程序使用Golang的模板系统执行shell命令

用法: exec <binary> [args...]

 defaults :
  Hooks :
    OnConnect : exec echo '{{.Host}}' | jq .
# executes: `echo '{"HostName":"localhost","Port":"22","User":"moul","ControlPersist":"yes",...}' | jq .
# which results in printing a pretty JSON of the host
# {
#   "HostName": "localhost",
#   "Port": "22",
#   "User": "moul",
#   "ControlPersist": "yes",
#   ...
# } 
assh@42.am # send an email with the connection prototype">
 defaults :
  Hooks :
    OnConnect : exec echo 'New SSH connection to {{.Host.Prototype}}.' | mail -s "SSH connection journal" m+ assh @42.am
# send an email with the connection prototype 
 defaults :
  Hooks :
    BeforeConfigWrite : exec cp {{.SSHConfigPath}} {{.SSHConfigPath}}.backup
# make a copy of ~/.ssh/config before being rewritten 
 defaults :
  Hooks :
    AfterConfigWrite : ' exec echo "# date: `date`" >> {{.SSHConfigPath}} '
# Append a comment with the compilation date to the generated ~/.ssh/config file 
 defaults :
  Hooks :
  AfterConfigWrite : ' exec cat /path/to/my/provider/generated/.ssh/config >> {{.SSHConfigPath}} '
# Append another .ssh/config file to the generated .ssh/config file

exec命令正在阻止,计划了一个新的背景任务驱动程序。目前,您可以在这样的背景中运行一份工作:

 defaults :
  Hooks :
    OnConnect :
    - exec sleep 60 &
# execute the `sleep 60` command in background (non-blocking)
# if you quit your ssh connection, the process will continue in background. 
写驱动程序

写驱动程序使用Golang的模板系统来写入数据

用法: write <line:string...>

 defaults :
  Hooks :
    OnConnect :
    - write New SSH connection to {{.Host.Prototype}}.
# writes: "New SSH connection to moul@127.0.0.1:22." on the terminal on connection 
 defaults :
  Hooks :
    OnDisconnect :
    - " write SSH connection to {{.Host.Name}} closed, {{ .Stats.WrittenBytes }} bytes written in {{ .Stats.ConnectionDuration }} ({{ .Stats.AverageSpeed }}) "
# writes: SSH connection to localhost closed, 40 bytes written. 
通知驱动程序

通知驱动程序使用Golang的模板系统打开桌面通知。

  • Mac OS X :内置支持
  • Linux :取决于GNOTIFIER
  • Windows :不支持
  • BSD :不支持

用法: notify <line:string...>

 defaults :
  Hooks :
    OnConnect : notify New SSH connection to {{.Host.Prototype}}. 
 defaults :
  Hooks :
    OnDisconnect :
    - " notify SSH connection to {{.Host.Name}} closed, {{ .Stats.WrittenBytes }} bytes written in {{ .Stats.ConnectionDuration }} ({{ .Stats.AverageSpeed }}) " 

配置

assh现在管理~/.ssh/config文件,请注意备份~/.ssh/config文件。

~/.ssh/ assh .yml是一个包含:

  • 一个hosts字典,包含多个主机定义
  • 一个包含全局标志defaults部分
  • 一个includes包含其他配置文件路径的部分
assh` - 'exec cat ~/.ssh/my-heroku-generated-config >> {{.SSHConfigPath}}' # Alert me with a Desktop notification - notify "{{.SSHConfigPath}} has been rewritten" OnConnect: # Log internal information to a file - exec printf '{{.}}' | jq . >> ~/.ssh/last_connected_host.txt # Alert me with a Desktop notification - notify New SSH connection to {{.Host.Prototype}} at {{.Stats.ConnectedAt}} # Write the host prototype to the terminal stderr - write New SSH connection to {{.Host.Prototype}} OnDisconnect: # write on terminal and in a Desktop notification some statistics about the finished connection - "write SSH connection to {{.Host.HostName}} closed, {{.Stats.WrittenBytes }} bytes written in {{.Stats.ConnectionDuration}} ({{.Stats.AverageSpeed}}bps)" - "notify SSH connection to {{.Host.HostName}} closed, {{.Stats.WrittenBytes }} bytes written in {{.Stats.ConnectionDuration}} ({{.Stats.AverageSpeed}}bps)" includes: - ~/.ssh/ assh .d/*.yml - /etc/ assh .yml - $ENV_VAR/blah-blah-*/*.yml assh BinaryPath: ~/bin/ assh # optionally set the path of assh ">
 hosts :

  homer :
    # ssh homer ->  ssh 1.2.3.4 -p 2222 -u robert
    Hostname : 1.2.3.4
    User : robert
    Port : 2222

  bart :
    # ssh bart ->   ssh 5.6.7.8 -u bart           <- direct access
    #            or ssh 5.6.7.8/homer -u bart     <- using homer as a gateway
    Hostname : 5.6.7.8
    User : bart
    Gateways :
    - direct                   # tries a direct access first
    - homer                    # fallback on homer gateway

  maggie :
    # ssh maggie ->   ssh 5.6.7.8 -u maggie       <- direct access
    #              or ssh 5.6.7.8/homer -u maggie   <- using homer as a gateway
    User : maggie
    Inherits : bart             # inherits rules from "bart"

  bart-access :
    # ssh bart-access ->  ssh home.simpson.springfield.us -u bart
    Inherits :
    - bart-template
    - simpson-template

  lisa-access :
    # ssh lisa-access ->  ssh home.simpson.springfield.us -u lisa
    Inherits :
    - lisa-template
    - simpson-template

  marvin :
    # ssh marvin    -> ssh marvin    -p 23
    # ssh sad-robot -> ssh sad-robot -p 23
    # ssh bighead   -> ssh bighead   -p 23
    # aliases inherit everything from marvin, except hostname
    Port : 23
    Aliases :
    - sad-robot
    - bighead

  dolphin :
    # ssh dolphin   -> ssh dolphin -p 24
    # ssh ecco      -> ssh dolphin -p 24
    # same as above, but with fixed hostname
    Port : 24
    Hostname : dolphin
    Aliases : ecco
    RateLimit : 10M # 10Mbytes/second rate limiting

  schooltemplate :
    User : student
    IdentityFile : ~/.ssh/school-rsa
    ForwardX11 : yes

  schoolgw :
    # ssh school ->   ssh gw.school.com -l student -o ForwardX11=no -i ~/.ssh/school-rsa
    Hostname : gw.school.com
    ForwardX11 : no
    Inherits : schooltemplate

  " expanded-host[0-7]* " :
    # ssh somehost2042 ->       ssh somehost2042.some.zone
    Hostname : " %h.some.zone "

  vm-*.school.com :
    # ssh vm-42.school.com ->   ssh vm-42.school.com/gw.school.com -l student -o ForwardX11=yes -i ~/.ssh/school-rsa
    Gateways : schoolgw
    Inherits : schooltemplate
    # do not automatically create `ControlPath` -> may result in error
    ControlMasterMkdir : true

  " *.shortcut1 " :
    ResolveCommand : /bin/sh -c "echo %h | sed s/.shortcut1/.my-long-domain-name.com/"

  " *.shortcut2 " :
    ResolveCommand : /bin/sh -c "echo $(echo %h | sed s/.shortcut2//).my-other-long-domain-name.com"

  " *.scw " :
    # ssh toto.scw -> 1. dynamically resolves the IP address
    #                 2. ssh {resolved ip address} -u root -p 22 -o UserKnownHostsFile=null -o StrictHostKeyChecking=no
    # requires github.com/scaleway/scaleway-cli
    ResolveCommand : /bin/sh -c "scw inspect -f {{.PublicAddress.IP}} server:$(echo %h | sed s/.scw//)"
    User : root
    Port : 22
    UserKnownHostsFile : /dev/null
    StrictHostKeyChecking : no

  my-env-host :
    User : user-$USER
    Hostname : ${HOSTNAME}${HOSTNAME_SUFFIX}

templates :
  # Templates are similar to Hosts; you can inherit from them
  # but you cannot ssh to a template
  bart-template :
    User : bart
  lisa-template :
    User : lisa
  simpson-template :
    Host : home.simpson.springfield.us

defaults :
  # Defaults are applied to each hosts
  ControlMaster : auto
  ControlPath : ~/tmp/.ssh/cm/%h-%p-%r.sock
  ControlPersist : yes
  Port : 22
  User : bob
  Hooks :
    # Automatically backup ~/.ssh/config
    BeforeConfigWrite :
      - ' exec set -x; cp {{.SSHConfigPath}} {{.SSHConfigPath}}.bkp '

    AfterConfigWrite :
      # Concat another `ssh_config` file with the one just generated by ` assh `
      - ' exec cat ~/.ssh/my-heroku-generated-config >> {{.SSHConfigPath}} '

      # Alert me with a Desktop notification
      - notify "{{.SSHConfigPath}} has been rewritten"

    OnConnect :
      # Log internal information to a file
      - exec printf '{{.}}' | jq . >> ~/.ssh/last_connected_host.txt

      # Alert me with a Desktop notification
      - notify New SSH connection to {{.Host.Prototype}} at {{.Stats.ConnectedAt}}

      # Write the host prototype to the terminal stderr
      - write New SSH connection to {{.Host.Prototype}}

    OnDisconnect :
      # write on terminal and in a Desktop notification some statistics about the finished connection
      - " write  SSH connection to {{.Host.HostName}} closed, {{.Stats.WrittenBytes }} bytes written in {{.Stats.ConnectionDuration}} ({{.Stats.AverageSpeed}}bps) "
      - " notify SSH connection to {{.Host.HostName}} closed, {{.Stats.WrittenBytes }} bytes written in {{.Stats.ConnectionDuration}} ({{.Stats.AverageSpeed}}bps) "

includes :
- ~/.ssh/ assh .d/*.yml
- /etc/ assh .yml
- $ENV_VAR/blah-blah-*/*.yml

assh BinaryPath : ~/bin/ assh  # optionally set the path of assh

为了进一步的启发,这些assh .yml在公共GitHub项目上的文件可以教育您如何使用assh

用法

assh

assh - advanced ssh config USAGE: assh [global options] command [command options] [arguments...] VERSION: 2.8.0 (HEAD) AUTHOR(S): Manfred Touron <https://gi*thu**b.com/moul/assh> COMMANDS: ping Send packets to the SSH server and display statistics info Display system-wide information config Manage ssh and assh configuration sockets Manage control sockets help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --config value, -c value Location of config file (default: "~/.ssh/ assh .yml") [$ assh _CONFIG] --debug, -D Enable debug mode [$ assh _DEBUG] --verbose, -V Enable verbose mode --help, -h show help --version, -v print the version">
 NAME:
   assh - advanced ssh config

USAGE:
   assh [global options] command [command options] [arguments...]

VERSION:
2.8.0 (HEAD)

AUTHOR(S):
   Manfred Touron <https://gi*thu**b.com/moul/assh>

COMMANDS:
   ping          Send packets to the SSH server and display statistics
   info          Display system-wide information
   config        Manage ssh and assh configuration
   sockets       Manage control sockets
   help, h       Shows a list of commands or help for one command

GLOBAL OPTIONS:
  --config value, -c value       Location of config file (default: "~/.ssh/ assh .yml") [$ assh _CONFIG]
  --debug, -D                    Enable debug mode [$ assh _DEBUG]
  --verbose, -V                  Enable verbose mode
  --help, -h                     show help
  --version, -v                  print the version

用法示例

assh config build

重写并替换现有的〜/.ssh/配置文件。

当检测配置更改时,通过assh自动完成此操作。运行此命令可用于设置assh或维修配置文件。

$ assh config build > ~ /.ssh/config 

assh config list

列出主机和选项。

assh config list Listing entries *.scw -> root@[hostname_not_specified]:22 StrictHostKeyChecking=no [custom options] UserKnownHostsFile=/dev/null [custom options] *.shortcut1 -> bob@[hostname_not_specified]:22 *.shortcut2 -> bob@[hostname_not_specified]:22 bart -> bart@5.6.7.8:22 bart-access -> bob@[hostname_not_specified]:22 dolphin -> bob@dolphin:24 expanded-host[0-7]* -> bob@%h.some.zone:22 homer -> robert@1.2.3.4:2222 lisa-access -> bob@[hostname_not_specified]:22 maggie -> maggie@[hostname_not_specified]:22 marvin -> bob@[hostname_not_specified]:23 my-env-host -> user-moul@[hostname_not_specified]:22 schoolgw -> bob@gw.school.com:22 ForwardX11=no [custom options] schooltemplate -> student@[hostname_not_specified]:22 ForwardX11=yes [custom options] IdentityFile=~/.ssh/school-rsa [custom options] vm-*.school.com -> bob@[hostname_not_specified]:22 (*) General options: ControlMaster: auto ControlPath: ~/tmp/.ssh/cm/%h-%p-%r.sock ControlPersist: yes Port: 22 User: bob">
$ assh config list
Listing entries

    *.scw -> root@[hostname_not_specified]:22
        StrictHostKeyChecking=no [custom options]
        UserKnownHostsFile=/dev/null [custom options]

    *.shortcut1 -> bob@[hostname_not_specified]:22

    *.shortcut2 -> bob@[hostname_not_specified]:22

    bart -> bart@5.6.7.8:22

    bart-access -> bob@[hostname_not_specified]:22

    dolphin -> bob@dolphin:24

    expanded-host[0-7]* -> bob@%h.some.zone:22

    homer -> robert@1.2.3.4:2222

    lisa-access -> bob@[hostname_not_specified]:22

    maggie -> maggie@[hostname_not_specified]:22

    marvin -> bob@[hostname_not_specified]:23

    my-env-host -> user-moul@[hostname_not_specified]:22

    schoolgw -> bob@gw.school.com:22
        ForwardX11=no [custom options]

    schooltemplate -> student@[hostname_not_specified]:22
        ForwardX11=yes [custom options]
        IdentityFile=~/.ssh/school-rsa [custom options]

    vm-*.school.com -> bob@[hostname_not_specified]:22

    (*) General options:
        ControlMaster: auto
        ControlPath: ~/tmp/.ssh/cm/%h-%p-%r.sock
        ControlPersist: yes
        Port: 22
        User: bob 

assh config graphviz

生成主机的GraphViz图

assh -hosts.png">
$ assh config graphviz | dot -Tpng > assh -hosts.png 

assh config search <keyword>

在主机和主机选项中搜索<keyword>

assh config search bart Listing results for bart: bart -> bart@5.6.7.8:22 bart-access -> moul@[hostname_not_specified]:22">
$ assh config search bart
Listing results for bart:
    bart -> bart@5.6.7.8:22
    bart-access -> moul@[hostname_not_specified]:22 

assh info

显示全系统的信息。

assh info Debug mode (client): false CLI Path: /path/to/ assh Go version: go1.6.2 OS/Arch: darwin/amd64 RC files: - ~/.ssh/ assh .yml - ~/.ssh/ assh .d/hosts.yml - ~/.ssh/ assh .d/moul.yml - ~/.ssh/ assh .d/test.yml Statistics: - 299 hosts - 2 templates - 4 included files">
$ assh info
Debug mode (client): false
CLI Path: /path/to/ assh
Go version: go1.6.2
OS/Arch: darwin/amd64

RC files:
- ~/.ssh/ assh .yml
- ~/.ssh/ assh .d/hosts.yml
- ~/.ssh/ assh .d/moul.yml
- ~/.ssh/ assh .d/test.yml

Statistics:
- 299 hosts
- 2 templates
- 4 included files 

assh sockets list

列出主动控制插座。

assh sockets list 4 active control sockets in "~/.ssh/cm/": - bart/homer/lisa-22-root.sock (14 minutes) - bart/homer-22-root.sock (14 minutes) - bart-22-root.sock (14 minutes) - marge-22-bart.sock (1 hour)">
$ assh sockets list
4 active control sockets in "~/.ssh/cm/":

- bart/homer/lisa-22-root.sock (14 minutes)
- bart/homer-22-root.sock (14 minutes)
- bart-22-root.sock (14 minutes)
- marge-22-bart.sock (1 hour) 

assh sockets flush

关闭主动控制插座。

assh sockets flush Closed 4 control sockets.">
$ assh sockets flush
Closed 4 control sockets. 

assh sockets master

创建一个主控制插座。

$ assh sockets master 

assh ping

将数据包发送到SSH服务器并显示统计数据。

assh ping -c 4 localhost PING localhost (127.0.0.1) PORT 22 (ssh) PROTO tcp Connected to 127.0.0.1: seq=0 time=321µs protocol=tcp port=22 Connected to 127.0.0.1: seq=1 time=501µs protocol=tcp port=22 Connected to 127.0.0.1: seq=2 time=550µs protocol=tcp port=22 Connected to 127.0.0.1: seq=3 time=641µs protocol=tcp port=22 --- localhost assh ping statistics --- 4 packets transmitted, 4 packets received, 0.00% packet loss round-trip min/avg/max = 321µs/503.25µs/641µs">
$ assh ping -c 4 localhost
PING localhost (127.0.0.1) PORT 22 (ssh) PROTO tcp
Connected to 127.0.0.1: seq=0 time=321µs protocol=tcp port=22
Connected to 127.0.0.1: seq=1 time=501µs protocol=tcp port=22
Connected to 127.0.0.1: seq=2 time=550µs protocol=tcp port=22
Connected to 127.0.0.1: seq=3 time=641µs protocol=tcp port=22

--- localhost assh ping statistics ---
4 packets transmitted, 4 packets received, 0.00% packet loss
round-trip min/avg/max = 321µs/503.25µs/641µs 

安装

使用GO获取最新版本(推荐方法):

go install moul.io/ assh /v2@latest

注意:使用GO1.7或更高版本测试


使用Homebrew(Mac OS X)获取最新发布的版本:

brew install assh

构建最新版本

brew install assh --HEAD

获取发布版本:https://github.com/moul/assh/releases


使用ASDF-VM安装:

assh asdf install assh latest asdf global assh latest">
asdf plugin add assh
asdf install assh latest
asdf global assh latest

注册包装器(可选)

要在使用高级模式匹配时提高经验,请在.bashrc / .zshrc / config.fish的末尾添加以下内容:

 alias ssh= " assh wrapper ssh -- "

此步骤不是强制性的,但强烈建议


注意ssh不了解高级模式;为了绕过这一限制, assh维护已知主机的列表,并使用所有这些已知的已知主机再生~/.ssh/config

如果没有包装器,则首次连接到新主机时将过时的~/.ssh/config风险,您需要再次启动该命令。

使用包装器, ssh始终使用更新的~/.ssh/config文件调用。

入门

  1. 备份您的旧~/.ssh/configcp ~/.ssh/config ~/.ssh/config.backup
  2. 创建一个新的~/.ssh/ assh .yml文件
  3. 运行assh config build > ~/.ssh/config以验证您的~/.ssh/ assh .yml文件的语法,并自动构建您的~/.ssh/config文件
  4. 你准备好了!

WebApp

assh包含一个在Heroku上托管的实验Web应用程序:https://assh.herokuapp.com/


assh .yml文件转换为ssh_config格式:

assh _config=@~/.ssh/ assh .d/test.yml | jq -r .ssh_config # This file was automatically generated by assh v2.8.0 # on 2018-07-03 21:06:56 +0000 UTC, based on ~/.ssh/ assh .yml # # more info: https://gi*th*ub.*com/moul/assh # host-based configuration Host *.scw Port 22 StrictHostKeyChecking no User root UserKnownHostsFile /dev/null # ResolveCommand: /bin/sh -c "scw inspect -f {{.PublicAddress.IP}} server:$(echo %h | sed s/.scw//)" Host lalala Port 22 User moul # HostName: 127.0.0.1 Host toto[0-5]toto User samantha # global configuration Host * ProxyCommand assh connect --port=%p %h">
$ http --form POST https://assh-dev.h*erok**uapp.com/ assh -to-ssh assh _config=@~/.ssh/ assh .d/test.yml | jq -r .ssh_config
# This file was automatically generated by assh v2.8.0
# on 2018-07-03 21:06:56 +0000 UTC, based on ~ /.ssh/ assh .yml
#
# more info: https://gi*th*ub.*com/moul/assh

# host-based configuration
下载源码

通过命令行克隆项目:

git clone https://github.com/moul/assh.git