MarkTauber/rutabaga
GitHub: MarkTauber/rutabaga
一款根据俄语姓名模板批量生成登录名和邮箱地址,并支持 SMTP 协议验证邮箱存在性的命令行工具。
Stars: 0 | Forks: 0
# Rutabaga — 登录名和邮箱生成器
**Rutabaga** 是一个跨平台的 CLI 工具,用于根据带占位符的模板生成 AD 登录名和邮箱地址。
语言:[English](README.en.md) · [中文](README.zh.md)
## 快速开始
验证依赖(DNS MX):
```
pip install dnspython
```
标准生成:
```
python main.py -m '$l.$s' -d corp.local -o logins.txt
```
验证生成的地址(基础选项 — SMTP RCPT):
```
python main.py -m '$n.$s' -d corp.local -v -o ./out
```
高级选项(显式指定 `MAIL FROM` / `EHLO`,遍历 MX):
```
python main.py -m '$n.$s' -d corp.local -v -o ./out \
-w 10 --sender check@example.com --helo mx.example.com --mx
```
如果不使用 `-V`,控制台会输出 Banner、设置和状态;登录名会写入文件中。使用 `-V` 时,登录名会输出到 stdout。**不能同时使用 `-v` 和 `-V`。** 如果不使用 `-o`,文件会保存到主目录(`~/`),文件名根据 `-d` 或随机 ID 生成。
`-o` 标志接受**文件**或**目录**(在普通模式和 `-v` 模式下行为相同):
- 目录 → 自动命名的文件(`corp.local.txt` 或在使用 `-v` 时:`corp.local_valid.txt`, `corp.local_invalid.txt`, `corp.local_inconclusive.txt`);
- 文件 → 按原样使用(在使用 `-v` 时,旁边会创建 `文件名_valid.txt`, `文件名_invalid.txt`, `文件名_inconclusive.txt`)。
## 邮箱验证
使用 **`-v`** / **`--validate`** 标志时,rutabaga 会生成地址并检查邮箱是否存在(需要 **`-d`**)。确认存在的地址会同时输出到 stdout;完整日志在 stderr 中。
### `-v [METHOD …]` 方法
| 调用 | 方法 | 行为 |
|-------|--------|-----------|
| `-v` | SMTP | RCPT TO + catch-all 检查 |
| `-v SMTP` | SMTP | 同上 |
| `-v VRFY` | VRFY | 仅使用 `VRFY`(无 RCPT) |
| `-v VRFY EXPN` | VRFY, EXPN | 仅使用列出的方法;不会自动添加 SMTP |
| `-v SMTP VRFY` | SMTP, VRFY | 先执行 RCPT,如果失败,则在同一个 MX 上执行 `VRFY` |
在同一个 MX 上:**EHLO** →(**STARTTLS**,如果未禁用)→ 在同一个会话中按顺序执行方法。
默认情况下,**`--sender`** 和 **`--helo`** 是占位符;对于真实的 MX 最好显式指定。
### STARTTLS
- 默认:如果 MX 在 EHLO 之后宣告支持 `STARTTLS` — 则会话将被加密。
- **`--no-starttls`** — 纯文本 SMTP(仅与 `-v` 一起使用)。
### 验证标志
| 标志 | 用途 |
|------|------------|
| **`--mx`** | 当 RCPT 返回 5xx 时尝试下一个 MX(仅限 SMTP 方法) |
| **`--sender`** | `MAIL FROM` 地址 |
| **`--helo`** | 用于 `EHLO`/`HELO` 的主机名 |
| **`-w`** | 线程数(默认为 15) |
### 输出文件
| 文件 | 内容 |
|------|------------|
| `*_valid.txt` | 确认存在的地址(每行一个) |
| `*_invalid.txt` | TSV 格式:`email`, `status`, `reason` |
| `*_inconclusive.txt` | TSV 格式;SMTP 代码 252, 421, 450–452 |
### 状态
| 状态 | 文件 | 含义 |
|--------|------|-------|
| 已确认 | `valid` | 邮箱极有可能存在 |
| `INVALID` | `invalid` | 服务器明确拒绝 |
| `CATCH_ALL` | `invalid` | 域名接受任意地址 |
| `INCONCLUSIVE` | `inconclusive` | 无法断定存在 / 不存在 |
| `UNKNOWN` | `invalid` | 所有 MX 均不可达 |
### 限制
从外部 IP 使用 RCPT 和 VRFY 对于大型邮件服务商(Gmail、Outlook 等)来说并不可靠;在企业 MX 上效果更好。大多数服务器上的 **VRFY** 和 **EXPN** 命令已被禁用。
## 占位符
在模板中支持 **`$a`..`$z`**(一个字母 = 一个占位符)。
| 占位符 | 描述 | 数据来源 |
|-------------|----------|-----------------|
| **`$n`** | 名字 | `Names_M.txt` / `Names_F.txt` |
| **`$s`** | 姓氏 | `Surnames_M.txt` / `Surnames_F.txt` |
| **`$m`** | 父称 | `Patronymics_M.txt` / `Patronymics_F.txt` |
| **`$l`** | 单个字母 | 由 `-L` 指定的字母表(默认为 a–z) |
任何字母都可以通过 **`-p letter=path`** 重写或添加(例如 `-p a=./dept.txt` 对应 `$a`)。多个文件:`-p a=./t1.txt,./t2.txt` 或多次重复 `-p a=...`。
**模板示例:**
- `'$n.$s'` → `ivan.ivanov`, `maria.petrova`, ...
- `'$n.$s_$l'` → `ivan.ivanov_a`, `ivan.ivanov_b`, ...
- `'$l$l$l@domain.com'` → `aaa@domain.com`, `aab@domain.com`, ...
- 带 `-p a=./dept.txt` 的 `'$a_$n.$s'` → `it_ivan.ivanov`, `hr_maria.petrova`, ...
在 PowerShell 中请使用**单引号**:`-m '$n.$s_$l'`。
## CLI 参数
| 参数 | 描述 |
|----------|----------|
| **`-m`**, **`--mask`** | 模板(必填)。 |
| **`-o`**, **`--output`** | 输出路径:文件或目录。如果不使用 `-o` — 将保存至 `~/` 并根据 `-d` 或随机 ID 自动命名。 |
| **`-d`**, **`--domain`** | 域名(例如 `corp.local` → 将被替换为 `@corp.local`)。 |
| **`-s`**, **`--sex`** | `m` / `f` / `both`(默认为 `both`)。 |
| **`--data-root`** | 包含数据文件的文件夹。默认为 `rutabaga/data`。 |
| **`-L`**, **`--letters`** | 用于 `$l` 的字母表(默认为 a–z)。 |
| **`-p`**, **`--placeholder`** | 自定义占位符:`letter=path`(可重复使用)。 |
| **`--no-unique`** | 不移除数据集之间的重复项。 |
| **`-V`**, **`--verbose`** | 将登录名输出到控制台(否则仅输出 banner 和状态)。 |
| **`-v`**, **`--validate`** [METHOD…] | 验证地址(需要 `-d`)。不指定 METHOD 时 — 使用 `SMTP` (STARTTLS)。指定 METHOD 时 — 仅使用列出的:`SMTP`, `VRFY`, `EXPN`。 |
| **`-w`**, **`--workers`** | 验证线程数(默认为 15,仅与 `-v` 一起使用)。 |
| **`--sender`** | 用于 SMTP 验证的 MAIL FROM 地址(仅与 `-v` 一起使用)。 |
| **`--helo`** | SMTP 验证时用于 EHLO/HELO 的主机名(仅与 `-v` 一起使用)。 |
| **`--mx`** | 当 RCPT 返回 5xx 时尝试下一个 MX(仅与 `-v` 和 SMTP 方法一起使用)。 |
| **`--no-starttls`** | 即使 MX 支持也不使用 STARTTLS(仅与 `-v` 一起使用)。 |
完整列表:`python main.py -h`。
## 快速命令
| 任务 | 命令 |
|--------|--------|
| 将登录名保存到 `~/corp.local.txt`(不使用 `-o`) | `python main.py -m '$n.$s' -d corp.local` |
| 将登录名保存到文件(名字.姓氏@域名) | `python main.py -m '$n.$s' -d corp.local -o logins.txt` |
| 仅男性,符合 ГОСТ 7.79 的数据 | `python main.py -m '$n.$s_$l' -d example.com --data-root rutabaga/data_gost -s m -o out.txt` |
| 仅女性,符合 ГОСТ Р 7.0.34 | `python main.py -m '$n_$s' -d mail.ru --data-root rutabaga/data_gost_7034 -s f -o out.txt` |
| 组合较少(字母表为 0 和 1) | `python main.py -m '$n.$s_$l' -L 01 -o out.txt` |
| 将登录名输出到控制台(及文件) | `python main.py -m '$n.$s' -d corp.local -o out.txt -V` |
| 生成 + 验证(输出至目录) | `python main.py -m '$n.$s' -d corp.local -v -o ./results` |
| 验证(显式指定基础文件) | `python main.py -m '$n.$s' -d corp.local -v -o emails.txt` |
| 使用 VRFY + EXPN,无 RCPT | `python main.py -m '$n.$s' -d corp.local -v VRFY EXPN -o ./out` |
| SMTP + VRFY | `python main.py -m '$n.$s' -d corp.local -v SMTP VRFY -o ./out` |
| 不使用 STARTTLS | `python main.py -m '$n.$s' -d corp.local -v --no-starttls -o ./out` |
| 当 RCPT 返回 5xx 时遍历 MX | `python main.py -m '$n.$s' -d corp.local -v --mx -o ./out` |
## 数据
默认使用来自 **`rutabaga/data`** 的文件:
- `Names_M.txt`, `Surnames_M.txt`, `Patronymics_M.txt`
- `Names_F.txt`, `Surnames_F.txt`, `Patronymics_F.txt`
您可以指定自己的文件夹:**`--data-root /path/to/folder`**。
### ГОСТ 相关选项
- **`rutabaga/data_gost/`** — 仅包含 **ГОСТ 7.79-2000**(系统 Б)的音译:й→j,不包含 -off/-ow, -ey/-ei 等。使用方法:`--data-root rutabaga/data_gost`。
- **`rutabaga/data_gost_7034/`** — 与 `data_gost` 相同,并增加 **ГОСТ Р 7.0.34-2014** 的变体(й→I: Andrei, Sergei, -evich/-evna 等)。使用方法:`--data-root rutabaga/data_gost_7034`。
`data_gost` 和 `data_gost_7034` 数据集均已预先生成;本代码仓库不包含单独的重新构建脚本。
标签:DNS, Python, SMTP验证, 文档结构分析, 无后门, 账号生成, 逆向工具, 邮箱验证