#ssh #tui #cli

app sshc

一个简单的基于TUI的SSH连接/隧道管理器

1 个稳定版本

使用旧的Rust 2015

1.0.0 2017年8月22日

#192#ssh

MIT 许可证

37KB
779

sshc:一个简单的SSH连接管理器

sshc 是一个非常简单的基于文本对话框的用户界面SSH连接管理器。基本上,它提供了一种配置文件格式和一个用户界面,将配置转换为执行 ssh 命令。配置文件允许定义连接链,以及端口转发。

如何构建

此程序使用Cargo进行构建管理,并发布到 crates.io。运行 cargo install sshc 以将程序安装到您的 ~/.cargo/bin 目录中。sshc 使用 termion 作为底层TUI引擎,因此它不依赖于任何第三方库,如ncurses。

如何使用

~/.config/sshc 目录中创建一个 config.toml 文件并运行 sshc

它将根据 sshc.toml 的内容显示一个菜单。使用上/下和Enter键在运行配置的树中导航。使用Esc键向上导航树并在根级别时退出。或者,您也可以直接在命令行中指定配置文件名

$ sshc -p my.server

在此方法中,您还可以传递 - 参数进行dry run(sshc将仅打印要执行的命令)。

配置文件

配置文件是一个 TOML 文档,它由以下格式的项目组成

[[group.subgroup.item]]
host = "<host definition>"
port = <port number>
user = "<user name>"
key = "<path to the public key file>"
tunnel = <tunnel specification (see below)>
verbose = true/false                       
agent_passthrough = true/false             
no_command = true/false                    

除了 host 之外的所有字段都是可选的。此外,host 字段可能具有以下格式

# Full
user@host:12345:/home/user/keys/for-host.pem

# No port and user
host::/home/user/keys/for-host.pem

# No key
user@host:2222

换句话说,您可以将用户名、端口和公钥作为主机定义的一部分来定义。如果某些参数既在主机部分定义又在配置表中定义,则表中的值具有优先权。

verbose 选项直接映射到 - 标志的 ssh 命令,agent_passthrough 映射到 -,而 no_command 映射到 -。但是,sshc处理后两个标志的方式取决于是否配置了端口转发(tunnel)。

上面的配置部分示例故意写成长格式;通常您可以用更短的方式定义它,例如

[group.subgroup]
item1 = ["user@server"]
item2 = [{ host = "server", port = 2222, verbose = true }]

请注意,项目定义始终是数组。这是故意的,因为项目实际上定义了ssh调用。

考虑以下配置文件

home_server = [
    "public-vps.cc",
    "home-server.vpn",
]

sshc将其转换为以下SSH命令

ssh public-vps.cc -t ssh home-server.vpn

换句话说,如果您在配置文件中指定了多个记录,它们将被合并为一个SSH命令,通过-t连接。这将允许与链中的最后一个主机进行交互式连接,以及在中间的所有主机上提示密码。

隧道

考虑以下配置文件

transmission_ui = [
    { host = "public-vpn.cc", tunnel = 9091 },
    { host = "home-server.vpn" }
]

(注意,您必须将这两个项目都定义为表。这是TOML格式的限制。)

sshc将其转换为以下SSH命令

ssh -A -L 9091:localhost:9091 public-vpn.cc -t ssh -L 9091:localhost:9091 -N

隧道定义被转换为SSH命令的-L端口转发参数。它还被“向下”传播,并添加了-A-N参数。这种传播的规则如下。对于链内的每个单个跳转定义,如果当前定义中配置了tunnel

  1. 隧道配置被复制到下一个跳转定义中,除非它已经在那里定义,或者通过tunnel = false禁用;
  2. 如果当前跳转不是链中的最后一个,则在此定义中启用agent_passthrough选项,除非通过agent_passthrough = false明确禁用;
  3. 如果当前跳转是链中的最后一个,则在此定义中启用no_command选项,除非通过no_command = false明确禁用。

请注意,默认情况下,最后一个跳转不启用agent_passthrough,因为端口转发链通常是非交互式的,因此不需要代理。如果需要,可以明确启用它。

此外,每个隧道配置都根据以下规则展开

  1. 如果没有指定远程主机,则假定为主机"localhost"
  2. 如果定义了本地端口或远程端口但未定义其对等端口,则将对等端口设置为前者的值,例如,如果本地端口为2222且远程端口未设置,则假定也为2222

这些规则导致简单的定义,如tunnel = 9091自然扩展为常用的端口转发定义:tunnel = ":9091|localhost:9091"

许可

此程序受MIT许可协议许可。


版权(C)Vladimir Matveev,2014-2017

依赖项

~6–8MB
~148K SLoC