Jeff-Blane/ssh-ops
GitHub: Jeff-Blane/ssh-ops
ssh-ops 是一个基于 fzf 和 OpenSSH 的单文件 ZSH 插件,将 ssh config 转化为支持模糊搜索、隧道管理和会话记录的交互式服务器选择器。
Stars: 0 | Forks: 0
# ssh-ops
这是一个单文件 ZSH 插件,能将你的 `~/.ssh/config` 变成交互式指挥中心。输入 `s`,选择服务器,即可连接。无需 GUI,无需凭据存储,无需云同步。仅仅是在 OpenSSH 之上使用了 `fzf`。
专为需要管理多台服务器的用户打造,尤其适合需要同时处理 C2 基础设施、扫描器、报告环境和测试工具的渗透测试人员和红队成员。
## 安装说明
```
git clone https://github.com/Jeff-Blane/ssh-ops.git
cd ssh-ops
chmod +x install.sh
./install.sh
```
需要 `fzf` 和 ZSH。可选依赖:`tmux`、`bat`。
或手动安装:
```
mkdir -p ~/.ssh-ops ~/.ssh/logs
cp ssh-ops.zsh ~/.ssh-ops/
echo 'source ~/.ssh-ops/ssh-ops.zsh' >> ~/.zshrc
source ~/.zshrc
```
## 工作原理
在你的 `~/.ssh/config` 中构建带有分组标题的结构:
```
# === OFFENSIVE OPS ===
Host c2-primary
HostName 10.0.1.1
User operator
Port 22
IdentityFile ~/.ssh/id_ed25519
LocalForward 9443 127.0.0.1:9443
Host phishing
HostName 10.0.1.2
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
# === SCANNING ===
Host scanner
HostName 10.0.2.1
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
LocalForward 3000 127.0.0.1:3000
# === INFRASTRUCTURE ===
Host reporting
HostName 10.0.3.1
User admin
Port 22
IdentityFile ~/.ssh/id_ed25519
```
输入 `s`,即可获得一个支持模糊搜索且已分类的服务器列表,并在预览窗格中显示高亮主机的配置块。
## 命令
### 交互式选择器
| 快捷键 | 模式 | 功能说明 |
|------------|------|-------------|
| `Enter` | Shell | 标准 SSH 连接 |
| `Ctrl-S` | Strict | 禁用 agent forwarding。适用于在共享/不可信服务器上使用。 |
| `Ctrl-W` | Tunnel | 激活 `LocalForward` 条目 + 自动打开浏览器 |
| `Ctrl-T` | Tmux | 附加到(或创建)持久的 tmux 会话 |
| `Ctrl-L` | Logged | 通过 `script(1)` 记录完整的终端输出 |
| `Ctrl-A` | Status | 对所有服务器进行 TCP-ping,显示在线/离线状态 |
### 直接命令
| 命令 | 描述 |
|---------|-------------|
| `s` | 交互式选择器 |
| `ss` | 检查所有服务器状态 |
| `srun "uptime"` | 在每台服务器上运行命令 |
| `srun "df -h" c2-primary` | 在单台服务器上运行命令 |
| `sweb c2-primary` | 后台建立 tunnel + 打开浏览器 |
| `slog c2-primary` | 开启会话日志记录进行连接 |
| `st c2-primary` | SSH + 自动附加 tmux |
| `sl` | 浏览已保存的会话日志 |
| `slist` | 打印所有主机及其分组和 tunnel |
| `sput host file /remote/path` | SCP 上传 |
| `sget host /remote/file .` | SCP 下载 |
## Tunnel 模式
这是最节省时间的功能。大多数服务器端工具都有 Web UI:C2 面板、扫描器仪表盘、CRM、监控。无需手动运行 `ssh -L 9443:127.0.0.1:9443 c2-primary` 并打开浏览器,你只需:
- 在选择器中:高亮选中主机,按下 `Ctrl-W`
- 或在命令行中:`sweb c2-primary`
ssh-ops 会从你的配置中读取 `LocalForward` 行,建立 tunnel,检测 HTTPS 端口(443、8443、9443),并打开浏览器。当你断开连接时,tunnel 会自动关闭。
## 会话日志记录
在选择器中按下 `Ctrl-L`(或使用 `slog hostname`)即可使用系统 `script(1)` 命令记录完整的终端输出。日志将存放在 `~/.ssh/logs/` 中,格式如下:
```
hostname_YYYYMMDD_HHMMSS.log
```
之后你可以使用 `sl` 浏览它们,该命令提供带预览功能的 fzf 选择界面。
## 单次任务隔离
将 ssh-ops 指向专用的配置文件,即可将其范围限定在单个任务内:
```
export SSH_OPS_CONFIG="$HOME/.ssh/configs/engagement-acme"
s
```
避免连接到错误客户基础设施的风险。
## 配置
在 `.zshrc` 中的 source 行之前设置以下内容:
```
export SSH_OPS_CONFIG="$HOME/.ssh/config" # SSH config path
export SSH_OPS_LOG_DIR="$HOME/.ssh/logs" # Session log directory
export SSH_OPS_TIMEOUT=5 # Status check timeout (seconds)
export SSH_OPS_HEIGHT="60%" # fzf selector height
export SSH_OPS_HEADER="SSH-OPS" # Selector header text
export SSH_OPS_BROWSER="open" # Browser command (macOS: open)
```
## 安全性
- **不存储任何数据。** 它仅仅是 OpenSSH 之上的 UI 层。密钥保留在 `~/.ssh/` 中,由 ssh-agent 管理。
- **无网络调用。** 仅读取本地文件并调用 `ssh`。仅此而已。
- **单一依赖。** fzf。一个没有运行时依赖的独立二进制文件。
- **Strict 模式。** Ctrl-S 禁用 agent forwarding。在连接到共享基础设施时使用此模式,可防止 agent 被劫持。
- **日志为本地明文。** 请像对待你的密钥一样谨慎处理 `~/.ssh/logs/`。
## SSH 配置加固
既然你已经了解了相关知识:
```
Host *
AddKeysToAgent yes
UseKeychain yes
IdentitiesOnly yes
ServerAliveInterval 60
ServerAliveCountMax 3
StrictHostKeyChecking ask
VerifyHostKeyDNS yes
HashKnownHosts yes
```
请将面向互联网的服务器上的 SSH 移出 22 端口,禁用密码认证,并考虑使用 `ipset` + `ufw` 进行 geo-IP 过滤,以拦截机器人流量。
## 卸载
```
chmod +x uninstall.sh && ./uninstall.sh
```
移除插件及 `.zshrc` 中的条目。配置文件和日志保持不变。
## 致谢
## 开源协议
MIT
标签:SOC Prime, SSH, ZSH, 开发工具, 数据展示, 服务器管理, 红队