使用bash从github v3 api获取文件作为文本

时间:2017-11-22 11:26:54

标签: bash base64 github-api

我试图使用get contents api从我们的GitHub获取配置文件。

这将返回一个JSON,其中包含编码为base64字符串的文件内容。

我希望将其作为文字

我采取的步骤

  1. 获取初始api响应:
    curl -H 'Authorization: token MY_TOKEN' \ https://github.com/api/v3/repos/MY_OWNER/MY_REPO/contents/MY_FILE
    返回带有字段"content": "encoded content ..."

  2. 的JSON响应
  3. 获取编码后的字符串:
    添加<prev command> | grep -F "content\":"
    这会获取内容,但仍有"content":字符串,"字符和最后一个逗号

  4. 削减额外内容:
    <prev command> | cut -d ":" -f 2 | cut -d "\"" -f 2

  5. 解码:
    <prev command | base64 --decode>

  6. 最终命令:
    curl -H 'Authorization: token MY_TOKEN' \ https://github.com/api/v3/repos/MY_OWNER/MY_REPO/contents/MY_FILE | \ grep -F "content\":" | cut -d ":" -f 2 | cut -d "\"" -f 2 | base64 --decode

    的问题:

    1. 结果字符串(在base64 --decode之前)在在线解码器中解码(不太好 - >参见下一项),但未在 bash 中进行解码。答案是

        

      &#34;输入流中的字符无效。&#34;

    2. 解码online decoder中的字符串时,某些(不是全部)文件是乱码,而不是原始文本。我已经尝试了所有可用的字符集。

    3. 注意:

      1. 我尝试用sed 's/..$//'删除最后2个(换行符)字符,但这没有效果。
      2. 如果我用鼠标选择输出并将其复制粘贴到echo MY_ECODED_STRING_PASTED_HERE | base64 --decode命令,它与在线工具具有相同的效果,即它被解码为乱码。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

根据tripleee的建议,我已将提取方法切换为jq

file=randomFileName74894031264.txt

curl -H 'Authorization: token MY_TOKEN' https://github.com/api/v3/repos/MY_OWNER/MY_REPO/contents/MY_FILE > "$file"

encoded_str=($(jq -r '.content' "$file"))

echo "$encoded_str" | base64 -D
rm -f "$file"

这在从命令行运行时有效,但当作为脚本运行时,stdout不会刷新,我们只获取文件的前几行。

当我正式化通用脚本时,我会更新这个答案。