ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

gogcli `gog drive bulk` 完全指南:批量移除 Drive 公开权限与批量调整权限角色

gogcli `gog drive bulk` 完全指南:批量移除 Drive 公开权限与批量调整权限角色 gogcligog drive bulk完全指南批量移除 Drive 公开权限与批量调整权限角色【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcligog drive bulk是 gogcliGoogle Workspace in your terminal中用于批量 Drive 权限管理的命令组它能在单个命令内扫描文件夹树、枚举每个文件/文件夹的权限并统一执行「移除 any one/public 公开权限」或「按角色批量改权」。本文将以仓库中的 命令文档、remove-public 文档、update-role 文档 为主体结合 实现源码 讲解每个参数的含义、底层扫描与执行流程并提供可直接复制的实战示例帮助你安全地在大型 Drive 目录树中批量收敛共享权限。一、命令概览与适用场景gog drive bulk是gog drive别名gog drv下的子命令组本身不直接执行操作而是聚合两个面向权限批处理的操作子命令功能对应文档gog drive bulk remove-public跨文件移除 anyone/public 公开权限gog-drive-bulk-remove-public.mdgog drive bulk update-role跨文件把匹配到的权限角色批量改为新角色gog-drive-bulk-update-role.md命令基本用法gog drive (drv) bulk command典型适用场景安全收敛一次性扫描某个部门文件夹树含共享盘把所有「链接已知即可访问 / 互联网上任何人可访问」的 anyone 权限全部删除消除数据泄露面角色规范化把散落在成百上千个文件中的writer权限统一降级为commenter或把外部协作者的reader提升为commenter实现权限策略的一致性定向清理仅针对某个类型如domain或某个目标某邮箱 / 某域名的权限做批量操作避免误伤。父命令在源码中对应internal/cmd/drive_bulk.go的DriveBulkCmd其中通过cmd:标签声明了两个子命令help文本与文档中的描述完全一致type DriveBulkCmd struct { RemovePublic DriveBulkRemovePublicCmd cmd: name:remove-public help:Remove anyone/public permissions across files UpdateRole DriveBulkUpdateRoleCmd cmd: name:update-role help:Change matching Drive permission roles across files }二、gog drive bulk remove-public批量移除公开权限2.1 命令与专属参数gog drive (drv) bulk remove-public [flags]其专属参数在源码中定义于DriveBulkRemovePublicCmdFlag类型默认值说明--file--file-idstring只处理这一个文件 ID而不是扫描整个文件夹树--parentstringroot要扫描的文件夹 ID缺省为根目录--depthint2最大文件夹深度0 不限深度--maxint500最多扫描的文件/文件夹数0 不限制--all-drivesbooltrue是否包含共享盘使用--no-all-drives可只看「我的云端硬盘」2.2 行为与匹配规则该命令的匹配逻辑在源码DriveBulkRemovePublicCmd.Run中非常清晰对扫描到的每个条目调用collectDriveBulkPlans只要权限的Type anyone就列入「移除计划」plans, err : collectDriveBulkPlans(ctx, svc, items, func(perm *drive.Permission) (string, bool) { return , perm ! nil perm.Type driveShareToAnyone })其中driveShareToAnyone常量定义在 internal/cmd/drive_sharing.go值为anyone——这正是 Drive API 中「链接分享给任何人」的权限类型同时涵盖「知道链接的任何人」与「互联网上所有人」两类公开访问。注意remove-public只针对anyone类型权限不会删除user、group、domain类型的普通共享权限因此相对安全。计划生成后命令会先经过确认环节再对每个计划执行Permissions.Delete并始终携带SupportsAllDrives(true)以兼容共享盘中的文件if err : svc.Permissions.Delete(plan.FileID, plan.PermissionID).SupportsAllDrives(true).Context(ctx).Do(); err ! nil { return fmt.Errorf(remove permission %s from %s: %w, plan.PermissionID, plan.FileID, err) }2.3 实战示例对整个「我的云端硬盘」根目录2 层深度、最多 500 个条目执行公开权限清理先预览gog drive bulk remove-public --dry-run对指定文件夹树执行含共享盘深度 5最多扫描 2000 个条目gog drive bulk remove-public \ --parent 0BxxxxxFolderID \ --depth 5 \ --max 2000 \ --all-drives确认无误后真正执行跳过交互确认gog drive bulk remove-public \ --parent 0BxxxxxFolderID \ --depth 5 \ --max 2000 \ --all-drives \ --force只处理单个文件gog drive bulk remove-public --file 1AbCdEfGhIjKlMnOpQrStUv三、gog drive bulk update-role按角色批量改权3.1 命令与专属参数gog drive (drv) bulk update-role [flags]在DriveBulkUpdateRoleCmd中除扫描相关参数--file/--parent/--depth/--max/--all-drives外还有四个专属匹配参数Flag类型默认值说明--fromstring要匹配的当前角色reader|commenter|writer必填--tostring新的角色reader|commenter|writer必填--typestring可选的权限类型过滤user|group|domain|anyone--targetstring可选的目标过滤邮箱或域名不区分大小写3.2 匹配与校验规则源码对角色参数做了严格归一化normalizeDriveBulkRole先TrimSpace 转小写只接受reader、commenter、writer三者为空时报--from is required/--to is required非法值报invalid --from (expected reader|commenter|writer)。且--from与--to相同会直接报错if from to { return usage(--from and --to must differ) }真正的匹配发生在collectDriveBulkPlans的过滤回调中三个条件同时满足才命中plans, err : collectDriveBulkPlans(ctx, svc, items, func(perm *drive.Permission) (string, bool) { if perm nil || perm.Role ! from { return , false } if typeFilter ! perm.Type ! typeFilter { return , false } if targetFilter ! !drivePermissionTargetMatches(perm, targetFilter) { return , false } return to, true })权限角色必须等于--from若指定--type权限类型必须完全一致user/group/domain/anyone若指定--target则与权限的目标做不区分大小写的比较。目标优先级为emailAddress→domain→displayName见drivePermissionTarget因此可以用--target example.com匹配某个域的所有权限也可以用--target aliceexample.com精确匹配某个用户。命中后执行Permissions.Update同样携带SupportsAllDrives(true)并请求Fields(id,role)以最小化返回数据if _, err : svc.Permissions.Update(plan.FileID, plan.PermissionID, drive.Permission{Role: plan.NewRole}). SupportsAllDrives(true). Fields(id,role). Context(ctx). Do(); err ! nil { return fmt.Errorf(update permission %s on %s: %w, plan.PermissionID, plan.FileID, err) }3.3 实战示例把整个文件夹树中所有writer降级为commentergog drive bulk update-role \ --parent 0BxxxxxFolderID \ --from writer \ --to commenter \ --dry-run仅针对某个外部域名下所有writer权限降级gog drive bulk update-role \ --parent 0BxxxxxFolderID \ --from writer \ --to commenter \ --type domain \ --target partner-corp.com \ --force仅针对某个具体用户把reader提升为commentergog drive bulk update-role \ --from reader \ --to commenter \ --type user \ --target alicepartner-corp.com单独处理一个文件gog drive bulk update-role --file 1AbCdEfGhIjKlMnOpQrStUv --from reader --to commenter四、全局 Flags所有 bulk 子命令共享以下 flags 在gog drive bulk及其子命令上均可用继承自根命令见 gog-drive-bulk.md 的 Flags 一节Flag类型默认值说明--access-tokenstring直接使用给定的访问令牌绕过已存储的 refresh token令牌约 1 小时过期-a--account--acctstring认证账户邮箱、别名或auto用于 Google API 命令--clientstringOAuth client 名称选择存储的凭据 token 桶--colorstringauto颜色输出auto|always|never--disable-commandsstring禁用的命令列表逗号分隔支持点路径-n--dry-run--dryrun--noop--previewbool不做任何修改打印计划动作并以成功退出--enable-commandsstring允许的命令前缀列表逗号分隔支持点路径用于限制 CLI--enable-commands-exactstring允许的精确命令列表逗号分隔父命令不会自动启用子命令-y--force--assume-yes--yesbool跳过破坏性命令的确认提示--gmail-no-sendboolfalse阻止 Gmail 发送操作Agent 安全选项-h--helpkong.helpFlag显示上下文相关的帮助--homestring覆盖 gogcli 的 config/data/state/cache 根目录等价于GOG_HOME-j--json--machineboolfalse向 stdout 输出 JSON最适合脚本化--no-input--non-interactive--noninteractivebool永不交互提示需要输入时直接失败适合 CI-p--plain--tsvboolfalse向 stdout 输出稳定可解析的 TSV 文本无颜色--quota-projectstring用于计费的 Google Cloud 项目以X-Goog-User-Project头发送部分 API 在--access-token或 ADC 下需要--readonlyboolfalse在运行时阻止所有修改类 API 请求auth add也只申请只读 OAuth 范围--results-onlyboolJSON 模式下只输出主结果丢弃nextPageToken等信封字段--select--pick--projectstringJSON 模式下选择逗号分隔的字段尽力而为支持点路径-v--verbosebool开启详细日志--versionkong.VersionFlag打印版本并退出--wrap-untrustedboolfalseJSON/raw 输出中将获取的文本字段包上外部不可信内容标记五、扫描边界控制--parent/--depth/--max/--all-drives两个子命令共用同一套目录树扫描能力理解这四个参数是安全使用的前提--parent扫描起点。缺省为root见driveBulkScanRequest中parent root的兜底逻辑。在 driveAuditItems 中若传入文件夹 ID会从该文件夹开始递归若指定--file则走Files.Get单文件分支不再扫描树。--depth递归最大深度默认2根算 0 层即默认最多覆盖 3 层。0表示不限制深度。--max最多扫描的条目数默认5000表示不限。这是防止误扫超大目录树的重要保险丝。--all-drives默认true即默认包含共享盘需要只看「我的云端硬盘」时显式传--no-all-drives。边界校验发生在每次执行的最前面validateDriveScanBoundsfunc validateDriveScanBounds(depth, maxItems int) error { if depth 0 { return usage(--depth must be 0) } if maxItems 0 { return usage(--max must be 0) } return nil }当扫描条目数超过--max时结果会被标记为truncated并在表格输出末尾提示Results truncated; increase --max to scan more.见writeDriveBulkResult。如果你扫描的文件没有全部覆盖到命令会明确告知不会静默遗漏。底层树遍历由listDriveTree完成对每个条目调用Permissions.List拉取权限listDrivePermissionsForAudit每页 100 条、自动翻页收集全部权限并额外请求permissionDetails(permissionType,role,inherited,inheritedFrom)用于判断权限是否继承。六、安全机制dry-run、确认、--force与--readonly批处理权限删除/改权属于高破坏性操作gogcli 为此设计了多层保护--dry-run别名--dryrun/--noop/--preview真正的零风险预览。实现位于 internal/cmd/dryrun.go它在认证、keyring 与任何 API 调用之前就提前返回并把本次操作序列化输出普通终端模式打印Dry run: would op和带缩进的 JSON 请求体--json模式输出{dry_run: true, op: ..., request: ...}--plain模式输出dry_runTABtrue、opTAB...、request_jsonTAB...的 TSV 行。注意 dry-run 的输出是「请求意图」而非真实扫描结果——只有去掉 dry-run 执行时才会真正枚举目录树与权限并生成计划。若想看到精确的待删/待改清单可以先执行一次不带 dry-run 但用--no-input之外的方式触发确认或观察输出结果。破坏性操作确认每个子命令在执行前都会调用driveBulkConfirm→confirmDestructiveChecked实现于 internal/cmd/confirm.go。没有计划时直接跳过有计划时若未带--force/--yes会交互询问确认。在 CI 或 Agent 场景下应显式传入--no-input让命令在需要输入时直接失败而非挂起。--readonly运行时拦截一切修改类 API 请求auth add也只申请只读 OAuth 范围。把它作为默认环境变量级别的保险可以杜绝任何意外写操作。继承权限不重复处理对于从上级文件夹继承来的权限计划中会标记Inherited: true执行阶段直接跳过if plan.Inherited { continue }见 drive_bulk.go避免对继承权限做无意义的原地删除/更新也避免与上级文件夹的权限处理产生冲突。七、输出格式表格 / JSON / TSV执行结束后writeDriveBulkResult根据输出模式呈现结果默认终端输出表格列头为PATH、ACTION、TYPE、ROLE、NEW_ROLE、TARGET、PERMISSION_ID路径为空时回退显示文件名若没有匹配项仅打印No matching permissions。--json/--machine输出结构化对象包含items计划数组、count条数、truncated是否因--max截断。配合--results-only可去掉信封字段适合脚本直接消费。--plain/--tsv输出与表格同构的 TSV无颜色便于awk/cut管道处理。计划数组中的每个元素对应源码driveBulkPermissionPlan包含fileId、fileName、path、permissionId、type、role、newRole仅 update-role、target邮箱/域名/显示名、inherited与actionremove或updateRole可用于审计留档。一个典型 JSON 输出的形态gog drive bulk update-role \ --parent 0BxxxxxFolderID \ --from writer --to commenter \ --json --results-only{ items: [ { fileId: 1AbCd..., fileName: Q3-report.gsheet, path: Team/Q3/report, permissionId: 0123456789, type: domain, role: writer, newRole: commenter, target: partner-corp.com, inherited: false, action: updateRole } ], count: 1, truncated: false }八、底层执行流程一览综合以上源码两个子命令的完整调用链可归纳为校验扫描边界validateDriveScanBounds非法--depth/--max直接报错构造 dry-run 请求体driveBulkScanRequest包含file_id/parent/depth/max/all_drivesupdate-role 额外带from/to/type/targetdryRunExit若带--dry-run打印意图并以退出码 0 返回全程不触碰认证与 APIrequireDriveService获取 Drive 服务与 OAuth 上下文internal/cmd/service_helpers.godriveAuditItems--file单文件直取否则从--parent默认 root递归遍历目录树受--depth/--max/--all-drives约束collectDriveBulkPlans对每个条目分页拉取全部权限每页 100按匹配回调筛选生成计划标注继承权限与目标信息driveBulkConfirm无计划直接返回有计划则走破坏性确认--force可跳过逐个执行Permissions.Deleteremove-public或Permissions.Updateupdate-role跳过继承权限失败即返回带上下文的错误writeDriveBulkResult按表格 / JSON / TSV 输出结果并报告是否因--max截断。九、最佳实践与注意事项先 dry-run再--no-input守卫CI / Agent 脚本中建议--no-input --dry-run先行确认计划后去掉 dry-run 再执行并把--no-input保留作为无法交互时直接失败的护栏。控制扫描范围对大型团队盘先指定--parent到具体子文件夹用默认--depth 2 --max 500验证行为再逐步放宽共享盘默认已纳入--all-drives默认true如需排除请显式--no-all-drives。update-role 务必校验--from/--to两者必须不同且只能是reader/commenter/writer--type与--target可组合成只动某个域的外部 writer这类精确策略避免大范围误改。保留输出用于审计执行时使用--json落盘items中每个权限的permissionId、fileId、旧角色/新角色与目标信息可作为合规留痕。与只读审计互补gog drive bulk负责执行变更而 gog-drive-audit-sharing.md 类审计命令负责发现风险建议先用审计定位高风险文件再用 bulk 收敛权限。完整的命令索引见 docs/commands/README.md父命令见 gog-drive.md。所有 flags 均来自gog schema --json自动生成运行make docs-commands可重新生成命令文档因此参数表始终与当前二进制保持一致。【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表