用shell解密base64加密的文本的例子

发布时间:2019-10-17编辑:脚本学堂
需求:把一个用base64 加密的文本解密出来。文本如下面所示,我截取了其中的一小部分出来:

需求:把一个用base64 加密的文本解密出来。文本如下面所示,我截取了其中的一小部分出来:
2|数据库概要|c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBO
YW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZSIsIA0KICAgICAgIGMuaW5zdGFu
Y2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RS
SUNURUQnLCdZRVMnLCdOTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUg
ICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsIHYk
aW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUl
Jzs=|0||0||1|1||
3|参数文件(是spfile还是pfile)|c2VsZWN0IG52bCh2YWx1ZSwncGZpbGUnKSAiUGFyYW1ldGVyX0ZpbGUiIA0KZnJvbSB2JHBhcmFt
ZXRlciB3aGVyZSBOYW1lPSdzcGZpbGUnOw==|0||0||1|1||
4|非默认的参数|c2VsZWN0IG5hbWUsIHJ0cmltKHZhbHVlKSAicHZhbHVlIiANCmZyb20gdiRwYXJhbWV0ZXIgIA0K
d2hlcmUgaXNkZWZhdWx0ID0gJ0ZBTFNFJyANCm9yZGVyIGJ5IG5hbWU7|0||0||1|1||
5|控制文件及其状态|c2VsZWN0IE5hbWUsU3RhdHVzIGZyb20gdiRjb250cm9sZmlsZTs=|0||0||1|1||

观察以上文本,我们首先需要把这个文本的一些行给合并掉,就是每行都是应该以数字打头,例如: 2|数据库概要|c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KIC,这种形式,然后再抽取每行中那个加密了的域。而现在的文本中,大多数行都不是这种形式,这就需要把不是这种形式行往上合并,合成一个完整的行。

下面是我写的合并行的脚本
 

复制代码 代码如下:
#! /bin/bash
#FILE=/root/test.txt
NEWFILE=/root/script/newfile
TEMPFILE=/root/script/temp
LINENUM=`wc -l $NEWFILE | linuxjishu/13830.html target=_blank class=infotextkey>awk '{ print $1 }'`
LINE1=1
while read LINE
do
echo $LINE1 | grep '^[0-9]{1,}|'
FLAG1=$?
echo $LINE | grep '^[0-9]{1,}|'
FLAG2=$?
if [ $FLAG1 -eq 0 ]
then
if [ $FLAG2 -eq 0 ]
then
echo $LINE1 >> $NEWFILE
else
echo -n $LINE1 >> $NEWFILE
fi
else
if [ $FLAG2 -eq 0 ]
then
echo $LINE1 >> $NEWFILE
else
echo -n $LINE1 >> $NEWFILE
fi
fi
LINE1=$LINE
done < $TEMPFILE

其中 TEMOFILE  既要处理的文本,NEWFILE 为处理以后的文本,此脚本运行原理就是每次截取一行,判断这一行的前一行的开头是不是以数字打头,数字后面是‘|’,如果是就是换行输入到NEWFILE,如果不是,就接着输入到上一行的末尾。

处理过后的文本如下:
2|数据库概要|c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBO^MYW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZ
SIsIA0KICAgICAgIGMuaW5zdGFu^MY2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RS^MSUNURUQnLCdZRVMnLCd
OTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUg^MICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsI
HYk^MaW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUl^MJzs=|0||0||1|1||
3|参数文件(是spfile还是pfile)|c2VsZWN0IG52bCh2YWx1ZSwncGZpbGUnKSAiUGFyYW1ldGVyX0ZpbGUiIA0KZnJvbSB2JHBhcmFt^MZXRlciB3aGVyZSBOYW1lPSdzcGZpbGUnOw==|0||0||1|1||
4|非默认的参数|c2VsZWN0IG5hbWUsIHJ0cmltKHZhbHVlKSAicHZhbHVlIiANCmZyb20gdiRwYXJhbWV0ZXIgIA0K^Md2hlcmUgaXNkZWZhdWx0ID0gJ0ZBTFNFJyANCm9y
ZGVyIGJ5IG5hbWU7|0||0||1|1||

可以看出需要合并的行已经给合并了!

一下步,就是要提取需要加密的域, 命令如下:
Awk –F’|’ ‘{print $3}’ NEWFILE >> file1  把域3输入到file1:

截取了file1 文件的第一行:
c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBO^MYW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgT
mFtZSIsIA0KICAgICAgIGMuaW5zdGFu^MY2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RS^MSUNURUQnL
CdZRVMnLCdOTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUg^MICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgY
SwgdiR2ZXJzaW9uIGIsIHYk^MaW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUl^MJzs=

这个就是加了base64密的字符,现在我们还不能直接把base64 来解密,因为文本字符中有大量 ^M ,我们需要把^M  去掉,
命令如下:cat –v file1 | sed  ‘s/^M//g’ >> file2

截取了file2文件的第一行:
c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBOYW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZSIsIA0KI
CAgICAgIGMuaW5zdGFuY2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RSSUNURUQnLCdZRVMnLCdOTycpICJSZX
N0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUgICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsIHYkaW5zdGFuY2
UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUlJzs=

可以发现^M 已经被处理掉了。

做完了前期准备工作,现在就可以开始解密了:
 

复制代码 代码如下:
#!/ bin/bash
CURRPATH=/root/script
while read LINE
do
echo $LINE | base64 -d >> $CURRPATH/sql.sql
echo >> $CURRPATH/sql.sql
echo >> $CURRPATH/sql.sql
done < /root/script/file2

解密出来的语句就是(截取了解密出来的文件第一条语句):
 

复制代码 代码如下:
select a.name "DB Name",
   e.global_name "Global Name",
   c.host_name "Host Name",
   c.instance_name "Instance Name" ,
   DECODE(c.logins,'RESTRICTED','YES','NO') "Restricted Mode",
   a.log_mode "Archive Log Mode"
FROM v$database a, v$version b, v$instance c,global_name e
WHERE b.banner LIKE '%Oracle%';

总结:以上主要是应用shell 对文本的处理,在处理的过程中也走了不少弯路,尤其是在合并行时,但最终还是把文本给处理好了。