如何不屏蔽 GitHub Actions 中的输出?

2023-12-02

作为 GitHub Actions 中 PowerShell 脚本的一部分,我尝试输出一个 json 对象列表,以便稍后作为另一个作业的矩阵重新使用。使用以下命令我将编写输出:

Write-Host "::set-output name=value::$( $array1 | ConvertTo-JSON -Compress)"

变量 $array1(JSON 转换)的输出应如下所示:

[ 
  {
    "variable1": "hello1"
  },
  {
    "variable1": "hello2"
  }
]

然而,大括号被屏蔽,因此输出如下所示:

[ 
  ***
    "variable1": "hello1"
  ***,
  ***
    "variable1": "hello2"
  ***
]

此外,当简单地回显 JSON 转换的 $array1 时,上述问题出现在 GitHub Actions 中。 有什么办法可以克服大括号的屏蔽吗?当本地使用 PowerShell 时,列表输出完全正常 - 仅在 GitHub Actions 中此问题仍然存在。

$array1 是这样创建的:

$array1 = $()
foreach ($var in $vars) {
   # Do some stuff to get to output for each var
   $output = dostuff($var)
   $array1 += @(@{"variable1" = $output})

}

tl;dr- 要停止屏蔽,您需要停止引用任何等于值的操作秘密{ and }.

长版

如果您首先创建两个,我可以使用此 GitHub Actions 工作流程文件重现该行为行动的秘密属于您的工作流程范围(即在存储库或组织级别):

行动的秘密

Secret Name Value
LEFT_CURLY {
RIGHT_CURLY }

myWorkflow.yaml

有趣的是activate-masking step...

name: myWorkflow

on:
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - id: define-output
        name: define output
        shell: pwsh
        run: |
          $array1 = @(
            [pscustomobject] @{
              "variable1" = "hello1"
            },
            [pscustomobject] @{
              "variable1" = "hello2"
            }
          );
          write-host "::set-output name=myjson::$( $array1 | ConvertTo-JSON -Compress)"

      - id: activate-masking
        name: activate masking
        shell: pwsh
        run: |
          # referencing a secret anywhere in a step activates
          # log masking for its value in the *entire* workflow
          write-host "left = '${{ secrets.LEFT_CURLY}}'"
          write-host "right = '${{ secrets.RIGHT_CURLY }}'"

      - id: consume-output
        name: consume output
        shell: pwsh
        run: |

          # decode and re-encode the data to remove "compressed"
          # output format as noted by @mklement0 in comments
          $json = '${{ steps.define-output.outputs.myjson }}'
          $data = $json | ConvertFrom-Json

          # write the json to the log output. if masking is activate
          # then any secrets in the output will be masked with "***"
          write-host ($data| ConvertTo-Json)

          # encode the json so it bypasses masking and we can get the true
          # value contained in the variable
          write-host "base64 = '$([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($json)))'"

“消耗输出”步骤的输出如下:

[v] consume output
 1  Run write-host "left = '***'"
 9  left = '***'
10  right = '***'
11  [
12    ***
13     "variable1": "hello1"
14    ***,
15    ***
16     "variable1": "hello2"
17    ***
18  ]
19  base64 = 'W3sidmFyaWFibGUxIjoiaGVsbG8xIn0seyJ2YXJpYWJsZTEiOiJoZWxsbzIifV0='

请注意,***掩蔽是添加到仅日志文件,而不是变量值本身。如果您解码 Base64 字符串,您最终会得到:

[{"variable1":"hello1"},{"variable1":"hello2"}]

所以你可以看到变量的值符合预期。

另请注意,仅当秘密存在时才会发生屏蔽引用的在一个步骤中 - 例如,如果您从activate-masking步骤它将停止屏蔽值,即使工作流范围中仍然定义了 Secrets:

# remove these lines to stop masking their values
# write-host "left = '${{ secrets.LEFT_CURLY}}'"
# write-host "right = '${{ secrets.RIGHT_CURLY }}'"

要停止屏蔽,您需要停止引用任何等于值的操作秘密{ and }.


奖金回合

请注意,由于恶意输入,我的操作中存在一个针对特制 json 值的注入漏洞 - 例如,如果我可以somehow使 json 中的 variable1 的值最终成为这个神秘的字符串(例如,通过将其作为用户输入提供给您):

}]';write-host aaa;$y='

那么上面的 Action 将执行这个 PowerShell:

$json = '[{"variable1":"}]';write-host aaa;$y='}]'

这相当于

$json = '[{"variable1":"}]';
write-host aaa;
$y='}]'

它实际上会执行write-host aaa;作为命令而不是将其视为输入数据。

为了避免这种情况,你might想要考虑将输出作为 base64 编码的字符串传递 - 例如

- id: define-output
  ...
  $base64 = [System.Convert]::ToBase64String(
    [System.Text.Encoding]::UTF8.GetBytes(
      ($array1 | ConvertTo-JSON -Compress)
    )
  )
  write-host "::set-output name=myjson::$base64"

- id: consume-output
  ...
  $base64 = '${{ steps.define-output.outputs.myjson }}'
  $json = [System.Text.Encoding]::UTF8.GetString(
    [System.Convert]::FromBase64String(
      $base64
    )
  )

这样,您的 json 数据就不会无意中提升为作为代码执行...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何不屏蔽 GitHub Actions 中的输出? 的相关文章

  • PowerShell 中的 ProcessStartInfo 和进程 - 身份验证错误

    我有使用 ProcessStartInfo 和 Process 调用另一个脚本并返回该脚本的输出的代码 不幸的是 我遇到了错误 并且不确定如何解决这些问题 script1 ps1 abc args startInfo NULL proces
  • Powershell:获取 FQDN 主机名

    我想通过 powershell 脚本检索 Windows 服务器的 FQDN 名称 到目前为止我已经找到了2个解决方案 server Invoke Command ScriptBlock hostname 上面的行将仅打印服务器的短名称 s
  • 使用 WebClient 在 PowerShell 脚本中将 FTP 从二进制更改为 ascii

    简单的 PowerShell 脚本 它可以毫无问题地下载文件 二进制 我需要它的ascii 格式 File c temp ftpfile txt ftp ftp myusername email protected cdn cgi l em
  • PowerShell从csv中提取特定列并将其存储在变量中

    我的keys csv文件看起来像这样 PrjKey BldKey key LS LOOKUPSNAP1 LS LOOKUPSNAP1 LS LSUH3 LS LSUH3 LSPERF LPMDS0 LSPERF LPMDS0 LSPERF
  • Powershell删除文件夹-force

    我似乎无法删除文件 文件夹 除非我必须为所有文件 文件夹输入 A 我缺少什么 Get Childitem C Users AppData Local Temp ErrorAction SilentlyContinue Where Creat
  • 如何在 PowerShell 中处理命令行参数

    处理命令行参数的 最佳 方法是什么 似乎有几个关于 最佳 方法是什么的答案 因此我陷入了如何处理像这样简单的事情上 script ps1 n name d domain AND script ps1 d domain n name 有没有一
  • 阻止单引号在 WMI 查询 powershell 中转义字符串

    我有一些使用 WMI 查询的代码 但我遇到了一个问题 我使用的变量有一个 单引号 这会导致代码出现故障 这是一个例子 path SERVER1 Mike O Leary servername path Split 2 Split 0 sha
  • cmd中哪个符号是转义符?

    我有这个代码 powershell command New Object Net WebClient DownloadFile linkToMyFile file C my file 它用于下载文件 当我在远程服务器上的 cmd 中执行它时
  • Invoke-WebRequest SSL 失败?

    当我尝试使用时Invoke WebRequest我收到一些奇怪的错误 Invoke WebRequest Uri https idp safenames com Invoke WebRequest The underlying connec
  • 无法使用 Windows 窗体中的内容处理 powershell 功能

    function CalendarShare Add MailboxFolderPermission Identity FromUser Text AccessRights Editor User ToUser Text 当程序运行时 它会
  • 如何在Powershell控制台中分配多行字符串

    当我在 powershell 控制台中输入此内容时 test Test Test 并且输入多次 它会一直打印 gt gt 所以我永远无法完成命令 该怎么办 应该是行中的第一件事 或者它被认为只是字符串的一部分 test Test Test
  • 使用 shell_exec 将 PHP 转换为 Powershell

    如果我运行 output shell exec powershell get service dhcp 我得到了 dhcp 服务的完美输出 显示正在运行 但如果我运行 output shell exec powershell get use
  • 通过快捷方式更改桌面的 Powershell 脚本

    关于为什么从 w in PS 运行时有效 但从定义为以下的快捷方式运行时无效的任何想法和建议 SystemRoot system32 WindowsPowerShell v1 0 powershell exe File C Users bi
  • 将服务器添加到 SQL Management Studio

    我想将不同服务器上的一堆 SQL 2000 2005 的混合 服务器实例添加到我的 SSMS SQL Managment Studio 注册服务器 我正在遵循本教程here http sev17 com 2008 12 registerin
  • 隐藏powershell输出

    我有以下脚本 param 参数 强制 true 字符串 dest New Item force path dest 1 itemtype directory New Item force path dest 2 itemtype direc
  • 禁止非 PowerShell 命令的输出?

    我正在运行命令 hg st 然后检查它是 LASTEXITCODE检查当前目录中 Mercurial 的可用性 我不关心它的输出 也不想将它展示给我的用户 如何抑制所有输出 成功或错误 由于 Mercurial 不是 PowerShell
  • 如何在 PowerShell 中将长命令拆分为多行

    如何在 PowerShell 中获取如下所示的命令并将其拆分为多行 C Program Files IIS Microsoft Web Deploy msdeploy exe verb sync source contentPath c w
  • () 和 $() 之间的区别[重复]

    这个问题在这里已经有答案了 有什么区别 Write Host Get Date just paren and Write Host Get Date dollar paren 括号内的内容可以是任何内容 仅举一个简单的示例 两者有什么区别吗
  • Invoke-Sqlcmd 运行脚本两次

    我遇到了一个非常奇怪的问题并且可以重复 基本上 我使用invoke sqlcmd通过使用 inputfile来调用脚本文件 但是如果脚本文件存在一些执行错误 例如插入到列不应为空的表中 则脚本文件将被执行两次 我也可以从探查器中看到这两个执
  • 全局变量用例

    我有几个脚本和模块 它们使用全局变量来完成很多事情 我的日志记录可以采用以下三种形式之一 简洁 详细和验证 没有实际操作的详细日志记录 仅验证提供的数据 我还有许多函数 它们根据运行的上下文 用户或机器 而做出不同的响应 并且正在执行的操作

随机推荐

  • 生成 [-1, 1] 范围内的随机数数组

    我正在尝试在 Fortran 中的 2D 数组中生成 1 1 范围内的随机数 我知道为了生成 1 和 1 范围内的随机数 我必须将数字重新调整为 0 2 但我不知道如何填充矩阵x 10 10 with randomReal 这是代码 pro
  • InstallShield 限量版支持 64 位安装程序吗?

    我刚刚开始学习 InstallShield LE 因为它似乎是唯一 官方 支持的安装程序项目 但我有一个简单的问题 我什至无法得到绝对的答案 ISLE 是否支持构建 64 位安装程序 我之所以这么问 是因为我发现至少有两篇文章说这是不可能的
  • 如何将两个不同Spout的输出发送到同一个Bolt?

    我有两个 Kafka Spout 我想将它们的值发送到同一个 Bolt 是否可以 对的 这是可能的 TopologyBuilder b new TopologyBuilder b setSpout topic 1 new KafkaSpou
  • 使用 PHP 以非 ASCII 字符输出日期

    我正在尝试以繁体中文输出日期 我将日期作为 Unix 时间戳 例如 1467244800 我正在做以下事情 我得到的输出是 Unicode 未定义 字符 30 2016 17 T 2016 18 Q G 2015 谁能告诉我我做错了什么 我
  • 使用端口 443 连接到 Heroku

    我是一名大学生 除了80 443之外的所有端口都被封锁 我可以通过以下方式连接到 github Host github com Hostname ssh github com Port 443 git push heroku master给
  • Eclipse 关闭钩子能够停止终止

    我正在开发一个插件 该插件执行外部工具 如果用户在进程正在运行时尝试退出 Eclipse 我必须提供一个确认对话框 有正在运行的进程 你真的想退出吗 如果用户点击No Eclipse 可能不会终止 我刚刚发现 如何挂钩退出命令来清理思考 该
  • Outlook 中 html 电子邮件的显示错误

    我使用以下代码创建了一封 html 电子邮件 div style background color orange max width 600px height 180px margin left auto margin right auto
  • Google Sheet Api get 函数在 nodejs 中返回未定义的值

    function changeData auth sheetId var sheets google sheets v4 sheets spreadsheets values update auth auth spreadsheetId s
  • 增量压缩和一次性压缩有什么区别?

    我正在尝试使用bz2 and or lzmapython 中的包 我正在尝试以 csv 格式压缩数据库转储 然后将其放入zip文件 我让它与这两个包一起使用一次性压缩 其代码如下所示 with ZipFile something zip w
  • 如何使用R中的Leaflet用一条线连接两个坐标

    我正在尝试使用 R 中的 Leaflet 包来绘制放大器并根据下表中的纬度和经度信息连接标记 Observation InitialLat InitialLong NewLat NewLong A 62 469722 6 187194 51
  • D3 Topojson 圆,半径以英里为单位

    假设现有投影 topojson 我想做的是在半径 r 以英里为单位的点 long lat 处创建一个圆 我知道有一个 d3 geo 函数可以实现此目的 但经过一番考虑后 我认为它与我的特定应用程序不太兼容 所以现在我正在寻找使用原生 svg
  • ios - 以编程方式将 .m4a 转换为 .mp3 文件

    这里我有m4a格式的音频 我需要转换成mp3格式 为此 我使用的代码为 void toMp3 NSString m4aFilePath pathToSave NSString mp3FileName NSString stringWithF
  • 从我的 Android 应用程序调用 Google Pay Intent 时出现错误“您已超出银行设置的最大交易金额”

    我在 Android 应用程序中遇到 Google Pay 集成 应用内支付 问题 当我提出交易请求时 我收到错误 您已超出银行设置的最大交易金额 即使这是我的第一笔交易 当我尝试直接从 Google Pay 发送金额时 它起作用了 Thi
  • 监控和维护应用程序在光盘上的大小的解决方案

    我正在构建一个广泛使用 CoreData 的应用程序 并且我的许多模型都具有 UIImage 和 NSData 属性 用于图像和视频 由于将数据直接存储到 CoreData 中并不是一个好主意 因此我构建了一个文件管理器类 该类根据创建的上
  • RapidXML 给出空的 CDATA 节点

    我编写了下面的代码来获取 CDATA 节点值 我得到了节点的名称 但值是空白的 我将解析标志更改为 parse full 但它也不起作用 如果我从 XML 中手动删除 它会给出预期的值 但在解析之前删除它不是一个选项 代码 include
  • Promises - 在 Promise.all 中捕获所有拒绝[重复]

    这个问题在这里已经有答案了 我有这个虚拟代码 var Promise require bluebird function rej1 return new Promise reject new Error rej1 function rej2
  • Bootstrap 导航栏在滚动时折叠

    我在我的项目中使用引导灰度主题 它有一个在滚动时折叠的导航栏 或者如果我转到同一页面上的链接 download 等 问题是当我从其他页面转到锚链接时 导航栏在滚动之前不会折叠 我想解决方案是在java脚本中添加该行 但我真的不知道要添加什么
  • 如何解决OSError:[WinError 2]不可能找到指定文件:'c:\\ python39 \\ Scripts \\ chardetect.exe'

    正如标题中所述 每次我尝试通过 pip 安装某些内容时 在安装结束时都会出现错误 WARNING Failed to write executable trying to use deleteme logic Rolling back un
  • 如何获取JRadioButton的文本值

    我正在用java创建一个项目 我的程序有 80 个 JRadioButtons 我需要获取它们的文本值 现在这些单选按钮已添加到 ButtonGroup 每个单选按钮有 4 个单选按钮 我知道如何通过以下代码从单选按钮获取文本值 radio
  • 如何不屏蔽 GitHub Actions 中的输出?

    作为 GitHub Actions 中 PowerShell 脚本的一部分 我尝试输出一个 json 对象列表 以便稍后作为另一个作业的矩阵重新使用 使用以下命令我将编写输出 Write Host set output name value