SSX,一个有记忆的 ssh 客户端

需求来源

对于一个后端程序员来说,在工作中免不了要和繁杂的服务器打交道,ssh 是不可或缺的开发工具。但每次登录都需要输入密码的行为,对于认为一切皆可自动化的程序员来说,肯定是有点繁琐的(如果您是使用图形化界面的用户可忽略)。

所以我在前段时间考虑,我应该自己实现一个 ssh 客户端,它不需要拥有许多复杂的功能,只需要满足我以下这几个需求即可满足日常使用:

  • 和 ssh 保持差不多的使用习惯
  • 仅在第一次登录时询问我密码,后续使用无需再提供密码
  • 可以给服务器它任意的标签,这样我就可以自由地通过IP 或者标签来登录

于是乎,近期我在业余时间就设计并编写了 ssx 这个轻量级的具有记忆的 ssh 客户端。它完美的实现了上面我所需要的功能,也已经被我愉快的应用到了日常的开发中。

项目源码地址:https://github.com/vimiix/ssx

使用方式

下面就简单介绍一下 ssx 的使用方式。

ssx 是通过 golang 开发的一个独立的二进制文件,安装方式就是从 release 页面下载对应平台的软件包,解压后把 ssx 二进制放到系统的任意目录下,这里我习惯放到 /usr/local/bin 目录下,如果你选择其他目录下,需要确保存放的目录添加到 $PATH 环境变量中,这样后续使用我们就不用再添加路径前缀,直接通过 ssx 命令就可以运行了。

登录服务器

使用 ssx 登录服务器的时候,基本和 ssh 使用习惯一致,下面是基本命令模式:

bash 复制代码
ssx [-s] [USER@]HOST[:PORT] [-k IDENTITY_FILE]

在这个命令中,USER 是可以省略的,如果省略则是系统当前用户名;PORT 是可以省略的,默认是 22,-k IDENTITY_FILE 代表如果是使用私钥登录,则通过 -k 来指定私钥的路径,也是可以省略的,默认是 ~/.ssh/id_rsa,当然了,前提是这个文件存在。所以最精简的登录命令就是:ssx <ip>

当首次登录,不存在可用私钥时,会通过交互方式来让用户输入密码,一旦登录成功,这个密码就会被 ssx 保存到本地的数据文件中 (默认为 ~/.ssx/db, 可通过环境变量 SSX_DB_PATH 进行自定义),下次登录时,仍然执行 ssx <ip> 即可自动登录。

注意,登录过的服务器,再次登录时,我嫌输入全部 IP 比较麻烦,所以 ssx 支持输入 IP 中的部分字符,自动搜索匹配进行登录。

为服务器打标签

当我们成功登录过一次服务器后,就可以通过 ssx list 命令来查看目前 ssx 存储的所有服务器列表。下面是一个列表示例:

bash 复制代码
# output example
# Entries (stored in ssx)
#  ID |       Address        |          Tags
#-----+----------------------+--------------------------
#  1  | root@172.23.1.84:22  | centos

ssx 会给每个服务器分配一个唯一的 ID,我们在打标签时就需要通过 ID 来指定服务器条目。

当然,既然服务器有唯一 ID,ssx 也支持通过 ID 来进行登录:ssx -i <ID>

打标签需要通过 ssx 的子命令 tag 来完成,下面是 tag 命令的模式:

bash 复制代码
ssx tag -i <ENTRY_ID> [-t TAG1 [-t TAG2 ...]] [-d TAG3 [-d TAG4 ...]]
  • -i 指定 list 命令输出的要操作的服务器对应的 ID 字段
  • -t 指定要添加的标签名,可以多次指定就可以同时添加多个标签
  • -d 指定要删除的标签名,同样也可以多次指定

当我们完成对服务器的打标签后,比如上面示例中的服务器,我增加了一个 centos 的标签,那么我此时就可以通过标签来进行登录了:

bash 复制代码
// -t 可省略
ssx [-t] centos

删除服务器记录

ssx 也支持删除服务器记录,命令如下:

bash 复制代码
ssx delete -i <ID>

一旦删除,ssx 不会保留该服务器的任何信息,所以下次登录时会等同于新的服务器来对待,ID 也会重新生成。

目前支持的环境变量

除了上面提到的 SSX_DB_PATH 可以指定存储数据的文件外,ssx 还支持:

  • SSX_CONNECT_TIMEOUT:SSH连接超时时间,默认为 10s
  • SSX_IMPORT_SSH_CONFIG:是否引用用户 ssh 配置,默认为空

这里我解释一下 SSX_IMPORT_SSH_CONFIG 的作用,这个环境变量不设置时,ssx 默认是不会读取用户的 ~/.ssh/config 文件的,ssx 只使用自己存储文件进行检索。如果将这个环境变量设置为非空(任意字符串),ssx 就会在初始化的时候加载用户 ssh 配置文件中存在的服务器条目,但 ssx 仅读取用于检索和登录,并不会将这些条目持久化到 ssx 的存储文件中 ,所以,如果 ssx IP 登录时,这个 IP 是 ~/.ssh/config 文件中已经配置过登录验证方式的服务器,ssx 匹配到就直接登录了。但 ssx list 查看时,该服务器会被显示到 found in ssh config 的表格中,这个表格中的条目是不具有 ID 属性的,以下是一个示例:

bash 复制代码
export SSX_IMPORT_SSH_CONFIG=true
ssx list
# output example
# Entries (stored in ssx)
#  ID |       Address        |          Tags
#-----+----------------------+--------------------------
#  1  | root@172.23.1.84:22  | centos
#
# Entries (found in ssh config)
#               Address              |           Tags
# -----------------------------------+----------------------------
#   git@ssh.github.com:22            | github.com
相关推荐
墨理学AI39 分钟前
GitHub 桌面版配置 |可视化界面进行上传到远程仓库 | gitLab 配置【把密码存在本地服务器】
gitlab·github·github 桌面版
慕城南风2 小时前
Go语言中的defer,panic,recover 与错误处理
golang·go
AI理性派思考者7 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu
LeonNo1110 小时前
golang , chan学习
开发语言·学习·golang
龙门吹雪10 小时前
GO语言基础面试题
golang·面试题·map·channel·
DexterLien10 小时前
Debian 12 安装配置 fail2ban 保护 SSH 访问
运维·debian·ssh·fail2ban
zyh_03052110 小时前
GIN中间件
后端·golang·gin
wy02_11 小时前
Linux下载RabbitMQ,并解决Github拒绝访问443的问题
linux·rabbitmq·github
Domain-zhuo12 小时前
Git常用命令
前端·git·gitee·github·gitea·gitcode
aPurpleBerry12 小时前
解决 fatal: detected dubious ownership in repository at ‘XXXX‘ 问题
github