首页
关于作者
靶场
Search
1
河南萌新联赛2026第(一)场:河南工业大学A题题解
19 阅读
2
注意!
18 阅读
3
河南萌新联赛2026第(一)场:河南工业大学E题题解
12 阅读
4
河南萌新联赛2026第(一)场:河南工业大学B题题解
11 阅读
5
sql注入
10 阅读
默认分类
游戏
比赛
网安
学习
登录
Search
llwqs
累计撰写
9
篇文章
累计收到
2
条评论
首页
栏目
默认分类
游戏
比赛
网安
学习
页面
关于作者
靶场
搜索到
8
篇与
的结果
2026-08-14
kali使用claude并接入deepseek api
一、安装 Node.js 环境 (Claude Code 前置依赖)Claude Code 需要 Node.js 18+ 环境。Kali 自带的版本可能不够,推荐用 NVM 安装。# 安装 NVM (Node Version Manager) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 重新加载 shell 配置 source ~/.bashrc # 安装 Node.js LTS 版本 (推荐 20.x) nvm install 20 # 设置为默认版本 nvm alias default 20二、安装 Claude CodeClaude Code 是 Anthropic 官方的 CLI AI 编程工具,通过 npm 全局安装:# 全局安装 Claude Code npm install -g @anthropic-ai/claude-code # 验证安装 claude --version🎯 安装成功后,在终端输入 claude 即可启动交互界面。三、配置 DeepSeek V4 API (核心步骤)这是本文最关键的部分——让 Claude Code 走 DeepSeek 的 API,用 DeepSeek V4 模型。3.1获取 DeepSeek API Key访问 https://platform.deepseek.com注册/登录 DeepSeek 开发者平台进入「API Keys」页面 → 点击「创建新的 API Key」复制保存好 Key(只显示一次!)💰 价格优势: DeepSeek V4 API 价格仅为 Claude 官方的约 1/10,400万 Token 的消费从 26 降至不到 2。3.2推荐方式:cc-switch 一键配置 (可视化,零门槛)手动敲环境变量容易出错,推荐使用开源工具 cc-switch,一键搞定 Claude Code 的模型供应商切换:# 1. 克隆 cc-switch 项目 git clone https://github.com/farion1231/cc-switch.git cd cc-switch #注意因网络连接问题git clone可能速度很慢,也可以直接访问(https://github.com/farion1231/cc-switch/releases),根据自己的架构选择对应的.deb安装包 # 2. 安装依赖 npm install # 3. 启动 cc-switch 图形界面 npm start启动后会打开一个 Web 可视化界面,操作步骤如下:步骤操作①选择供应商 → DeepSeek②粘贴你的 DeepSeek API Key (sk-xxxx)③选择默认模型:deepseek-v4-pro[1m] (1M 长上下文)④Flash 模型选:deepseek-v4-flash (轻量快速任务用)⑤推理深度设为 max (最高质量)⑥点击「应用配置」,完成!cc-switch 会自动帮你把以下环境变量写入 ~/.bashrc,无需手动操作:export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic export ANTHROPIC_AUTH_TOKEN=sk-xxxxxxxx # 你的 Key export ANTHROPIC_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-v4-flash export CLAUDE_CODE_SUBAGENT_MODEL=deepseek-v4-flash export CLAUDE_CODE_EFFORT_LEVEL=max🎯 cc-switch 的强大之处:🌐 支持多供应商一键切换(DeepSeek、硅基流动、智谱等),不用反复改配置🔑 多 API Key 管理,团队共享配置📊 模型性能对比⬇️ 配置导入/导出,换机器不用重新配配置完成后,执行 source ~/.bashrc 让配置生效即可。3.3 备选方式:手动配置环境变量如果你不想用图形界面,也可以直接在终端中手动配置:# 永久生效 (写入 ~/.bashrc) cat >> ~/.bashrc << 'EOF' # ==== Claude Code + DeepSeek V4 配置 ==== export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic export ANTHROPIC_AUTH_TOKEN=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 替换为你的 Key export ANTHROPIC_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-v4-flash export CLAUDE_CODE_SUBAGENT_MODEL=deepseek-v4-flash export CLAUDE_CODE_EFFORT_LEVEL=max EOF3.4 环境变量详解环境变量值说明ANTHROPIC_BASE_URLhttps://api.deepseek.com/anthropic将 Claude Code 的 API 请求转发到 DeepSeekANTHROPIC_AUTH_TOKEN你的 API KeyDeepSeek 的认证令牌ANTHROPIC_MODELdeepseek-v4-pro[1m]默认使用的主模型 (1M上下文)ANTHROPIC_DEFAULT_SONNET_MODELdeepseek-v4-pro[1m]Sonnet 级别任务使用的模型ANTHROPIC_DEFAULT_HAIKU_MODELdeepseek-v4-flashHaiku 级别任务使用的轻量模型CLAUDE_CODE_SUBAGENT_MODELdeepseek-v4-flash子代理使用的模型 (轻量快速)CLAUDE_CODE_EFFORT_LEVELmax推理深度设为最高3.5 验证配置# 检查环境变量是否生效 echo $ANTHROPIC_BASE_URL echo $ANTHROPIC_MODEL # 启动 Claude Code 测试 claude # 在 Claude 交互界面中输入测试问题 > 你好,请介绍一下你自己,你是什么模型?如果 Claude Code 正常响应并提到 DeepSeek V4,说明配置成功!好的,这是为您补充的"注意事项"章节,您可以直接将其添加到文档的末尾:四、注意事项:解决 Kali 无法连接 GitHub 的问题在 Kali Linux 初始环境中,由于网络策略或 DNS 解析问题,经常会出现无法访问 raw.githubusercontent.com 或 github.com 的情况。这会导致上述步骤中 安装 NVM(curl 命令)或 克隆 cc-switch 项目(git clone 命令)失败。解决方法:修改 Hosts 文件通过手动指定 GitHub 相关域名的 IP 地址,可以绕过 DNS 解析故障。查询真实 IP访问 IPAddress.com 或类似的 IP 查询网站,分别查询以下域名的最新 IP 地址:github.comraw.githubusercontent.com编辑 Hosts 文件在 Kali 终端中打开 hosts 文件进行编辑:sudo nano /etc/hosts添加映射记录在文件末尾添加查询到的 IP 和域名映射(示例如下,请务必替换为你查询到的实时 IP):# GitHub Hosts Start 140.82.113.4 github.com 199.232.68.133 raw.githubusercontent.com # GitHub Hosts End保存并刷新按 Ctrl + O 保存,按 Enter 确认,然后按 Ctrl + X 退出编辑器。刷新 DNS 缓存使配置立即生效:sudo /etc/init.d/networking restart # 或者尝试 sudo systemd-resolve --flush-caches验证连接再次尝试之前的安装命令,通常即可顺利下载。如果仍然不通,可能是 IP 变动,请重新查询并更新 hosts 文件。这是根据图片内容提取的 Markdown 格式文档:五、常见问题排查Q1: claude 命令找不到?# 检查 npm 全局安装路径 npm list -g @anthropic-ai/claude-code # 确保 ~/.npm-global/bin 在 PATH 中 export PATH="$HOME/.npm-global/bin:$PATH"Q2: Claude Code 启动后报认证错误?# 检查环境变量 env | grep ANTHROPIC # 确认 API Key 前缀是 sk- # 确认没有多余的空格或引号Q3: 请求速度慢?# 尝试切换到 flash 模型做轻度任务 export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-v4-flash # 降低推理深度 export CLAUDE_CODE_EFFORT_LEVEL=mediumQ4: Kali 网络不通?# 检查 NAT 网络配置 ip a # 重启网络服务 sudo systemctl restart networking # 测试外网连通性 ping -c 4 8.8.8.8以上就是kali中claude的安装并接入deepseek的api教程
2026年08月14日
8 阅读
0 评论
0 点赞
2026-08-14
实装kali
VMware 安装 Kali Linux 双方案指南(ISO和VMK)对于网络安全初学者而言,Kali Linux 是渗透测试与安全审计的必备利器。而 VMware 虚拟机则是运行 Kali 最安全、最稳定的沙箱环境。本文将详细记录两种主流的 Kali 部署方案。一、 核心准备:环境与资源获取在开始之前,我们需要准备好虚拟机软件与 Kali 官方镜像。虚拟机软件:前往 VMware 官网 下载 VMware Workstation Pro 或免费的 Player 版本。请务必使用官方正版,避免第三方修改版带来的后门风险与系统蓝屏问题。Kali 官方镜像:访问 Kali 官网 下载页面,这里提供两种不同的下载路径:ISO:在“Installer Images”下选择最新的 amd64 格式文件,适用于从零安装。VMK:在“Virtual Machines”下选择 VMware 专属的压缩包(通常为 .7z 格式),解压后包含 .vmx 文件,适用于直接导入。二、 方案一:ISO 镜像传统安装法1. 创建虚拟机骨架打开 VMware,点击“创建新的虚拟机”,选择“自定义(高级)”配置。在安装来源步骤,选择“稍后安装操作系统”。客户机操作系统选择“Linux”,版本推荐选择“Debian 12.x 64 位”(Kali 基于 Debian,此选项兼容性最佳)。2. 硬件资源分配存储位置:务必将虚拟机文件存放在非系统盘(如 D:\vm\kali),避免 C 盘空间告急。处理器与内存:若宿主机为 8 核 16GB,建议分配 1 个处理器、4 个内核,以及 4096MB 内存;若内存低于 8GB,请保守分配 2048MB。网络适配器:选择“使用网络地址转换(NAT)”,该模式最省心,既能保证虚拟机上网,又不会与物理局域网发生 IP 冲突。虚拟磁盘:磁盘大小建议分配 100GB(Kali 工具集庞大,20GB 极易爆满),I/O 控制器与磁盘类型保持默认的 LSI Logic 与 SCSI 即可。3. 挂载镜像与图形化安装在虚拟机设置中,将 CD/DVD 指向下载好的 ISO 文件。启动虚拟机,在引导菜单选择“Graphical install”进入图形化安装。基础配置:语言选择“中文(简体)”,地区选“中国”,键盘布局选“汉语”。账户设置:设置主机名与域名,创建普通用户(如 pentester)并设置密码。注意:密码输入需准确,避免安装中断。磁盘分区:新手建议选择“Guided - use entire disk”(向导-使用整个磁盘),并选择“将所有文件放在同一个分区中”。软件选择:保持默认的 kali-linux-default 即可,后续可按需安装特定工具集。安装完成后,重启虚拟机,输入账户密码即可进入系统。三、 方案二:VMK 预制镜像极速导入法1. 解压预制文件将官网下载的 VMK 压缩包解压至纯英文路径下(绝对不要包含中文或特殊字符,否则会导致 VMware 无法识别启动)。2. 导入虚拟机打开 VMware,点击“文件” -> “打开”,找到解压目录中的 .vmx 文件并打开。此时,左侧列表会出现完整的 Kali Linux 虚拟机配置。3. 启动与登录直接点击“开启此虚拟机”。由于官方已预装好 VMware Tools 及所有底层驱动,系统会极速启动。默认凭据:用户名 kali,密码 kali。四、 安装后的优化无论使用哪种方案,首次进入系统后都需执行以下操作以完善体验:切换中文字体 :打开终端,执行 sudo apt-get install -y locales ,再次执行 sudo dpkg-reconfigure locales 。在弹出的文本界面中,使用方向键找到 zh_CN.UTF-8 UTF-8 选项,按空格键选中(前面出现星号 *),然后按 Tab 键将焦点移至Ok并按回车确认;在随后的默认语言选择界面中,再次选中 zh_CN.UTF-8 作为系统默认语言,按回车确认。随后执行 sudo reboot重启虚拟机,在重启后弹出的界面选择“不再询问”和“保留”。替换镜像源:打开终端,执行 nano /etc/apt/sources.list,将原有内容删除后,添加清华大学 Kali 镜像源deb https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main non-free contribdeb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free 阿里云 Kali 镜像源deb [signed-by=/etc/apt/trusted.gpg.d/kali-archive-keyring.gpg] http://mirrors.aliyun.com/kali kali-rolling main non-free contrib更新软件源:打开终端,执行 sudo apt update && sudo apt full-upgrade -y。安装增强工具:若使用 ISO 安装,需手动执行 sudo apt install open-vm-tools-desktop 并重启,以支持全屏显示与剪贴板共享。输入法配置:执行 sudo apt install fcitx fcitx-googlepinyin -y,重启后即可使用 Ctrl+空格 切换中文输入法。
2026年08月14日
7 阅读
0 评论
0 点赞
2026-07-28
河南萌新联赛2026第(一)场:河南工业大学J题题解
这道题的核心在于理解“交替共鸣序列”的定义,并找出删除哪一个元素后,剩下的序列能满足这个定义。 题目地址解题思路1.理解“交替共鸣序列”:* 题目定义:序列中任意两个相邻元素的奇偶性都不同。 * 通俗理解:序列的奇偶性必须是交替出现的,例如 `奇, 偶, 奇, 偶` 或 `偶, 奇, 偶, 奇`。 * 特例:长度为 0 或 1 的序列天然满足条件。 2.分析删除操作:* 我们需要尝试删除序列中的每一个元素,然后检查剩下的序列是否是“交替共鸣序列”。 * 直接模拟删除并检查的时间复杂度是 O(n²),对于 n ≤ 10⁶ 的数据规模会超时。我们需要一个 O(n) 的线性解法。 3.寻找高效方法:* 一个序列如果不是“交替共鸣序列”,那一定是因为在某个位置 `i`,`a[i]` 和 `a[i+1]` 的奇偶性相同。我们称这个位置为“冲突点”。 * 当我们删除一个元素 `a[k]` 时,只会影响 `a[k-1]` 和 `a[k+1]` 之间的关系。序列中其他所有相邻元素的奇偶关系都保持不变。 * 因此,我们可以先遍历一遍原数组,找出所有“冲突点”的位置。 * 然后,对于每一个可能的删除位置 `k`,我们只需要检查: * 删除 `a[k]` 是否会消除原有的冲突? * 删除 `a[k]` 是否会引入新的冲突(即 `a[k-1]` 和 `a[k+1]` 的奇偶性是否相同)? * 如果删除 `a[k]` 后,整个序列不再有任何冲突,那么 `k` 就是一个合法的删除位置。 4.算法步骤:* **预处理**:遍历数组,用一个数组 `conflicts` 记录所有冲突点的位置。`conflicts[i]` 为 `true` 表示 `a[i]` 和 `a[i+1]` 奇偶性相同。 * **统计总冲突数**:计算 `conflicts` 数组中 `true` 的个数,记为 `total_conflicts`。 * **遍历删除位置**:对于每个位置 `k` (从 0 到 n-1): * 计算删除 `a[k]` 会消除的冲突数 `removed_count`。这包括 `conflicts[k-1]` (如果 `k>0`) 和 `conflicts[k]` (如果 `k<n-1`)。 * 计算删除 `a[k]` 会引入的新冲突数 `added_count`。这只发生在 `k>0` 且 `k<n-1` 时,检查 `a[k-1]` 和 `a[k+1]` 的奇偶性。 * 如果 `total_conflicts - removed_count + added_count == 0`,则说明删除 `a[k]` 后序列是“交替共鸣序列”,答案加一。完整代码#include<bits/stdc++.h> using namespace std; bool panduan(long long a, long long b) { return (a & 1) == (b & 1); } void solve() { int n; cin >> n; vector<long long> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } if (n == 1) { cout << 1 << endl; return; } vector<bool> conflicts(n - 1, false); int total_conflicts = 0; for (int i = 0; i < n - 1; ++i) { if (panduan(a[i], a[i + 1])) { conflicts[i] = true; total_conflicts++; } } int ans = 0; for (int k = 0; k < n; ++k) { int removed_count = 0; int added_count = 0; if (k > 0 && conflicts[k - 1]) { removed_count++; } if (k < n - 1 && conflicts[k]) { removed_count++; } if (k > 0 && k < n - 1) { if (panduan(a[k - 1], a[k + 1])) { added_count++; } } if (total_conflicts - removed_count + added_count == 0) { ans++; } } cout << ans << endl; } int main() { int t; cin >> t; while (t--) { solve(); } return 0; }
2026年07月28日
8 阅读
0 评论
0 点赞
2026-07-28
河南萌新联赛2026第(一)场:河南工业大学G题题解
核心思路:逆向思维与差分思想这道题表面上是一个复杂的“区间修改”问题,但如果我们转换视角,将其逆向思考,就会变得非常直观。 题目链接1. 逆向思维:从“削减”到“堆叠”题目要求将一排参差不齐的树全部减为 0,每次操作可以对一段连续的树高度减 1。由于减法和加法是完全可逆的,我们可以把这个问题等价转换为:初始时所有树的高度都是 0,最少需要多少次“对一段连续的树高度加 1”的操作,才能恰好拼凑出题目给定的目标高度?2. 直观想象:画山峰想象我们在一张白纸上画一排柱子(山峰)。当我们要画第一棵树(高度为 $a_0$)时,我们必须从它开始,连续发起 $a_0$ 次加 1 的操作。当画到第二棵树(高度为 $a_1$)时,为了操作次数最少,我们会尽量让之前的操作“顺带”覆盖过来。如果 $a_1 > a_0$,说明之前延续过来的操作不够用,我们必须额外发起 $a_1 - a_0$ 次仅从第二棵树开始的新操作。如果 $a_1 \le a_0$,说明之前延续过来的操作已经足够覆盖当前树,甚至还会有多余的操作在这里自然“结束”,我们完全不需要增加新的操作次数。3. 提炼规律通过上述过程,我们可以得出一个普适的规律:只有当当前位置的树比前一棵树高时,我们才需要发起新的操作。新发起的操作次数,恰好等于 当前高度 - 前一个高度。如果当前树比前一棵树矮或一样高,则不需要增加操作次数。因此,整个问题的答案,就是遍历数组,累加所有“上升沿”的高度差。完整代码#include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; vector<long long> a(n); for(int i=0;i<n;i++){ cin>>a[i]; } long long ans=0; long long prev=0; for(int i=0;i<n;i++){ if(a[i]>prev){ ans+=(a[i]-prev); } prev=a[i]; } cout<<ans<<endl; return 0; }
2026年07月28日
9 阅读
0 评论
0 点赞
2026-07-27
河南萌新联赛2026第(一)场:河南工业大学E题题解
题目链接问题重述与核心转化给定一个长度为 n 的整数序列 a,以及两个整数 K 和 D。我们需要找出有多少个不同的连续子区间 [l, r],同时满足以下两个条件:种类数限制:区间内不同数字的个数恰好为 K。极差限制:区间内最大值与最小值的差(即极差)不超过 D。直接计算“恰好包含 K 种不同数字”的区间数量逻辑较为复杂。这里我们引入容斥原理,将问题巧妙转化:恰好包含 K 种 = 至多包含 K 种 - 至多包含 (K-1) 种这样,我们将一个复杂问题分解为两个结构完全相同、更容易解决的子问题。接下来,我们只需解决一个通用子问题:“计算不同数字种类数至多为 limit_k,且极差不超过 D 的子区间数量”。核心算法:滑动窗口与单调性分析对于上述子问题,我们可以使用滑动窗口(双指针)算法来高效求解。滑动窗口算法之所以能够成立且高效,根本原因在于指针单调移动时,窗口内部状态(不同值数量、极值)具有严格的单调变化趋势。1. 端点移动与“不同值数量”的单调性右指针 right 向右移动(窗口扩张):新元素进入窗口,窗口内不同值的数量 size 只会增加或保持不变,绝对不会减少。左指针 left 向右移动(窗口收缩):元素离开窗口,窗口内不同值的数量 size 只会减少或保持不变,绝对不会增加。2. 端点移动与“极值(最大值、最小值)”的单调性右指针 right 向右移动(窗口扩张):新加入的元素可能比当前最大值还大,也可能比当前最小值还小。因此,最大值可能变大(绝不会变小),最小值可能变小(绝不会变大)。综合来看,极差(最大值 - 最小值)可能变大,也可能保持不变。左指针 left 向右移动(窗口收缩):被移出的元素如果恰好是窗口内唯一的最大值或最小值,极值会发生改变。因此,最大值可能变小(绝不会变大),最小值可能变大(绝不会变小)。综合来看,极差可能变小,也可能保持不变。3. 单调性对算法的支撑理解了上述趋势,滑动窗口的逻辑便顺理成章:触发收缩:当右指针 right 向右移动一步后,由于扩张带来的单调性,种类数或极差可能变大,导致窗口变得“不合法”(即 size > limit_k 或 极差 > D)。安全收缩:因为左指针 left 向右移动时,种类数和极差都呈现单调递减(或不变)的趋势,所以我们可以放心地不断向右移动 left,直到窗口重新回到合法状态,这样也就意味着我们可以轻松的统计 至多 的问题。结果统计:因为 left 是单调递增的,对于当前的 right,我们找到的 left 一定是满足条件的最左边界。这也保证了以 right 为右端点的合法区间数量恰好是 right - left + 1,不会漏算也不会多算。算法流程基于上述单调性,算法的具体执行流程如下:初始化左指针 left = 0,并使用一个有序容器(如 map,在map里的大小就是不同值的数量,并且map是有序的可以节约我们的极值查询时间)维护当前窗口内的数字及其出现次数。遍历右指针 right 从 0 到 n-1,将 a[right] 加入窗口。检查当前窗口是否合法。如果不合法,则不断将 a[left] 移出窗口并右移 left,直到窗口重新满足“种类数 ≤ limit_k 且 极差 ≤ D”的条件。当窗口合法时,累加当前右端点对应的合法子区间数量:count += (right - left + 1)。最终,通过 atMostK(K) - atMostK(K-1) 得到最终答案。易错点与注意事项1.limit_k < 0 的边界检查:当 K=0 时,会调用 atMostK(n, -1, D)。必须在此处进行边界拦截并直接返回 0,否则会导致后续逻辑出错。2.空容器访问:在计算极差时,必须先判断窗口是否为空(!window.empty())。对空容器调用获取最大/最小值的操作会导致程序崩溃。3.数据类型溢出: 结果计数:子区间的数量可能非常大,必须使用 long long 来存储结果。 极差计算:题目中的灵能值范围可能很大,两个 int 相减的结果也可能超出 int 范围。在计算极差时,必须先将其转换为 long long 再进行减法运算。4.容器的更新与删除:当左指针移动时,如果某个数字的计数减为 0,必须从容器中彻底删除该键值对。否则,容器的大小将无法正确反映窗口内不同数字的真实种类数。5.注意多组测试数据完整代码#include <iostream> #include <vector> #include <map> using namespace std; const int MAXN = 500005; int a[MAXN]; long long atMostK(int n, int limit_k, int D) { if (limit_k < 0) return 0; long long count = 0; int left = 0; map<int, int> window; for (int right = 0; right < n; right++) { window[a[right]]++; while (window.size() > (size_t)limit_k || (!window.empty() && (long long)window.rbegin()->first - window.begin()->first > D)) { int val_to_remove = a[left]; auto it = window.find(val_to_remove); if (it != window.end()) { it->second--; if (it->second == 0) { window.erase(it); } } left++; } count += (right - left + 1); } return count; } int main() { ios::sync_with_stdio(false); cin.tie(0); int T; if (!(cin >> T)) return 0; while (T--) { int n, K, D; cin >> n >> K >> D; for (int i = 0; i < n; ++i) { cin >> a[i]; } long long ans = atMostK(n, K, D) - atMostK(n, K - 1, D); cout << ans << "\n"; } return 0; }
2026年07月27日
12 阅读
0 评论
0 点赞
1
2