【问题标题】:base 64 decoding in shell scriptingshell脚本中的base 64解码
【发布时间】:2018-05-27 18:19:07
【问题描述】:

例如,我有一个如下文件。

A,Y29tLz9hPTQ2JmM9NDQzNzgmczE9Q0,123  
B,FJNLTA2MjQyMDE3LVAmczI9ODQ3MDA,321

我要打印field1,field2(base 64解码),field3

需要输出::

A,result of base 64 decode,123
B,result of base 64 decode,321

【问题讨论】:

  • 有人可以帮我解决这个问题吗?没有while循环请给我解决方案?
  • “没有while循环”?为什么?
  • 如果您的目标是性能——即。拥有一个 base64 解码进程,而不是每行启动一个子进程——这需要一种完全不同的方法(可能最好使用 Python 或另一种具有本机 base64 解码而不是 shell 的语言来实现)。
  • 贴出你目前尝试过的代码。此外,如果您的讲师对您如何解决此问题提出了特殊要求,请告知我们这些要求。
  • 您所要求的不能仅在 shell 中完成,实现此目的的工具因操作系统而异。包括您迄今为止的工作,我们将帮助您调试它。

标签: shell string-decoding


【解决方案1】:

您可以在 bash 脚本中使用一些 read 命令和 base64 -D 执行此操作:

#!/bin/bash

while read -r line
do
  IFS=',' read -r c1 c2 c3 <<< "$line"
  data="$(base64 -D <<< "$c2")"
  echo "$c1,$data,$c3"
done < "inputfile.txt"

您的一个 base64 字符串中包含二进制数据,因此由于控制字符,输出可能看起来很时髦。

A,com/?a=46&c=44378&s1=,123
���KL
  �
�,321T  �̏N

【讨论】:

  • 在 OP 的第一条评论中注意“没有 while 循环”。
  • 顺便说一句,就个人而言,我会使用 IFS=, read -r first data rest 而不是 read -a - 使用代码,如果它们存在,你将丢弃第四列,而如果你不这样做使用read -a 它只会将所有剩余的列放入最后一列。
  • 我还建议用data=$(base64 -D &lt;&lt;&lt;"${parts[1]}") 代替管道——heredocs 也不是免费的,但它们通常比运行echo 的子shell 中的FIFO 便宜。跨度>
【解决方案2】:

试试这个 awk 单行代码:

awk -F',' -v OFS=',' '"echo "$2" | base64" | getline $2' file

用你的例子测试:

kent$  cat f
A,Y29tLz9hPTQ2JmM9NDQzNzgmczE9Q0,123  
B,FJNLTA2MjQyMDE3LVAmczI9ODQ3MDA,321

kent$  awk -F',' -v OFS=',' '"echo "$2" | base64" | getline $2' f
A,WTI5dEx6OWhQVFEySm1NOU5EUXpOemdtY3pFOVEwCg==,123  
B,RkpOTFRBMk1qUXlNREUzTFZBbWN6STlPRFEzTURBCg==,321

【讨论】:

  • 嗯。它当然符合“没有while循环”的文本,但绝对违反了精神(因为它每行输入运行一个单独的base64命令)。
  • ...如果我们用$(touch /tmp/i-am-evil) 代替base64 编码的数据,我们很容易受到shell 注入攻击。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多