运维利器升级:WezTerm集成AI插件,打造高效运维终端

运维利器升级:WezTerm集成AI插件,打造高效运维终端 随着大语言模型的飞速发展,开源模型在编码能力上已经逐步逼近GPT-4等顶尖模型,相关API调用的成本也在迅速下降。自动编程工具如雨后春笋般涌现,如cursor、vscode cline、aider等,就连nvim也有avante这样的开源插件支持自动编程。如今,写代码几乎变成了写需求。 然而,本文并非讨论如何用大模型写代码,而是为运维人员提供一个便捷的AI助手,帮助他们在工作过程中更高效地利用大模型,无需频繁复制粘贴或打开网页查询命令。 灵感来源与现状 受aider等工具的启发,我们思考:如果能在命令行直接与大模型交互,使用自然语言生成各种命令,是否能显著提高运维人员的工作效率?遗憾的是,已有公司如warp.dev实现了这一功能,但收费且访问速度受限。于是,我们找到了一个用Rust编写的开源命令行工具——AIChat。 AIChat简介 AIChat是一个功能强大的命令行工具,集成了多种大语言模型(LLM)功能,包括Shell助手、CMD和REPL模式、RAG(检索增强生成)、AI工具与代理等。它支持多平台,安装方便,一个二进制文件即可使用,并且可以与bash集成,通过自然语言生成各种命令。 通过在bashrc中嵌入以下命令,可以绑定快捷键实现自然语言转命令: _aichat_bash() { if [[ -n "$READLINE_LINE" ]]; then READLINE_LINE=$(aichat -e "$READLINE_LINE") READLINE_POINT=${#READLINE_LINE} fi } bind -x '"\ee": _aichat_bash' WezTerm集成AIChat 然而,运维人员经常需要在服务器上操作各种指令。难道要在所有服务器上都安装AIChat工具?显然,这样做太过繁琐。于是,我们引入了WezTerm这个跨平台终端,结合AIChat工具,实现在终端上的AI助理功能。 WezTerm简介: WezTerm是一个跨平台的终端工具,可以通过Lua进行各种配置,包括主题、快捷键、tmux配置等。接下来,我们将利用WezTerm的Lua脚本特性,将AIChat与WezTerm集成在一起,实现跨终端、跨服务器的AI助手功能。 安装与配置: 下载AIChat: 前往AIChat的GitHub页面下载适合你操作系统的AIChat版本。 配置AIChat: 启动AIChat命令行,配置大模型。例如,使用deepseek-chat,前往deepseek平台申请API密钥,并根据AIChat的向导生成相关配置。 # $HOME/.config/aichat/config.yaml model: deepseek clients: - type: openai-compatible name: deepseek api_base: https://api.deepseek.com api_key: sk-xxxxxxxxxxxxxxxxxxxxxxxxxx 安装WezTerm: 前往WezTerm官网查看详细的安装方法。 安装后,在本地目录创建WezTerm的配置文件$HOME/.config/wezterm/wezterm.lua。 配置WezTerm: local wezterm = require("wezterm") local launch_menu = {} if wezterm.target_triple == "x86_64-unknown-linux-gnu" then table.insert( launch_menu, { label = "ai-chat", args = { "aichat"} } ) end return { launch_menu = launch_menu, keys = { { key = 'z', mods = 'ALT', action = wezterm.action.ShowLauncher }, { key = "c", mods = "ALT", action = wezterm.action_callback(function(window, pane) local tab = pane:tab() local panes = tab:panes_with_info() if #panes == 1 then pane:split({ direction = "Right", size = 0.4, args = { 'aichat' } }) elseif not panes[1].is_zoomed then panes[1].pane:activate() tab:set_zoomed(true) elseif panes[1].is_zoomed then tab:set_zoomed(false) panes[2].pane:activate() end end), }, { key = "x", mods = "ALT", action = wezterm.action_callback(function(window, pane) local dims = pane:get_dimensions() local txt = pane:get_text_from_region(0, dims.scrollback_top, 0, dims.scrollback_rows) local last_line = txt:match("[^\r\n]+$") local selection = window:get_selection_text_for_pane(pane) selection = selection or last_line window:perform_action(wezterm.action.ClearSelection, pane) local success, stdout, stderr = wezterm.run_child_process({"aichat", "-e", selection}) if success then pane:paste(stdout) else wezterm.log_error("Error running bash command: " .. stderr) end end), }, }, font_size = 18.0, color_scheme = "Catppuccin Frappe", } 使用方法 打开WezTerm,通过快捷键ALT+c迅速调出AI对话窗口,可以直接与AI交互。 通过WezTerm的复制粘贴快捷键,可以快速将终端窗口中的文字粘贴到AIChat对话中进行交流。 通过快捷键ALT+x直接将命令行下的自然语言生成bash命令。 通过WezTerm与AIChat的集成,运维人员可以在终端中高效利用AI助手,提升工作效率。 ...

March 11, 2025 · Shan You

如何用Deepseek大模型提升普通人的学习能力:从碎片到体系的跃迁

在这个知识爆炸的时代,普通人常面临"学得越多越焦虑"的困境。Deepseek大模型作为智能学习伙伴,能够将碎片化学习转化为系统性认知提升。以下结合认知规律,详解7个实操方法: 1. 知识解构器:化繁为简的拆解系统 操作步骤: 输入复杂概念:“请将量子力学基础分解为5个递进模块” 追问核心术语:“用小学生能听懂的语言解释波粒二象性” 生成思维导图:“用markdown格式制作区块链技术知识框架” 案例: 学习宏观经济时,输入: “请把通货膨胀拆解为:核心定义(50字)→形成机制(3种原因+比喻)→测量指标(CPI与PPI区别)→个人应对策略” Deepseek将输出结构化知识树,附带"货币超发如同往咖啡里不停加水"的具象化比喻。 2. 认知连接器:跨学科的思维织网 操作技巧: 输入:“用生物学共生关系解释商业联盟的形成” 延伸:“将神经网络原理与城市交通系统进行类比” 实际应用: 当学习博弈论时,输入: “纳什均衡在历史上有哪些真实案例?可否用《三国演义》的典故说明?” Deepseek可能用"赤壁之战孙刘联盟对抗曹操"呈现博弈模型,建立历史与数学的认知连接。 3. 深度追问引擎:苏格拉底式对话训练 对话模式: User:为什么光速是宇宙速度极限? Deepseek:根据狭义相对论,质量随速度增加… User:如果存在超光速,会首先冲击哪些物理定律? Deepseek:将导致因果律失效,比如祖父悖论… 进阶用法: 开启"质疑模式":“请以反驳者身份,指出我关于气候变化的三点认知漏洞” 4. 实践沙盒:从知道到做到的转化器 功能组合: 技能学习:输入"设计Python入门7天实践计划,每天包含1个概念+1个代码任务" 模拟演练:“生成10道麦肯锡Case Interview模拟题,附评分标准” 项目设计:“作为大学生,如何用三个月完成新能源车的市场调研项目?请列出20个关键步骤” 典型案例: 学习PPT设计时,输入: “请分析这张产品发布会PPT(上传文件),按①信息层级混乱②视觉疲劳点③数据说服力不足三个维度提出修改建议” 5. 多维感知构建:全息学习界面 混合学习法: 输入"用三种方式解释薛定谔的猫: ①学术论文体(300字带公式) ②武侠小说类比(用内力波动比喻量子叠加) ③家庭主妇对话体(用冰箱里不确定是否过期的牛奶举例)" 资源整合: “关于克里米亚战争,请推荐:1部纪录片+2篇论文+3个历史地图资源+5个关键人物画像” 6. 认知镜子:费曼技巧智能教练 自我检验法: 输入:“我要向高中生讲解资产负债表,请先听我的语音阐述(转文字)” Deepseek反馈:“发现3处概念混淆(资产与所有者权益关系),建议用披萨店创业案例重新梳理…” 教学模拟: “现在你是6岁儿童,我将用3分钟解释什么是碳中和,请用提问暴露我的知识盲区” 7. 成长追踪系统:AI驱动的迭代循环 动态优化: 知识体检:“根据过去3个月的学习记录,绘制我的认知地图,标出薄弱区” 错题进化:“将我之前理解错误的5个经济学概念,改编成思辨讨论题” 认知预警:“我最近在学习脑科学,请预测可能存在的5个常见理解误区” 智能学习四重境界 检索层:快速获取精准信息(“2023年诺贝尔经济学奖的核心理论应用场景”) 重构层:个性化知识重组(“用我的餐饮创业经历重构SWOT分析法”) 创造层:跨界创新(“结合敦煌壁画元素设计元宇宙数字藏品”) 元认知层:学习系统的自我优化(“分析我最近50次提问记录,诊断思维模式缺陷”) 关键心法 精准提问:用"3W2H"结构(What-Why-Who-How-How good)提升对话质量 控制幻觉:对关键结论追加"请提供三个权威文献来源" 人机共生:用AI处理信息收集和方案迭代,聚焦人类擅长的价值判断与创新连接 通过Deepseek构建的"输入-解构-连接-输出"闭环,普通人可实现学习能力的指数级进化。在这个过程中,重要的不是记住多少知识,而是培养出"提出好问题"和"建立新连接"的底层能力——这正是智能时代最稀缺的认知资本。 ...

March 11, 2025 · Shan You

Kubectl实用技巧:合并YAML与通过Socks代理访问集群

1. 合并所有的YAML文件 在Kubernetes配置中,管理多个YAML文件可能会变得繁琐。为了简化操作,你可以在.kube目录下创建一个名为merge.sh的脚本,用于合并这些YAML文件。 脚本内容: #!/bin/bash set -e WORK_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) pushd "$WORK_DIR" 1>/dev/null 2>&1 # 遍历当前目录,获取所有YAML文件路径 yaml_paths="" while IFS= read -r -d $'\0' file; do if [ -n "$yaml_paths" ]; then yaml_paths+=":$file" else yaml_paths="$file" fi done < <(find "$(pwd)" -type f -name "*.yaml" -print0) # 合并YAML文件并更新Kubeconfig KUBECONFIG=$yaml_paths kubectl config view --flatten > ~/.kube/config popd 1>/dev/null 2>&1 使用方法: 将上述脚本保存为merge.sh。 在终端中运行bash merge.sh。 使用kubectl config get-contexts命令验证合并后的上下文信息。 使用kubectl config use-context <context-name>命令切换上下文。 2. 通过Socks代理访问K8s集群 当Kubernetes集群位于内网环境中时,你可能需要通过SSH Socks代理来访问它。以下是如何设置和使用的步骤: 步骤1: 建立SSH Socks代理连接 ssh -D5000 -Ngf root@${jump_server_ip} 步骤2: 配置Kubeconfig以支持Socks代理 ...

March 19, 2024 · Shan You

Hugo 使用帮助

参考 Hugo 主题 Nuo 文章样式预览 搭建 Hugo 个人网站|PaperMod 主题 Hugo-Theme-PaperMod主题文档 Markdown语法指南 hugo-PaperMod hugo博客搭建 | PaperMod主题

March 11, 2024 · 1 min · 15 words · Me

用CoreDNS替代Dnsmasq

运维的兄弟们一般使用dnsmasq来作为内网DNS解析服务。通过/etc/hosts 保存内网服务器IP地址与域名的映射关系。但是dnsmasq也会经常的报一些安全漏洞,让我们不胜其烦的去更新打补丁。最近在一次服务器更新换代的过程中尝试了一下CoreDNS,用它替代dnsmasq。感觉还行,可以跟大家分享一下替代方案。 我们采取docker容器的方式部署CoreDNS,方便版本的更新。使用coredns.sh脚本创建容器。 #!/bin/bash # run core dns docker stop coredns docker rm coredns docker run --name coredns -d \ -p 53:53 -p 53:53/udp \ -v $PWD/hosts:/hosts \ -v $PWD/corefile:/corefile \ coredns/coredns:1.8.3 \ -conf /corefile 通过两个文件corefile, hosts实现了dnsmasq的对应功能。corefile作为CoreDNS的配置文件配置如下 .:53 { errors health log stdout hosts /hosts { fallthrough reload 10s } forward . 114.114.114.114 reload } 其中hosts指令实现了本地hosts文件的解析。fallthrough这个指令表示"如果hosts文件没有找到解析文件就会转发到下一个指令去执行"。下一个指令forward 将域名查询转发到其他dns服务器。hosts文件的作用和/etc/hosts是一样的。 另外我们可以实现一种高可用方案。搭建一台powerdns作为主dns。 多台CoreDNS作为辅助dns。通过cache指令和forward指令配合实现高可用。 CoreDNS代码小巧精悍,很容易进行代码安全检查,相关的安全漏洞也不多。性能方面也不输于dnsmasq。是个不错的替代方案。

March 11, 2024 · Shan You

访问docker中服务的小技巧

在docker容器中的服务是通过docker命令将端口暴露给宿主机的用户使用。有时候出于安全考虑,容器没有暴露其中的一些服务。运维人员为了调试就得登录到容器中,一些精简的容器bash命令不全,管理起来很不方便。目前有两种方法访问容器网络中的服务。 通过nsenter访问容器网络 # 获取容器的pid pid=$(docker inspect -f '{{.State.Pid}}' ${container_id}) # 进入pid对应的namespace sudo nsenter --target $pid --uts --ipc --net --pid 这种方法可以直接在宿主机上暴露容器网络的命名空间,进而通过宿主机的一些命令行工具调试网络。 另外一种方法就是本文重点介绍的。 通过ip netns访问容器网路 这种操作的好处是可以通过类似socat的工具将容器网络中的服务暴露到宿主机网络中。具体操作如下: 首先要求管理员把容器的网络映射到/var/run/netns供ip命令使用。 ln -s /var/run/docker/netns /var/run/netns # 部分容器版本需要运行 1000 是运行docker的userid ln -s /run/user/1000/docker/netns var/run/netns 其次是通过socat与ip netns结合转发端口 # 通过以下命令找到netns id ns_id=$(docker inspect $container_name | grep SandboxKey | awk -F '/' '{print $NF}' | awk -F '"' '{print $1}') # 通过以下命令将宿主机监听的33060端口转发到容器的3306端口 sudo socat tcp-listen:33060,fork,reuseaddr \ exec:'ip netns exec $ns_id socat STDIO "tcp-connect:127.0.0.1:3306"',nofork 这样管理员就把一个容器中的服务暴露到宿主机上了。是不是很实用!

March 11, 2024 · Shan You

Raspberry Pi Zero W Config Without Wifi

介绍 如果你的树莓派 Zero W 没有连接上 WiFi,或者没有外接键盘和显示器,也可以通过 USB OTG 连接到电脑上进行配置和使用。本文将介绍具体的操作步骤。 准备 1. 将系统 ISO 文件写入 SD 卡中,使用 Raspberry Pi Imager 工具即可。 2. 配置usb otg启动 在主机上插入 SD 卡,修改根目录相关配置文件。 创建一个空的 ssh 文件,用于启动 SSH 服务。 在 config.txt 文件中添加以下内容,开启 OTG 和 UART,将树莓派的 USB 端口连接到主机的 USB 端口。 # 开启otg后主机会出现一个新的usb RNDIS网络设备,vid_0525 pid_a4a2 dtoverlay=dwc2 # 开启uart, 这个需要单独连gpio的线 enable_uart=1 在 cmdline.txt 文件中添加以下内容,启用一些必选和可选参数,如串口输出、文件系统类型等。 console=serial0,115200 console=tty1 root=PARTUUID=d94e8efa-02 rootfstype=ext4 fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet splash plymouth.ignore-serial-consoles 在 cmdline.txt 文件中添加以下内容,启用一些必选和可选参数,如串口输出、文件系统类型等。 以下为示例代码: pi:$6$4ilokQRQxmURT.py$aJWBQ5yniJJPwV3CKawYJcnSK5JZGhrVZYF3K4omRUFv6KL0MysEH7F4NZRMNMcYF.U3xsQvWrx7ZL2GKxuv.1 密钥创建方法: echo 'mypassword' | openssl passwd -6 -stdin 配置wpasupplicant.conf文件,用于连接wifi ...

March 11, 2024 · Shan You