单位 2 / 11

自动化脚本:安全生成 Bash、PowerShell 和 Python

收益:

  • 能够使用人工智能生成具有明确约束和安全护栏的 Bash、PowerShell 和 Python 自动化脚本
  • 能够向每个脚本添加幂等性、空运行、错误处理和回滚等原则,并应用“生成、强化、验证”循环
  • 能够理解所生成的脚本的执行并不意味着它是安全的,并通过阅读和测试破坏性的行来养成承担责任的习惯。

自动化脚本:利用 AI 安全生成 Bash、PowerShell 和 Python

系统管理员最大的敌人是重复的手动工作:连接到每台机器并清理日志,在二十台服务器上打开相同的用户,每天早上运行相同的运行状况检查。这种重复可能会出现时间错误和人为错误。自动化脚本是一个小程序,它将这些迭代委托给计算机 - 通常在 Linux 世界中用 Bash(shell 命令语言)编写,在 Windows 世界中用 PowerShell(微软的自动化 shell)编写,以及用于独立于平台的工作的 Python 编写。人工智能在生成、解释和改进这些脚本的初稿方面的速度令人难以置信。但脚本不是文本,它是在你的系统中工作的力量;与 Excel 公式不同,如果不正确,它会删除文件、停止服务并切断访问权限。这就是为什么这个单元的承诺是:人工智能编写脚本,你阅读它,测试它并负责运行它。

在本单元中,您将学习如何使用人工智能生成安全、可读和可检索的脚本;幂等性(运行同一脚本两次不会造成损坏)和空运行等救命原则;您将了解脚本在投入生产之前必须经过的检查。

为什么人工智能脚本如此强大?

即使是经验丰富的管理员也可能不熟悉 Bash 循环的确切语法、PowerShell cmdlet(命令)的参数或 Python try/ except 块。人工智能立即填补了这一空白:你用简单的土耳其语解释意图,它会生成一个工作大纲。此外,你可以给人工智能一个现有的脚本,并说“解释一下”、“添加错误处理”、“使其更具可读性”。这缩短了学习曲线,让初级团队成员能够跟上进度。

但权力伴随着责任。大多数时候,人工智能生成的脚本会正确地写出“幸福之路”(如果一切顺利的话);但它可能会错过边缘情况(文件丢失、磁盘已满、网络故障)或做出危险的假设。因此,可以将人工智能脚本生成分为三个阶段:生成、强化、验证。

一步一步:安全脚本生成

  1. 清楚地写出意图和约束。哪个操作系统、哪个 shell 版本、哪个文件路径、什么权限?比如“Ubuntu 22.04,Bash 5,sudo不是root,只能在/opt/app/logs下运行”。模糊的需求会产生危险的假设。
  2. 要求提供安全栏杆。要求脚本“失败时停止”(在 Bash 中设置 -euo pipelinefail)、提示确认破坏性操作、操作前备份以及试运行模式。这些护栏捕获人工智能绕过的边缘状态。
  3. 写幂等。第二次运行时脚本不应导致任何错误或损坏。建立“用户已存在则跳过”、“不存在则创建目录,存在则不碰”的逻辑。这使得自动化能够一次又一次安全地运行。
  4. 阅读并理解。阅读生成的每一行。要求AI单独标记破坏性命令(rm、Remove-Item、DROP)。
  5. 通过空运行进行测试。首先,以“告诉要做什么”模式运行它,而不是实际操作。如果输出符合您的预期,请切换到实模式 - 首先在测试机器上。
  6. 准备你的复出。该脚本是否进行备份?你知道如何恢复备份吗?是否有日志记录,您稍后可以看到它在做什么吗?
提示:让每个析构函数脚本包含一个 DRY_RUN=true 变量和一个 --apply 标志。默认行为是写下将要发生的事情而不删除任何内容;仅当显式给出 --apply 时才让实际删除起作用。这一习惯可以防止职业生涯的灾难。

三个迷你箱子

案例 1 — 幂等性节省了 3 个小时。管理员编写了一个脚本,在 25 台服务器上安装了相同的监控代理。第一个版本不是幂等的:如果已经安装了代理,它会在第二次运行时破坏配置。工程师让AI添加了“检查是否安装,如果安装则跳过”的逻辑。在下一个维护时段期间,脚本意外触发了两次,但没有造成任何损害。幂等性使得 25 台服务器的恢复变得不必要。

案例 2 — 试运行保存了根目录。一个团队收到了一个清除旧备份的 Bash 脚本。如果变量为空,路径就会变成 / 而不是 /backups/ ——这是一个典型的危险。工程师首先在 DRY_RUN 模式下运行它,当他在输出中看到类似 rm -rf / 的行时愣住了,并添加了变量检查(:“${BACKUP_DIR:?cannot beempty}”)。空运行发现了一个错误,该错误会在投入生产之前擦除整个磁盘。

案例 3 — 错误管理导致其在某一晚无法醒来。当磁盘已满时,PowerShell 脚本正在归档日志。如果网络共享无法访问并继续填满磁盘,第一个版本将默默地失败。 AI中添加了“每一步验证是否成功,如果不成功,通知电子邮件并停止”。一周后,该帖子被破坏;脚本停止并警告,磁盘未满,凌晨 3 点没人醒来。

四个可复制模板

1) 安全 Bash 脚本生成:

您的角色:高级 Linux 自动化工程师。为 Ubuntu 22.04 / Bash 5 编写脚本。 目的:[目的]。规则:- 从“set -euo pipelinefail”开始。- 使用“: ${VAR:?}”验证所需变量。- 使用默认 DRY_RUN=true 执行破坏性操作; 让真正的应用程序仅使用 --apply 标志运行。 - 将每个步骤记录到标准输出,出现错误时以有意义的消息停止。 - 使其幂等(这样就不会在第二次运行时造成损坏)。然后:分别标记出可能具有破坏性的行,并写出我在生产前需要测试的3个案例。

2)强化现有脚本:

使以下脚本准备好用于生产:(1) 添加错误处理和日志记录,(2) 使其幂等,(3) 将破坏性命令放在空运行后面,(4) 提取变量的硬编码路径和秘密。简要描述您更改的每一行以及原因。脚本:[脚本]

3)PowerShell安全自动化:

您的角色:Windows 自动化专家。编写 PowerShell 5.1 兼容脚本。目的:[目的]。规则:- 从“$ErrorActionPreference = 'Stop'”开始。- 添加 -WhatIf 对析构函数 cmdlet 的支持(默认 WhatIf)。- 用 try/catch 包装每个操作,记录错误。- 凭证硬编码;使用参数或安全输入。标记破坏性线条并编写撤消步骤。

4)Cron/schedule表达式解码和验证:

用简单的土耳其语解释以下 cron 语句并写下接下来的 3 个运行时: [表达式]此外,如果我的目标是“[目的]”,此语句是否正确,或者您是否建议修复?还要注意时间段的影响。

弱提示/强提示

弱提示:

给我写一个清理日志的脚本。

这个提示是危险的:不清楚哪个操作系统、哪个目录、哪个年龄限制、哪个安全护栏。人工智能可以提供一种简单、具有破坏性且无法验证的客户关系。

强力提示:

您的角色:高级 Linux 自动化工程师。为 Ubuntu 22.04 / Bash 编写日志清理脚本。仅删除 /opt/app/logs 下超过 30 天的 .log 文件。规则:set -euo pipelinefail;验证 BACKUP_DIR 和 LOG_DIR 变量(如果为空则停止);删除前的日志文件列表;让DRY_RUN=true为默认值,实际删除只能用--apply;让它幂等。标记出破坏性的线条并写下我应该测试的 3 个场景。

特征

弱/快脚本

硬化脚本

错误处理

不,无声的失败

设置-euo管道失败,尝试/捕获

破坏性行动

直接工作

试运行+打开检查标志

重新启动

可能造成伤害

幂等、安全

秘密管理

硬编码

变量/隐藏输入

撤消

备份+恢复步骤

常见错误

  • 在没有试运行的情况下运行破坏性脚本。在干模式下看不到包含 rm、Remove-Item、DROP 的脚本会首先消耗磁盘空间。
  • 跳过空变量检查。空路径变量使 / 代替 /backups/; :请务必使用“${VAR:?}”进行验证。
  • 忘记幂等性。该脚本在运行两次时会中断,从而使自动化变得不可靠。
  • 硬编码秘密。当您共享该脚本时,将密码和密钥写入脚本会导致泄漏。
  • 在生产中进行测试。制作的首演意味着在舞台上排练;先试机。
注意:不要仅仅因为“它有效,那就意味着它是正确的”就接受AI给出的脚本。仅仅因为它有效并不意味着它没有破坏性。脚本可以在快乐路径上运行并删除边缘状态的数据;真正的测试是边缘情况。

总之

自动化脚本消除重复并减少人为错误;人工智能在生成、解释和强化这些脚本方面的速度令人难以置信。但脚本是一股力量:如果错误,它就会删除、停止、中断。因此建立“生产、强化、验证”循环。在每个破坏性脚本中包括错误处理、幂等性、空运行和回退。将秘密提取到变量中,在测试机上进行第一次运行。 AI脚本编写;您的工作是阅读它、测试它并负责运行它。

应用任务

选择您在作业中手动重复的任务(例如日志清理、用户打开、运行状况检查)。使用上面的“安全 Bash 脚本”或“PowerShell 安全自动化”模板向 AI 请求大纲。逐行读取生成的脚本并标记破坏性的行。首先在测试机器上以空运行模式运行它,将输出与您的期望进行比较。然后将脚本返回给 AI 并使用“harden”模板对其进行优化,并记下两个版本之间的 5 个差异。

清单

  • [ ] 我是否在提示中包含了操作系统、shell 版本、路径和权限等限制?
  • [ ] 脚本是否可以通过 set -euo pipelinefail / $ErrorActionPreference='Stop' 进行容错?
  • [ ] 干运行/-WhatIf 背后是否存在破坏性操作并需要显式检查标志?
  • [ ] 脚本是否幂等(第二次运行安全)?
  • [ ] 我是否将秘密提取到变量/秘密输入而不是对其进行硬编码?
  • [ ] 我是否已在测试机上进行了首次运行并准备了返回计划?