1 个稳定版本
使用旧的Rust 2015
1.0.0 | 2017年8月22日 |
---|
#192 在 #ssh
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
- 隧道配置被复制到下一个跳转定义中,除非它已经在那里定义,或者通过
tunnel = false
禁用; - 如果当前跳转不是链中的最后一个,则在此定义中启用
agent_passthrough
选项,除非通过agent_passthrough = false
明确禁用; - 如果当前跳转是链中的最后一个,则在此定义中启用
no_command
选项,除非通过no_command = false
明确禁用。
请注意,默认情况下,最后一个跳转不启用agent_passthrough
,因为端口转发链通常是非交互式的,因此不需要代理。如果需要,可以明确启用它。
此外,每个隧道配置都根据以下规则展开
- 如果没有指定远程主机,则假定为主机
"localhost"
; - 如果定义了本地端口或远程端口但未定义其对等端口,则将对等端口设置为前者的值,例如,如果本地端口为
2222
且远程端口未设置,则假定也为2222
。
这些规则导致简单的定义,如tunnel = 9091
自然扩展为常用的端口转发定义:tunnel = ":9091|localhost:9091"
。
许可
此程序受MIT许可协议许可。
版权(C)Vladimir Matveev,2014-2017
依赖项
~6–8MB
~148K SLoC