-
一、概述1.1 案例介绍AI Shell 是智能 AI 命令行工具,以自然语言驱动终端操作,无需熟记复杂指令,大幅降低使用门槛,一站式完成华为云资源查询、操作、运维工作,让终端操作更高效、更智能。让华为云更好用、更易用。在个人开发者、小型团队和训练营学习场景中,云资源管理经常遇到一个很现实的问题:资源创建之后,如何持续确认它是否命名规范、标签完整、生命周期清晰、没有长期闲置或公开访问风险?如果每次都依赖人工进入控制台逐项查看,效率低,也容易遗漏。企业级云治理平台能力完整,但对于个人开发者或活动案例来说,又容易引入较多付费资源和配置成本。本案例使用华为云 AI Shell 辅助设计并生成一个“零成本云资源体检助手”。该工具通过 inventory.json 模拟资源清单,通过 rules.yaml 定义检查规则,使用 Python 完成命名规范、标签合规、过期时间、闲置资源和公开访问检查,最终输出 Markdown 与 JSON 两种报告。完成本地验证后,再部署到 FunctionGraph 事件函数中运行,形成一条完整的云端实践链路。本案例最终实现了以下目标:通过 AI Shell 自然语言交互完成方案设计、代码生成、项目修正和部署记录整理。使用 GitCode 托管完整项目,代码和配置可复现。使用 FunctionGraph 运行巡检逻辑,不购买服务器。使用本地模拟资源清单,不调用真实云 API,不配置 AK/SK。通过函数返回值和日志输出报告,不使用外部存储或消息服务。对公开仓库中的报告和资源清单提供脱敏版本,方便案例公开传播。1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计60分钟。1.4 资源总览资源名称规格单价(元)AI Shell体验版免费FunctionGraph函数每月前100万次调用免费免费华为云资源模拟免费二、AI Shell 使用指导2.1 获取访问秘钥AK 是Access Key(访问密钥)的缩写, 用于标识用户身份的唯一 ID, 通常公开传输。SK 是Secret Key(秘密密钥)的缩写,用于生成请求签名的保密密钥,仅用户和服务端持有。其核心功能是通过对称加密机制验证请求发送者的合法性,防止未授权访问。备注:如果已有访问密钥,本步骤可以忽略。2.2 登录进入 AI Shell 环境登录进入开发者空间官网,从侧边栏快捷入口一键拉起 AI Shell。同意华为云开发者服务协议、隐私声明及开发平台协议。同意将临时访问凭据(AK/SK)同步至 AI Shell 环境,免手动配置直接使用。进入 AI Shell。三、AI Shell 案例实战指导活动名称:【案例共创】【第12期】基于华为云AI Shell完成云资源管理、云服务运维和应用部署案例方向:云资源管理、云服务运维、应用部署代码仓库:https://gitcode.com/N9_xx/AIShell_CloudHealthChecker演示环境:华为云 AI Shell、GitCode、FunctionGraph 函数工作流成本说明:本案例严格采用零付费架构,仅使用 AI Shell 辅助生成、GitCode 代码托管、FunctionGraph 免费额度内运行、本地 JSON/YAML 配置文件和函数日志/返回值。不使用 OBS、SMN、API Gateway、ECS、RDS、AK/SK、云 API、公网带宽或任何需要购买的云资源。1. 场景痛点云资源治理并不只属于大型企业。个人开发者和小团队同样会遇到以下问题:痛点典型表现影响资源命名不统一demo、test-app-server 等名称缺少环境和业务语义后续定位资源和排障困难标签缺失没有 owner、environment、cost-center、project 等标签无法明确负责人、环境和成本归属临时资源长期保留测试资源没有过期时间或长期未使用容易产生配额占用和潜在费用风险运维检查依赖人工需要手动进入多个控制台页面查看效率低、不可复用、容易遗漏新手担心误用付费资源不清楚哪些服务会产生费用降低实践意愿因此,本案例的设计原则是:用最小资源完成可复现的云资源巡检闭环。即使不购买 ECS、RDS、OBS 等资源,也可以通过模拟清单和规则引擎,把云资源治理的关键方法跑通。2. 方案架构整体架构如下:flowchart LR A["开发者"] --> B["AI Shell"] B --> C["生成和修正项目代码"] C --> D["GitCode 仓库"] D --> E["FunctionGraph 事件函数"] E --> F["inventory.json 模拟资源清单"] E --> G["rules.yaml 检查规则"] E --> H["巡检引擎 inspector.py"] H --> I["命名/标签/过期/闲置/公开访问检查"] I --> J["Markdown/JSON 报告"] J --> K["函数返回值和日志输出"] 为了保证零付费,本案例在 AI Shell 中明确要求不使用 OBS、SMN、API Gateway、ECS、RDS、AK/SK 和云 API,最终方案仅保留本地文件、Python 逻辑、GitCode 和 FunctionGraph 免费额度。方案中各模块职责如下:模块作用AI Shell负责方案设计、项目结构生成、代码生成、部署步骤整理GitCode托管项目源码、配置文件、脱敏示例和 READMEFunctionGraph承载 Python 巡检逻辑,作为 Serverless 执行环境inventory.json模拟云资源清单,不调用真实云 APIrules.yaml定义命名、标签、过期、闲置、公开访问等检查规则src/checkers/具体检查器模块src/reporters/Markdown 和 JSON 报告生成模块函数返回值/日志输出巡检结果,不依赖外部存储和通知服务3. 技术选型技术或服务选择原因AI Shell支持自然语言描述需求,能够快速生成方案、代码和部署建议GitCode满足活动对代码仓库的要求,便于公开复现FunctionGraphServerless 运行环境,按需执行,免费额度足够覆盖本案例Python 3.9语法清晰,适合编写规则检查、报告生成等脚本JSON/YAMLJSON 适合描述资源清单,YAML 适合维护可读的检查规则Markdown/JSON 报告Markdown 便于阅读和投稿,JSON 便于后续自动化处理4. 前提条件已注册并完成实名认证的华为云账号。已进入华为云 AI Shell 云端作业环境。已创建 GitCode 仓库。已开通 FunctionGraph 函数工作流并能创建事件函数。本案例不需要购买 ECS、RDS、OBS、SMN、API Gateway、公网带宽等资源。5. AI Shell 生成项目我首先向 AI Shell 描述目标:设计一个零成本云资源体检助手,使用 AI Shell 辅助生成、GitCode 托管、FunctionGraph 运行,并要求不购买任何付费资源。请帮我设计一个零成本云资源体检助手。 要求: 1. 使用华为云 AI Shell 辅助生成方案和代码; 2. 使用 FunctionGraph 运行巡检任务; 3. 不购买 ECS、RDS、数据库、付费存储或公网带宽; 4. 使用 Python 实现; 5. 通过 inventory.json 模拟资源清单; 6. 通过 rules.yaml 定义命名、标签、过期时间、闲置和公开访问检查规则; 7. 输出 Markdown 和 JSON 两种报告; 8. 给出 GitCode 仓库目录结构。AI Shell 根据该约束生成项目目录和代码,并明确标注方案不使用付费服务。6. 项目结构AI Shell 最终生成的项目结构如下:cloud-health-checker/ ├── config/ │ ├── inventory.json # 模拟资源清单 │ ├── inventory.json.redacted # 公开投稿使用的脱敏清单 │ └── rules.yaml # 检查规则配置 ├── deploy/ │ └── functiongraph.yaml # FunctionGraph 部署说明 ├── output/ │ └── report.md.redacted # 脱敏版报告 ├── src/ │ ├── main.py # FunctionGraph 入口/本地运行入口 │ ├── inspector.py # 巡检引擎 │ ├── config_loader.py # 配置加载 │ ├── checkers/ │ │ ├── naming_checker.py # 命名规范检查 │ │ ├── tag_checker.py # 标签合规检查 │ │ ├── expiry_checker.py # 过期时间检查 │ │ ├── idle_checker.py # 闲置资源检查 │ │ └── public_access_checker.py# 公开访问检查 │ └── reporters/ │ ├── markdown_reporter.py # Markdown 报告 │ └── json_reporter.py # JSON 报告 ├── requirements.txt └── README.md进入项目目录后,AI Shell 给出了本地运行和查看报告的命令。7. 规则设计规则文件 config/rules.yaml 定义了五类检查:检查类型说明命名规范检查按资源类型匹配命名规则,例如 ECS 使用 env-project-service-index标签合规检查检查 owner、environment、cost-center、project 等标签过期时间检查检查资源是否已过期或即将到期闲置资源检查根据 CPU、网络流量、绑定状态等模拟字段判断闲置公开访问检查检查安全组、访问来源等公开暴露风险部分规则示例如下:naming: enabled: true severity: warning rules: ecs: pattern: "^(prod|test|dev|staging)-[a-z0-9-]+-[a-z0-9-]+-[0-9]+$" example: "prod-web-frontend-01" description: "ECS 命名格式: env-project-service-index" tags: enabled: true severity: warning required_tags: - key: "owner" description: "资源负责人" - key: "environment" description: "环境标识" allowed_values: ["production", "test", "development", "staging"] expiry: enabled: true severity: critical这套规则的优势是可配置。后续如果团队命名规范或标签规范变化,只需要修改 rules.yaml,不用改检查器代码。8. 模拟资源清单与脱敏处理本案例使用 config/inventory.json 作为模拟资源清单,不调用真实云 API。清单中包含 ECS、VPC、OBS、RDS、安全组、EIP、ELB 等资源类型的模拟字段,用于验证不同检查器的能力。由于案例需要公开投稿,AI Shell 同时检查了资源清单和报告中的敏感信息,并生成脱敏版本:文件说明config/inventory.json项目运行使用的模拟资源清单config/inventory.json.redacted公开展示使用的脱敏清单output/report.md.redacted公开展示使用的脱敏报告脱敏处理保留资源类型、风险类型、检查结果,不展示账号 ID、真实资源 ID、手机号、访问地址等敏感信息。9. 核心代码实现FunctionGraph 入口和本地运行入口都在 src/main.py。核心函数为 handler(event, context),它会调用巡检引擎 run_inspection(),并将 Markdown 和 JSON 报告放入返回值。def handler(event=None, context=None): print("[INFO] FunctionGraph 函数开始执行") try: result = run_inspection() response = { "statusCode": 200, "body": { "message": "巡检完成", "duration_seconds": result["duration_seconds"], "reports": { "markdown": result["markdown"], "json": result["json"], }, }, } print("[INFO] FunctionGraph 函数执行成功") return response except Exception as e: print(f"[ERROR] 巡检执行失败: {e}") return { "statusCode": 500, "body": { "message": f"巡检执行失败: {e}", "error_type": type(e).__name__, }, } 各检查器被拆分到 src/checkers/ 目录中,报告生成器被拆分到 src/reporters/ 目录中。这样做的好处是:每类检查规则可以独立维护,未来可以继续扩展“配额风险检查”“配置漂移检查”“成本归属检查”等模块。10. 本地运行验证在 AI Shell 中进入项目目录后,执行:cd /root/cloud-health-checker python src/main.py巡检成功后,控制台输出检查摘要,并生成 output/report.md 和 output/report.json。本次模拟资源清单中共有 18 个资源对象。由于每个资源会被多类检查器检查,最终检查资源总数为 90,发现问题总数为 38,其中严重问题 3 个,警告问题 35 个。关键结果如下:指标数量检查资源总数90发现问题总数38Critical3Warning35命名规范问题8标签合规问题12过期时间问题10闲置资源问题8公开访问问题0其中公开访问检查 18/18 通过,说明示例清单没有公开访问风险;其他问题集中在命名、标签、过期时间和闲置资源上,符合资源治理场景中的常见问题分布。11. GitCode 托管本地运行成功后,我将项目推送到 GitCode 仓库:https://gitcode.com/N9_xx/AIShell_CloudHealthChecker仓库中包含源码、配置、部署说明、脱敏清单和脱敏报告,方便评审和开发者复现。推送后,AI Shell 输出的提交信息如下:项目内容提交 ID2a5c916分支main提交信息init zero-cost cloud health checker文件数22 个文件12. 部署到 FunctionGraph在 FunctionGraph 控制台中创建事件函数:配置项值函数名称cloud-health-checker区域华北-北京四 cn-north-4函数类型事件函数运行时Python 3.9委托未使用任何委托内存256 MB超时60 秒这里需要注意,函数名称和 Handler 不是同一个概念。函数名称使用 cloud-health-checker。Handler 根据实际上传包结构填写:本次 FunctionGraph 测试使用的入口为 main.handler,测试成功;如果保持仓库原始 src/ 目录结构上传,则入口可参考 deploy/functiongraph.yaml 中的 src.main.handler。本案例最终以手动测试方式验证函数,不配置定时触发器,避免引入额外资源操作。后续如需扩展为每日巡检,可在 FunctionGraph 中增加 TIMER 触发器。13. FunctionGraph 测试结果创建函数后,使用空 JSON 事件进行同步调用测试:{} 函数返回 statusCode: 200,返回体中包含 message: 巡检完成,并返回 Markdown 与 JSON 两种报告。本次 FunctionGraph 测试统计如下:指标数值检查资源90发现问题38严重问题3警告问题35执行耗时约 0.07 秒报告输出方式包括两种:函数返回值:Markdown 和 JSON 结构直接包含在响应 body.reports 中。控制台日志:巡检过程输出到 FunctionGraph 标准日志。14. 零成本架构验证本案例部署和测试过程中未使用以下资源:资源类型使用情况OBS 对象存储未使用,报告通过函数返回值和日志输出SMN 消息通知未使用,不发送告警通知API Gateway未使用,通过手动测试或 TIMER 触发ECS/RDS 等计算或数据库资源未使用,纯 Serverless 运行公网带宽/EIP未使用AK/SK 凭据未使用,不调用真实云 API云 API 调用未使用,基于本地模拟资源清单巡检巡检数据来自项目内置的 inventory.json 模拟资源清单,检查规则来自 rules.yaml。所有逻辑都在函数运行时内完成,不需要外部依赖服务来存储报告或转发通知。15. 案例效果本案例完成后,开发者可以获得一个可复现的云资源体检工具:修改 inventory.json 即可调整被检查资源。修改 rules.yaml 即可调整治理规则。本地执行 python src/main.py 可快速验证。上传到 FunctionGraph 后,可以通过手动测试验证函数运行。后续可配置 TIMER 触发器,实现周期性巡检。脱敏版报告摘要如下:# 云资源体检报告(脱敏版) ## 汇总信息 - 检查资源总数:90 - 发现问题总数:38 ### 问题分布(按严重程度) | 严重程度 | 数量 | |----------|------| | warning | 35 | | critical | 3 | ### 问题分布(按检查类型) | 检查类型 | 数量 | |----------|------| | naming | 8 | | tags | 12 | | expiry | 10 | | idle | 8 | 16. 遇到的问题与解决。16.1 FunctionGraph 函数名称和 Handler 容易混淆创建函数时,函数名称应填写 cloud-health-checker,不能填写 src.main.handler。Handler 是代码入口,需要在函数代码配置中填写。根据上传包结构不同,入口可能是 main.handler 或 src.main.handler。本次手动测试使用 main.handler 成功。16.2 公开投稿需要脱敏虽然本案例使用模拟资源清单,但其中仍可能包含类似账号 ID、资源 ID、IP、负责人等字段。投稿前使用 AI Shell 检查并生成脱敏版本,保留风险类型和检查结果,避免公开敏感信息。17. 扩展方向在保持低成本和安全边界的前提下,后续可以继续扩展:增加更多资源类型的规则,例如 CCE、DCS、LTS 等。增加资源配置漂移检查,比较当前清单和基线清单差异。增加团队级规则模板,不同项目使用不同 rules.yaml。在 FunctionGraph 中配置 TIMER 触发器,实现每天自动巡检。在不引入付费资源的前提下,将报告输出到函数日志,由人工或后续流程查看。如果用于真实生产环境,应优先使用只读权限,并在充分评估费用与安全边界后,再考虑接入真实云 API。18. 案例总结本案例基于 AI Shell、GitCode 和 FunctionGraph,完成了一个严格零付费的云资源体检助手。它不依赖真实云 API,不配置 AK/SK,不购买服务器和数据库,仅通过本地模拟清单和规则文件完成资源治理实践。从实践过程看,AI Shell 的价值不仅在于生成代码,也在于帮助开发者不断收敛方案边界:当初始方案包含可能引入计费或权限复杂度的服务时,可以通过明确约束,让 AI Shell 重新设计为更符合活动要求的架构。FunctionGraph 则提供了一个轻量的 Serverless 执行环境,使巡检逻辑可以从本地脚本进一步部署为云端函数。最终,本案例形成了完整闭环:AI Shell 生成方案和代码,GitCode 托管项目,FunctionGraph 部署运行,函数返回值和日志输出报告。这条链路既满足活动对实践完整性的要求,也能为开发者提供一套可复用的云资源治理思路。19. 参考链接GitCode 项目仓库:https://gitcode.com/N9_xx/AIShell_CloudHealthChecker活动链接:https://bbs.huaweicloud.com/forum/thread-0212721816590407924-1-1.html【案例共创】【第12期】基于华为云AI Shell完成云资源管理、云服务运维和应用部署https://bbs.huaweicloud.com/forum/thread-0212721816590407924-1-1.html
-
一、概述1.1 案例介绍AI Shell 是智能 AI 命令行工具,以自然语言驱动终端操作,无需熟记复杂指令,大幅降低使用门槛,一站式完成华为云资源查询、操作、运维工作,让终端操作更高效、更智能。让华为云更好用、更易用。云资源管理依托自然语言对话下达指令,便捷完成华为云资源查询、创建、释放等全流程操作,命令即刻下达生效。云服务运维CES 告警自动化技能,支持批量管理告警、配置通知与监控,自带模板,适配 ECS 批量告警、多环境运维场景。应用部署依托自然语言对话轻松实现华为云资源编排以及应用部署。1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计60分钟。1.4 资源总览创建华为云资源需要收费,请按需充值。本案例中五子棋小游戏应用部署所创建的云资源预计花费10元。资源名称规格单价(元)AI Shell体验版免费华为云资源按需10二、AI Shell 使用指导2.1 获取访问秘钥AK 是Access Key(访问密钥)的缩写, 用于标识用户身份的唯一 ID, 通常公开传输。SK 是Secret Key(秘密密钥)的缩写,用于生成请求签名的保密密钥,仅用户和服务端持有。其核心功能是通过对称加密机制验证请求发送者的合法性,防止未授权访问。开发者配置 AK/SK,等同于在 AI Shell 中进行身份信息认证。可以参考 获取AK/SK 文档。备注:如果已有访问密钥,本步骤可以忽略。2.2 登录进入 AI Shell 环境登录进入开发者空间官网,从侧边栏快捷入口一键拉起 AI Shell。同意华为云开发者服务协议、隐私声明及开发平台协议。同意将临时访问凭据(AK/SK)同步至 AI Shell 环境,免手动配置直接使用。进入 AI Shell。2.3 使用 AI Shell在 AI Shell 对话框中输入以下提示词:复制代码请简单介绍AI Shell复制代码你是谁?你具备哪些技能?2.3.1 查看我的服务器要部署,首先要知道我们需要部署在哪台服务器上,我们来看下在 AI Shell 对话框中输入以下提示词:帮我查看我当前的服务器有哪些2.3.2 生成华为云 Terraform 配置并执行部署在 AI Shell 对话框中输入以下提示词:复制代码请基于源码地址 https://gitcode.com/zhepama/regex-explorer 分析项目代码,为此应用在华为云规划并创建一套轻量化极简架构云资源,并完成应用部署。克隆项目,分析项目结构和技术栈。分析完成,规划架构。创建配置文件,验证 Terraform 配置。部署过程会问我们要ssh密码:部署完成。浏览器访问:释放云资源:在 AI Shell 对话框中输入以下提示词:复制代码请帮我销毁本次所创建的云资源,(排除已有的ECS实例hcss_ecs_c556) 资源销毁完成。开发者也可以参考案例《AI Shell:依托自然语言实现华为云资源编排》完成教师点名签到系统的部署。【案例共创】【第12期】基于华为云AI Shell完成云资源管理、云服务运维和应用部署
-
前言OpenHarmony 轻量系统的固件构建通常会卡在三个地方:构建机架构、预编译工具链、源码和依赖下载。尤其是像 xiaohong (atomgit 开源的软硬件一体项目) 这类面向 WS63 芯片的项目,工具链、Python 依赖、repo 同步、clang 路径等细节只要有一处没对齐,就很容易在编译中途报错。这次我们尝试把 xiaohong 固件构建流程放到华为云上完成:通过 AI Shell 创建云端 ECS、准备构建环境、下载源码、配置工具链并完成固件编译。整体体验下来,AI Shell 比较适合这类“步骤多、依赖多、容易踩坑但流程可沉淀”的云端自动化任务。案例介绍xiaohong 是基于 OpenHarmony 的迷你系统,专为 WS63 芯片设计。本案例介绍如何使用华为云 AI Shell 从零开始编译 xiaohong 固件,包括环境准备、源码下载、工具链配置、编译过程以及常见问题解决方案。最终产物为:ws63-liteos-app_all.fwpkg:完整固件ws63-liteos-app_load_only.fwpkg:仅加载固件为什么适合用 AI Shell这个任务并不是单条命令能解决的问题,而是一个典型的云端构建流水线:需要创建合适规格和架构的 ECS。需要安装大量系统依赖和 Python 依赖。需要同步较大的 OpenHarmony 相关源码和预编译工具。需要处理工具链路径、软链接和环境变量。编译完成后还要下载固件并清理云资源。如果每次都手工操作,容易遗漏步骤。使用 AI Shell 的价值在于:可以用自然语言描述目标,再把重复流程沉淀为 skill 或脚本,后续复用时只需要发起任务即可。核心要点架构选择:必须使用 x86_64 架构的 ECS,预编译工具链不兼容 aarch64。源码下载:使用 repo 工具,并在 repo init 时添加 --git-lfs。工具链配置:需要配置 RISC-V 编译器 PATH,并创建 clang 软链接。Python 依赖:需要安装 kconfiglib、pycparser、markupsafe 等模块。构建命令:使用 ./build.sh --product-name xiaohong --gn-args is_debug=false。资源清理:构建完成后及时保存固件并释放 ECS,避免资源持续计费。适用对象企业个人开发者高校学生案例时间本案例总时长预计60分钟。资源总览创建华为云资源需要收费,请按需充值。本案例中编译环境所创建的云资源预计花费10元。资源名称规格单价(元)AI Shell体验版免费华为云资源按需10整体流程流程可以理解为:用户在开发者空间向 AI Shell 下达编译 xiaohong 固件任务。AI Shell 调用 xiaohong build skill 或自动化脚本。AI Shell 创建 x86_64 ECS 并准备构建环境。ECS 完成源码同步、工具链配置、固件编译。用户下载固件产物,并按需销毁 ECS。案例步骤0. 进入 AIShell参考教程探索智能 Shell 交互新范式 详解 AI Shell 完整用法或者产品文档AI Shell,云上开发运维效率升级 进入到 AI Shell 界面进入到 AIShell 我们应该能看如下界面,和我们常用的 OpenCode、AtomCode 等产品类似,可以输入:1. 使用 xiaohong-build-skill此处,我们不再介绍 AIShell 的详细功能和能力,留给大家自行探索。首先我们输入/确认一下所有功能是否都已经开启(默认是开启了所有的功能),如下图:虽然我们一句话就能实现 xiaohong 编译环境搭建、编译运行,但是为了了解背后的细节,我们先让 AIShell 帮我熟悉熟悉:帮我看看这是什么: https://atomgit.com/huqi/xiaohong-build-skill,如何使用?此处我们理解权限安全规则,这里按需选择 Allow once 或者 Allow always,我选择的是 Allow always,可以左右键切换选择并回车确认:接着我们就让 AIShell 执行这个 skill,如果遇到:帮我实际运行这个 skill 来编译 xiaohong 固件从右侧任务列表我们可以看到类似的:检查前置条件检查华为云凭证创建 ESC 实例构建配置环境下载源码编译固件下载固件到本地清理资源如果我们的华为云账号有幸绑定了短信,在 ECS 创建完我们也能收到短信,当然也能去控制台查看,类似:接下来只需静静等待 Task 被一一执行完。理想情况下,我们会看到 AI Shell 会继续自动执行下去,比如进入到 ECS 中安装依赖:比如下载源码:最终能看到编译完成:2. 下载固件下载固件的方式有很多种,比如让 AIShell 上传到 OBS ,当然我们也可以去 ESC 实例里手动下载:3. 后续后续可以让 AIShell 指导我们烧录固件:题外话:让 AIShell 帮我修改源码,重新编译固件写入我专属的引导语释放资源最后记得让 AIShell 释放资源:帮我释放这次创建的所有资源Q&A⚠️ The maximum number of model requests in a single turn is exceeded原因是触发了 MaaS 的限流,只需回复 “继续” 就行如果我开发的不是 xiaohong 而是其他平台如 小智 等,那怎么办?在我们看来,底层逻辑都是相通的,我们的目的是搭建编译环境–编译–获取产物,理论上只需要把相关的指导文档发给 AIShell 就行,类似的: 我想搭建环境编译 https://github.com/78/xiaozhi-esp32 ,应该怎么做?本文正在参与:【案例共创】【第12期】基于华为云AI Shell完成云资源管理、云服务运维和应用部署
-
多服务器批量指令管理:从Xshell到自动化运维在现代IT基础设施管理中,运维工程师经常需要同时管理多台服务器。无论是应用部署、配置更新还是故障排查,批量操作能力都显得至关重要。本文将深入探讨多种多服务器指令批量发送方案,从图形化工具到自动化脚本,助力提升运维效率。一、多服务器管理的挑战与需求随着业务规模扩大,企业服务器数量从几台发展到数十台甚至上千台。传统的一台台登录操作方式显然无法满足效率要求。多服务器管理主要面临以下挑战:时间成本高:重复操作消耗大量时间一致性难保证:手动操作容易出错或遗漏响应速度慢:紧急状况下难以快速批量处理// 服务器连接配置示例public class ServerConfig { private String host; private int port; private String username; private String password; // 构造方法、getter和setter省略}// 模拟10台服务器配置List<ServerConfig> servers = Arrays.asList( new ServerConfig("192.168.1.101", 22, "admin", "password1"), new ServerConfig("192.168.1.102", 22, "admin", "password2"), // ...更多服务器配置 new ServerConfig("192.168.1.110", 22, "admin", "password10"));二、Xshell方案详解Xshell作为Windows平台下强大的SSH客户端,提供了便捷的多服务器管理功能。2.1 同步输入功能实战操作步骤:依次连接所有目标服务器(10个会话标签页)启用同步模式:菜单栏「工具」>「发送键输入到所有会话」或按Alt+S输入指令并执行,所有会话同步接收再次按Alt+S退出同步模式适用场景:临时性的简单指令执行实时查看多服务器输出结果不需要复杂逻辑的批量操作优缺点分析:优点:无需额外工具,操作直观简单缺点:输出结果混杂,难以单独处理异常情况2.2 脚本功能高级用法Xshell支持VBScript和JavaScript脚本,可实现更复杂的自动化操作。// 对应的Java模拟代码 - 批量执行命令public class XshellScriptSimulator { public void executeCommandOnAllServers(List<ServerConfig> servers, String command) { List<Future<CommandResult>> futures = new ArrayList<>(); ExecutorService executor = Executors.newFixedThreadPool(5); for (ServerConfig server : servers) { futures.add(executor.submit(() -> { // 模拟SSH连接和执行命令 Thread.sleep(500); // 模拟网络延迟 System.out.println("在服务器 " + server.getHost() + " 执行: " + command); return new CommandResult(server.getHost(), 0, "执行成功"); })); } // 等待所有任务完成 for (Future<CommandResult> future : futures) { try { CommandResult result = future.get(); System.out.println("服务器 " + result.getHost() + " 结果: " + result.getOutput()); } catch (Exception e) { System.err.println("执行异常: " + e.getMessage()); } } executor.shutdown(); }}三、专业运维工具方案对于专业运维场景,推荐使用专门的批量管理工具。3.1 Ansible自动化运维Ansible是Red Hat开发的自动化运维工具,基于SSH协议,无需在被管理端安装客户端。环境配置:# inventory.yml 主机清单文件web_servers: hosts: web1: ansible_host: 192.168.1.101 ansible_user: admin web2: ansible_host: 192.168.1.102 ansible_user: admin # ...更多服务器db_servers: hosts: db1: ansible_host: 192.168.1.201 ansible_user: admin执行命令:ansible all -i inventory.yml -m command -a "df -h"AI写代码bash1// Java中调用Ansible的示例public class AnsibleExecutor { public void runAnsibleCommand(String inventoryPath, String command) { try { ProcessBuilder pb = new ProcessBuilder( "ansible", "all", "-i", inventoryPath, "-m", "command", "-a", command ); Process process = pb.start(); BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()) ); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } int exitCode = process.waitFor(); System.out.println("Ansible执行完成,退出码: " + exitCode); } catch (IOException | InterruptedException e) { e.printStackTrace(); } }}3.2 PSSH并行SSH工具PSSH是专门为批量SSH操作设计的工具包,包含多个实用命令。基本用法:# 创建主机文件echo "192.168.1.101192.168.1.102...192.168.1.110" > hosts.txt# 执行并行命令pssh -h hosts.txt -l admin -A -i "uptime"// Java集成PSSH功能public class PsshIntegration { public void executeParallelCommand(List<String> hosts, String username, String command) { // 生成主机文件 Path hostsFile = createHostsFile(hosts); try { Process process = Runtime.getRuntime().exec( "pssh -h " + hostsFile.toString() + " -l " + username + " -i \"" + command + "\"" ); // 处理输出 processOutput(process); } catch (IOException e) { e.printStackTrace(); } } private Path createHostsFile(List<String> hosts) { // 创建临时主机文件 // 实现省略 return null; }}四、自研批量管理工具对于有特殊需求的企业,可以开发自定义的批量管理工具。4.1 基于SSH2库的Java实现// 使用JSch库实现SSH批量执行public class BulkSshExecutor { private final List<ServerConfig> servers; private final int timeout; public BulkSshExecutor(List<ServerConfig> servers, int timeout) { this.servers = servers; this.timeout = timeout; } public Map<String, CommandResult> executeCommand(String command) { Map<String, CommandResult> results = new ConcurrentHashMap<>(); ExecutorService executor = Executors.newFixedThreadPool(10); for (ServerConfig server : servers) { executor.submit(() -> { try { JSch jsch = new JSch(); Session session = jsch.getSession( server.getUsername(), server.getHost(), server.getPort() ); session.setPassword(server.getPassword()); session.setConfig("StrictHostKeyChecking", "no"); session.connect(timeout); ChannelExec channel = (ChannelExec) session.openChannel("exec"); channel.setCommand(command); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ByteArrayOutputStream errorStream = new ByteArrayOutputStream(); channel.setOutputStream(outputStream); channel.setErrStream(errorStream); channel.connect(); // 等待命令执行完成 while (!channel.isClosed()) { Thread.sleep(100); } int exitStatus = channel.getExitStatus(); session.disconnect(); results.put(server.getHost(), new CommandResult( server.getHost(), exitStatus, exitStatus == 0 ? outputStream.toString() : errorStream.toString() )); } catch (Exception e) { results.put(server.getHost(), new CommandResult( server.getHost(), -1, "执行异常: " + e.getMessage() )); } }); } executor.shutdown(); try { executor.awaitTermination(5, TimeUnit.MINUTES); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return results; }}4.2 高级特性实现// 支持异步回调的批量执行器public class AdvancedBulkExecutor { private final ExecutorService callbackExecutor = Executors.newCachedThreadPool(); public void executeWithCallback(List<ServerConfig> servers, String command, ResultCallback callback) { BulkSshExecutor executor = new BulkSshExecutor(servers, 30000); Map<String, CommandResult> results = executor.executeCommand(command); // 异步处理回调 callbackExecutor.submit(() -> { for (Map.Entry<String, CommandResult> entry : results.entrySet()) { if (entry.getValue().getExitCode() == 0) { callback.onSuccess(entry.getKey(), entry.getValue().getOutput()); } else { callback.onFailure(entry.getKey(), entry.getValue().getOutput()); } } callback.onComplete(results); }); } public interface ResultCallback { void onSuccess(String host, String output); void onFailure(String host, String error); void onComplete(Map<String, CommandResult> allResults); }}五、方案对比与选型建议方案 适用场景 学习成本 功能强大性 推荐指数Xshell同步输入 临时简单操作 低 弱 ⭐⭐⭐Xshell脚本 定期简单任务 中 中 ⭐⭐Ansible 专业运维环境 中 强 ⭐⭐⭐⭐⭐PSSH 命令行爱好者 低 中 ⭐⭐⭐⭐自研工具 特殊需求场景 高 自定义 ⭐⭐选型建议:小型团队/临时需求:优先使用Xshell同步功能专业运维团队:推荐Ansible,功能全面社区活跃开发集成需求:考虑自研工具,灵活性最高命令行偏好:PSSH简单高效,学习曲线平缓六、最佳实践与注意事项6.1 安全实践使用SSH密钥认证替代密码定期轮换凭据和密钥最小权限原则,避免使用root账户// 安全的连接配置示例public class SecureSshConnector { public Session createSecureSession(ServerConfig server) throws JSchException { JSch jsch = new JSch(); // 使用密钥认证 jsch.addIdentity(server.getPrivateKeyPath()); Session session = jsch.getSession(server.getUsername(), server.getHost(), server.getPort()); // 安全配置 Properties config = new Properties(); config.put("StrictHostKeyChecking", "yes"); config.put("PreferredAuthentications", "publickey"); session.setConfig(config); session.connect(); return session; }}6.2 性能优化合理设置并发连接数,避免过多连接拖慢网络使用连接池复用SSH会话实现超时和重试机制// 带连接池的SSH执行器public class SshConnectionPool { private final Map<String, Session> sessionPool = new ConcurrentHashMap<>(); private final int maxSessionsPerHost; public SshConnectionPool(int maxSessionsPerHost) { this.maxSessionsPerHost = maxSessionsPerHost; } public synchronized Session getSession(ServerConfig server) throws JSchException { String key = server.getHost() + ":" + server.getPort(); Session session = sessionPool.get(key); if (session == null || !session.isConnected()) { JSch jsch = new JSch(); session = jsch.getSession(server.getUsername(), server.getHost(), server.getPort()); session.setPassword(server.getPassword()); session.connect(); sessionPool.put(key, session); } return session; }6.3 异常处理与日志完善的异常处理和日志记录对批量操作至关重要。// 增强的批量执行器 with 日志记录public class LoggingBulkExecutor { private static final Logger logger = LoggerFactory.getLogger(LoggingBulkExecutor.class); public Map<String, CommandResult> executeWithLogging(List<ServerConfig> servers, String command) { Map<String, CommandResult> results = new HashMap<>(); for (ServerConfig server : servers) { try { logger.info("开始在服务器 {} 执行命令: {}", server.getHost(), command); CommandResult result = executeSingleCommand(server, command); results.put(server.getHost(), result); if (result.getExitCode() == 0) { logger.info("服务器 {} 执行成功: {}", server.getHost(), result.getOutput()); } else { logger.warn("服务器 {} 执行失败,退出码: {}", server.getHost(), result.getExitCode()); } } catch (Exception e) { logger.error("服务器 {} 执行异常: {}", server.getHost(), e.getMessage()); results.put(server.getHost(), new CommandResult(server.getHost(), -1, e.getMessage())); } } return results; }}七、总结多服务器批量指令发送是现代化运维的基础能力。从简单的Xshell同步功能到专业的Ansible工具,再到自定义开发解决方案,各种方案各有优劣。选择合适的工具需要综合考虑团队技能水平、业务需求规模和安全要求等因素。无论选择哪种方案,都应该遵循安全最佳实践,实现完善的异常处理和日志记录,并考虑性能优化措施。通过合适的工具和良好的实践,可以显著提高运维效率,降低人为错误风险,为业务的稳定运行提供有力保障。未来发展趋势:云原生运维工具集成AI辅助的智能运维决策无代理(agentless)架构成为主流安全左移,在运维流程中内置安全检测希望本文能为您的多服务器管理工作提供有价值的参考和帮助。————————————————版权声明:本文为CSDN博主「码农阿豪@新空间」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_44976692/article/details/150612219
-
希望能提供 RemoteSSH/SFTP 扩展, 或在资源管理器直接集成。便利运维,增加 鸿蒙PC 使用场景
-
一、MobaXterm工具 MobaXterm是一款功能强大的远程连接工具,可以用于连接到各种类型的服务器,包括Linux、Windows和MacOS。它支持多种协议,包括SSH、RDP、VNC和Telnet。 使用MobaXterm可视化服务器桌面 MobaXterm可以通过X11转发功能来可视化服务器桌面。X11是一种图形协议,允许在本地计算机上显示远程服务器的图形界面。 二、MobaXterm工具可视化服务器目录 使用MoBaXterm工具常规的可视化如下所示,在此工具的左侧目录栏中可以清晰看到服务器上的目录架构: 三、MobaXterm工具可视化服务器桌面 进入MobaXterm界面后,在服务器终端输入下面命令: nauilus 回车等待一会,就会弹出如下的服务器桌面(是一个单独的窗口),可以在服务器桌面任意的查看和操作文件。 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/qq_40280673/article/details/137018743
-
介绍: 通过Zabbix系统监控记录应用在服务器上进程内存的使用情况,以便于分析服务器的性能瓶颈,首先编写shell脚本来获取服务器内存资源使用率最大的进程,然后通过Zabbix对这些进程的内存资源使用情况进行监控并收集数据。方法: 第一种方法:使用free命令可以获得当前内存使用情况,Centos6的命令和OS7的命显示有所不同,区别在于CentOS7多显示了/+buffers/cache 第二种方法:使用/proc/meminfo文件把系统状态信息很详细的显示出来,使用代码: less /proc/meminfo参数: Mem/total值:代表总的物理内存 Mem/available值:代表系统还剩下多少内存可用-其实大概等于buff/cache+free的值 Mem/used值:代表已经使用的内存(total-free)包含buffers和cached分配出去的量(与7used区别) (-/+ buffers/cache)/used值:total-free-buffers-cached (-/+ buffers/cache)/free值:free+buffers+cached 脚本:#touch memroy_status.sh#!/bin/bashMemTotal(){awk'/^MemTotal/{print $2}/proc/meminfo'}MemFree(){awk'/^MemFree/{print $2}/proc/meminfo'}Dirty(){awk'/^Dirty/{print $2}/proc/meminfo'}Buffers(){awk'/^Buffers/{print $2}/proc/meminfo'}$1 同前俩次文章一样可以添加类似的权限 chmod a+x memory_status.sh执行脚本,./memory_status.sh Memtotal/MemFree/Diry/Buffers。即可显示对应结果。当业务需求对特定服务器进行监控时,可以通过编写脚本获取各个进程占用系统资源的信息,从而使用Zabbix采集这些数据并对特定进程进行监控,如Zabbix监控内存信息收集等等。
-
介绍: 在日常的运维工作中,mysql数据是相当重要的一部分,使用Zabbix进行监控Mysql状态数据收集,与采集CPU、内存、I/O、磁盘等信息类似。步骤: 先yum安装mariadb-server mariadb:yum -y install mariadb-server mariadb。 启动mariadb:systemctl start mariadb。 使用空密码登录mysql控制台可以执行增删改查等操作,登录mysql后回介绍当前的版本信息可以通过\q来退出当前操作。 mysqladmin命令可以管理mysql,看mysql的状态,也可以改密码:mysqladmin status。 mysqladmin extended-status来查看扩展状态信息。 Zabbix对mysql的性能监控,通过mysql状态值将这些状态值传递给服务器并绘制成图片,这样可以观察mysql 的工作状态。参数:这里介绍的参数将在下方脚本中用到也是比较常见的参数,所以很重要! Bytes_sent 发送字节数 Bytes_received 接受的字节数 Com_delete 执行删除的个数 Com_rollback 执行回滚的个数 Com_insert Mysql执行插入的个数 Com_update Mysql执行更新的个数 Slow_queries 慢查询语句的个数脚本: vim zabbix_mysql_status.sh#!/bin/bash#mysql for zabbixuptime(){mysqladmin status | awk '{print $2}'}Slow_queries(){mysqladmin status | awk '{print $9}'}Com_insert(){mysqladmin extended-status |awk '/\<Com_insert\>/{print $4}'}Com_delete(){mysqladmin extended-status |awk '/\<Com_delete\>/{print $4}'}Com_update(){mysqladmin extended-status |awk '/\<Com_update\>/{print $4}'}Com_select(){mysqladmin extended-status |awk '/\<Com_select\>/{print $4}'}Com_commit(){mysqladmin extended-status |awk '/\<Com_commit\>/{print $4}'}Com_rollback(){mysqladmin extended-status |awk '/\<Com_rollback>/{print $4}'}Bytes_sent(){mysqladmin extended-status |awk '/\<Bytes_sent>/{print $4}'}Bytes_received(){mysqladmin extended-status |awk '/\<Bytes_received>/{print $4}'}Com_begin(){mysqladmin extended-status |awk '/\<Com_begin>/{print $4}'}$1权限: chmod a+x zabbix_mysql_status.sh来赋予权限后可以直接查看当前的mysql数据信息,比如:./zabbix_mysql_status.sh uptime/Com_delete/Com_insert/slow_queries和上面代码介绍过的com_xxx或bytes_xxx来实现。
-
介绍: 常见的获取TCP连接状态的方法有俩种,一种是netstart命令,另一种是ss命令。通过netstat来获取tcp的状态信息,netstat -an | grep ^tcp 或 ss -an | grep ^tcp 通过ss来统计tcp的状态连接数。 ss -an | grep ^tcp | awk '{tcp_connect_status[$2]++} END {for i in top_connect_status) {print i,tcp_connect_status[i]}}' 结果显示当前的tcp状态连接数是多少。TCP协议: tcp被称为可靠的数据传输协议,主要是通过许多机制来实现的,其中最重要的就是三次握手和四次挥手的功能。如图: 常见的TCP状态信息描述如下: CLOsed socket 没有被使用 无连接。 CLOSING 服务器和客户端同时关闭连接,等待远程tcp的连接终止请求确认。 LISTEN 监听状态,等待从任何远程端口TCP和端口的连接请求。 SYN_RECV 接收到SYN报文。 SYN_SENT 已经发送SYN报文,发送完一个连接请求后等待一个匹配的连接请求。 LAST_ACK 远程关闭,当前socket被动关闭后发送FIN报文,等待对方ACK报文。 FIN_WAIT_1 等待远端TCP的连接终止请求,或者等待之前发送的连接终止请求的确认。 FIN_WAIT_2 等待远程TCP的连接终止请求。编写TCP连接数的 shell脚本: vim zabbix_tcp_connect_status.sh#!/bin/env bashListen(){ ss -an |grep '^tcp' |grep 'LIsten' |wc -lSYN_RECV(){ ss -an |grep '^tcp' |grep 'SYN[_-]RECV' wc -l}}ESTABLISHED(){ ss -an |grep '^tcp' |grep 'estab' |wc -l }TIME_WAIT(){ ss -an |grep '^tcp' |grep'TIME[_-]WAIT' |wc -l}$1 也可以用代码 ss -an |grep '^tcp' |grep 'linten' |wc -l 来看下状态数量 或者 ss -an |grep '^tcp' |grep 'linten'来看一下当前的连接状态可以具体看到ip地址等信息。也可以给脚本加上权限,chmod a+x zabbix_tcp_connect_status.sh 同理 ./zabbix_tcp_connect_status.sh listen 或 /zabbix_tcp_connect_status.sh TIME_WAIT 或 /zabbix_tcp_connect_status.sh ESTABLISHED 。 当服务器的连接数很大,统计TCP状态也很频繁时,使用Zabbix监控TCP状态信息是一个很好的方案。
-
介绍: 在开头时和大家说过,三剑客最厉害的就是awk,awk是由创建者的名字来命名的。awk是一种报表生成的工具,对文件内容进行各种排版的操作,它允许您创建简短的程序,这些程序的功能包括读入输入文件,数据排版,处理数据。awk是一种过程式编程语言或脚本语言解释器,支持条件判断、数组、循环等功能。 awk的处理文件和数据的流程是从第一行开始到最后一行,匹配的特定模式的行,并在这些行上进行你想要的操作,如果没有指定处理动作,则把匹配的行显示到标准输出;如果没有指定模式,则所有被操作所执行的行都被处理。 awk有俩个特殊的模式:begin和end,它们分别被防止在没有读取任何数据之前及在所有的数据读取完完成以后执行。原理: awk格式为: awk 'begin{commands} pattern {commands} END {commands}' begin的语句在awk开始输入流中读取之前被执行,这是一个可选的语句,如变量初始化、打印输出表格的表头等情况。end语言在awk处理完所有文件后被执行,对所有行的数据进行分析,之后打印出分析结果这类操作,都可以在end语句中完成,他也是一个可选语句。 pattern语句中的通用命令是最重要的部分,同样是一个可选的语句。如果没有提供pattern语句则默认执行{print},即可打印读取的每一行,awk读取的每一行都会执行该语句.语法: awk 'pattern' filename 或 awk '{action}' filename 或 awk 'pattern {action}' filename 例如: cat /etc/passwd awk '/root/' /etc/passwd 结果就会显示在文件 /etc/passwd中匹配到root的行。同样awk也支持打印, 比如: echo 123 | awk '{print "hello,awk"}' 结果就是hello awk内直变量: awk提供乐非常丰富的内直变量,了解这些内直变量也是非常重要的,相对于grep和sed而言,awk优于他们原因是支持对记录和字段的处理。这些内直变量在用awk工具的同事也可以被修改或引用,比如说,可以使用NR这个内置的变量改变模式匹配中指定的工作范围,也可以通过修改记录的分隔符RS让一个特殊字符作为记录的分隔符,而不是换行符。
-
介绍: sed一次处理一行内容,处理时把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,再把缓冲区的内容输出到屏幕,接着处理下一行,这样不断重复,直到把缓冲区中的内容全部输出到屏幕。接着处理下一行,这样不断的重复反复,直到文件末尾,除非使用重定向存储输出,否则文件内容并不改变,sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序,sed的缓冲区分别为:模式空间和保持空间。 一般情况下,sed首先把第一行内容装入模式空间,处理后输出到屏幕,然后继续把第二行装入模式空间,再处理输出到屏幕,依次循环,直到结束。语法: sed从文件读取数据,如果没有输入文件,则默认对标准的输入进程数据进行处理,sed可以将数据进行替换、删除、新增、选取等功能。首先了解下sed的语法格式。 sed [options] command file1 file2 这是sed的调用方法,再该方法中将编辑指令直接放选项后面,这是最常见的方法,当执行一些较为复杂的编辑年纪操作时,使用的编辑命令可能会很长,这时通常将编辑指令放入一个脚本文件中,就会用到第二种方法,sed [options] -f scriptfile来调用sed文件。特点:(1)非交互,基于模式匹配的过滤及修改文本。(2)脚本化,再shell编程中sed比vim方便。(3)可对文本实现输出,删除,复制,剪切等编辑。常见参数: 和grep相比,常见的选项如,-r支持扩展正则表达式、-h输出sed的帮助信息、-i直接修改读取的文件内容,而不是由屏幕输出、d 删除、i\输出内容 i的后面可以接字符常、p 打印 将处理过的字符常打印出来、q退出sed、p打印模式空间的第一行。正则表达式: 和grep相比,sed再文件中查找模式时,也可以使用正则表达式和各种元字符。正则表达式是括再斜杠间的模式,用于查找和替换。支持的元字符集如:^ [] [^] . *等等。使用的扩展元字符集如:?、+、{} ()|。 例如,删除/etc/passwd文件第四行。 sed '4d'passwd最后同样是给大家留下一个小问题:用sed命令将文本12345.txt写成倒叙。上期答案: 正则表达式和扩展表达式类似,但是扩展表示更加简单,正则表达式需要用\来转移字符,来表示某些字符的意思,而扩展表示则不需要。
-
介绍: linux中的三剑客grep、sed、awk作为强大的文本搜索工具,你知道哪个是最厉害啊么?当然是awk。今天我们来聊一聊grep。grep和正则表达式息息相关,它能用正则表达式来搜索文本,在文件中全局查找指定的正则表达式,并打印所有包含该表达式的行。通常grep有三种版本,即grep、egrep和fgrep。egrep为扩展的grep,其支持更多的正则表达式元字符,fgrep则为快速grep它按照字面意思解释所有字符。命令及格式: grep [options选项] PATTERN [FILENAME FILENAME...] 例如: grep 'lizeyu' /etc/passwd grep 'bash shell' /etc/test 结果:找到匹配模式:返回的退出状态是0、没找到匹配文件返回的退出状态是1、找不到指定文件返回的退出状态为2。 grep命令输入可以来自标准的输入或管道,而不仅仅是文件的使用比如: ps aux | grep 'sshd' ll |grep '^d' grep的选项参数常见的我们来举例学习, -i忽略字符的大小写,-l只列出匹配行所在的文件名,-n在每一行前面加上它在文件中的相对行号,-c显示成功匹配的行数,-s禁止显示文件不存在或文件不可读的错误信息,-o仅显示匹配的字符串文件本身。注意: 针对搜索字符常的选项,使用正则表达式时必须用单引号括起来,避免于shell的元字符冲突,结合grep与正则表达式,能快速的找到希望匹配的字符常和行,提高工作效率。grep命令和正则表达式: grep命令结合正则表达式使得linux运维工作不仅简单化,而且还能高效的使用。 例如: 使用egrep匹配文件中root字符串,egrep 'root' /etc/passwd /etc/shadow /etc/hosts 使用egrep列出匹配行的文件名,egrep -l 'root' /etc/paswd /etc/shadow /etc/hosts 使用egrep匹配ip地址,egrep '({0-9},{1,3}\.){3}{0-9}{1,3}'/etc/sysconfig/network-scripts/ifcfg-eth0最后给大家提一个问题,正则表达式和扩展正则表达式的区别是什么? 下期揭晓。
-
概念: 数组中有限个相同类型的变量用一个名字命名,然后用编号区分它们,用于区分不同元素的编号称为数组下标,数组的元素有时也称为下标变量。类型: 数组分为普通数组和关联数组。普通数组中的索引都是整数,关联数组的数组索引可以用任意的文本。关联数组使用之前需要声名,关联数组于普通数组的最大区别就是,他是由特定格式的键值对组成的,。 普通数组中的数组元素的索引从0开始编号,获取数组中的元素要利用索引。索引也就是下标,可以是算数表达式,其结果必须是一个整数。 例:普通数组的定义 zeyuli={linux shell awk openstack docker} 对应中的单词下标就是 0 1 2 3 4 关联数组和普通数组所不同的是,它的索引下标可以是任意的整数和字符串. 例:关联数组的定义 zeyuli=([name]=lizeyu [sex]=male [age]=23 对应中的下标就是name sex age 形式可以为任意的字符串不必为整数的编号。 综上所述,在shell中,数组分为普通数组和关联数组,用户定义的是普通数组,如需使用关联数组需要先声明在使用,用户声明关联数组使用-A的参数,通常情况下shell解释器隐藏式声明普通数组,用户无需操作,用户要显示声明的普通数组,需要用-a的参数。 例如:声明普通数组的方法 #declare -a array 声明关联数组的方法 #declare -A array 定义: 在shell中,定义一个数组有很多的方法,需要先按照命令规则给数组命名,然后再定义数组的值,数组的定义方法有:直接定义数组、下标定义数组、间接定义数组和从文件中读入定义数组,一共四种方法。 直接定义数组是用小括号将变量值括起来赋值给数组变量,每个变量的值之间要用空格进行分割。下标定义数组使用小括号将变量值括起来,同时采用键值对的方式来赋值。间接定义数组是分别通过定义数组的方法来定义,从文件读入定义数组是使用命令的输出结果作为数组的内容。
-
第一类:数字性循环 ----------------------------- for1-1.sh #!/bin/bash for((i=1;i<=10;i++)); do echo $(expr $i \* 3 + 1); done ----------------------------- for1-2.sh #!/bin/bash for i in $(seq 1 10) do echo $(expr $i \* 3 + 1); done ----------------------------- for1-3.sh #!/bin/bash for i in {1..10} do echo $(expr $i \* 3 + 1); done ----------------------------- for1-4.sh #!/bin/bash awk 'BEGIN{for(i=1; i<=10; i++) print i}' 第二类:字符性循环 ----------------------------- for2-1.sh #!/bin/bash for i in `ls`; do echo $i is file name\! ; done ----------------------------- for2-2.sh #!/bin/bash for i in $* ; do echo $i is input chart\! ; done ----------------------------- for2-3.sh #!/bin/bash for i in f1 f2 f3 ; do echo $i is appoint ; done ----------------------------- for2-4.sh #!/bin/bash list="rootfs usr data data2" for i in $list; do echo $i is appoint ; done 第三类:路径查找 ----------------------------- for3-1.sh #!/bin/bash for file in /proc/*; do echo $file is file path \! ; done ----------------------------- for3-2.sh #!/bin/bash for file in $(ls *.sh) do echo $file is file path \! ; done ———————————————— 版权声明:本文为CSDN博主「BabyFish13」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/BabyFish13/article/details/52981110
-
一:实验环境1.一台云服务器2.服务器重装系统(如果第一次使用云服务器可忽略)3.finalshell远程连接二:项目部署1.安装LAMP架构1.关闭防火墙[root@ecs-20200608 ~]# iptables -L ----列出防火墙规则[root@ecs-20200608 ~]# iptables -F ----清空防火墙规则[root@ecs-20200608 ~]# systemctl stop firewalld[root@ecs-20200608 ~]# systemctl disable firewalld ----开机自动关闭2. 关闭selinux 临时关闭[root@ecs-20200608 ~]# setenforce 0[root@ecs-20200608 ~]# getenforce ----查看selinxu状态 永久关闭[root@ecs-20200608 ~]# vim /etc/selinux/config SELINUX=disabled 把原来的enforcing修改为disabled 注: 想要生效需重启系统(reboot) 状态: enforcing permissive disabled 安装数据库服务[root@ecs-5680 ~]# yum -y install mariadb-server mariadb 安装php和apache服务[root@ecs-5680 yum.repos.d]# yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm[root@ecs-5680 yum.repos.d]# yum install yum-utils[root@ecs-5680 yum.repos.d]# yum-config-manager --enable remi-php722.启动服务 3.服务部署 删除之前的配置文件(选中那个文件右键删除)[root@ecs-5680 yum.repos.d]# yum install httpd php php-gd php-json php-mysql php-curl php-mbstring php-intl php-mcrypt php-imagick php-xml php-zip [root@ecs-5680 yum.repos.d]# systemctl start httpd mariadb[root@ecs-5680 yum.repos.d]# ss -antp |grep 80 ESTAB 0 52 192.168.0.201:22 120.244.60.80:14874 users:(("sshd",pid=1562,fd=3)) LISTEN 0 511 [::]:80 [::]:* users:(("httpd",pid=8037,fd=4),("httpd",pid=8036,fd=4),("httpd",pid=8035,fd=4), ("httpd",pid=8034,fd=4),("httpd",pid=8033,fd=4),("httpd",pid=7994,fd=4)) [root@ecs-5680 yum.repos.d]# ss -antp |grep 3306 LISTEN 0 50 *:3306 *:* users:(("mysqld",pid=8262,fd=14))部署数据库服务:[root@ecs-5680 yum.repos.d]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.5.65-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> GRANT ALL ON nextcloud.* TO 'nextclouduser'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> exit apache服务部署:(直接上传使用,事先已经写好了)[root@ecs-5680 yum.repos.d]# cd /etc/httpd/conf/[root@192 conf]# rm -rf httpd.conf 上传新的配置文件(右下角空白处右键上传,见到下面的界面) 选中那个文件上传即可4.产品上线 下载项目包:[root@ecs-5680 etc]# cd [root@ecs-5680 ~]# wget https://download.nextcloud.com/server/releases/nextcloud-15.0.0.zip解压项目包:[root@ecs-5680 ~]# unzip nextcloud-15.0.0.zip项目拷贝到网站发布目录下:[root@ecs-5680 ~]# mv nextcloud /var/www/设置权限:[root@ecs-5680 ~]# chown apache.apache /var/www/nextcloud/ -R 重新启动apache5.浏览器访问(输入公网ip地址访问)[root@ecs-5680 ~]# systemctl restart httpd6.安装完成后 如果不出现登录界面,换一个浏览器访问(看到这个界面后输入自己设置的用户名和密码)7.使用网盘8.上传文件 共享链接 复制链接(这个需要复制自己的,以下是举了一个案例:) http://119.8.98.63/index.php/s/Y5dryD6QkmCE7C
上滑加载中
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中 -
一个AI团队帮你写代码:华为云码道Agent Space实战2026/06/25 周四 19:00-21:00
张翰文-华为云码道工程师/郭英旭-青软创新科技集团股份有限公司 软件架构师
本场直播聚焦华为云码道Agent Space两大模式:研发办公、代码开发,亲身体验从需求到代码的AI自动化能力。实操演示基于华为 CodeArts CLI,依托 OpenSpec 规格体系从零搭建业务项目。
回顾中
热门标签