分享一段Shell和Python脚本解析VPN Profile for iOS/Android设备的代码

废话就不说了,直接上代码

Shell和Python脚本解析VPN Profile for iOS设备

 代码如下 复制代码
#!/bin/bash

httpserver="http://10.226.200.96/"
vpnprofilename="vpn.mobileconfig"

if [ ! -d "/tmp/vpn" ]; then
mkdir /tmp/vpn
fi
cp ../tms_rest/$vpnprofilename /tmp/vpn
cp ../tms_rest/get_pwd_plist.py /tmp/vpn
cd /tmp/vpn

if [ ! -f $vpnprofilename ]; then
wget $httpserver$vpnprofilename -o log
fi

#openssl smime -verify -noverify -nochain -inform DER -in $vpnprofilename | grep verification
python get_pwd_plist.py $vpnprofilename
sed -i 's/^[ \t]*//g' user.p12
base64 -d user.p12 > user.p126
openssl pkcs12 -in user.p126 -out user.cert -passin file:passin -nodes
#openssl pkcs12 -in user.p12 -out user.cert -passin file:passin -nodes
openssl x509 -in pem -in user.cert -noout -text | tr -d ' ' | grep "Username:" | sed 's/;/\n/g'
cat pacfile
echo ''
cat removeoption
echo ''

#cat vpnexception

--------------------------------------------------------------------------------------

get_pwd_plist.py

import plistlib
import sys
from xml.etree import ElementTree

def save_file(filename, content):
if filename and content:
fd = open(filename, 'w')
fd.write(content)
fd.close()

class ParsePayloadFile(object):
def __init__(self):
#self.payloadfile_name = 'vpn.mobileconfig'
self.payloadfile_name = sys.argv[1]
self.pacfile_name = 'pacfile'
self.passinfile_name = 'passin'
self.p12file_name ='user.p12'
self.removeoption_name = 'removeoption'
self.vpnexception_name = 'vpnexception'

def __del__(self):
pass

def get_child_node(self, node, child_node_name):
node_childs = node.getchildren()
for child in node_childs:
if child.text == child_node_name:
return child
return None

def get_next_node(self, node, child_node_name):
node_childs = node.getchildren()
next_node = False
for child in node_childs:
if next_node:
return child
elif child.text == child_node_name:
next_node = True
return None

def parse_payloadfile_xml(self):
result=ElementTree.parse(self.payloadfile_name)
node_root=result.getroot()
node_dict=node_root.getchildren()[0]
#print node_dict
node_payloads_val = self.get_next_node(node_dict, 'PayloadContent')
self.node_vpn = node_payloads_val.getchildren()[0]
node_pro_val = self.get_next_node(self.node_vpn, 'Proxies')
node_pro_url_val = self.get_next_node(node_pro_val, 'ProxyAutoConfigURLString')
save_file(self.pacfile_name,node_pro_url_val.text)
#print node_pro_url_val.text

'''node_ipsec_val = self.get_next_node(self.node_vpn, 'IPSec')
node_ipsec_ondemandrules_val = self.get_next_node(node_ipsec_val, 'OnDemandRules')
ondemandrules_dict = node_ipsec_ondemandrules_val.getchildren()[3]
node_ActionParameters_val = self.get_next_node(ondemandrules_dict, 'ActionParameters')
vpn_exception_list = '-' * 40 + '\n'
vpn_exception_list += 'OnDemandRules:\n'
dict_Domains = node_ActionParameters_val.getchildren()[0]
node_domains_val = self.get_next_node(dict_Domains, 'Domains')
for item in node_domains_val:
vpn_exception_list += item.text + '\n'
node_domainsaction_val = self.get_next_node(dict_Domains, 'DomainAction')
DomainAction = "DomainAction : %s" % node_domainsaction_val.text
vpn_exception_list += DomainAction + '\n'

node_ipsec_exception_val = self.get_next_node(node_ipsec_val, 'OnDemandMatchDomainsNever')
vpn_exception_list += '-' * 20 + '\n'
vpn_exception_list += 'OnDemandMatchDomainsNever:\n'
for item in node_ipsec_exception_val:
vpn_exception_list += item.text + '\n'
save_file(self.vpnexception_name, vpn_exception_list)'''

node_py4 = node_payloads_val.getchildren()[4]
node_py4_pw = self.get_next_node(node_py4, 'Password')
save_file(self.passinfile_name, node_py4_pw.text)
#print node_py4_pw.text

node_py4_pc = self.get_next_node(node_py4, 'PayloadContent')
#print node_py4_pc.text
save_file(self.p12file_name, node_py4_pc.text)

node_vpntag = self.get_next_node(node_dict,'PayloadRemovalDisallowed')
remove_vpn_profile="PayloadRemovalDisallowed:%s" % node_vpntag.tag
save_file(self.removeoption_name, remove_vpn_profile)

def parse_payloadfile(self):
fd = open(self.payloadfile_name, 'r')
#fd = open(sys.argv[1], "r")
text = fd.readlines()
fd.close()

content = ''
for item in text:
if item.find('<?xml') >= 0:
start_pos = item.find('<?xml')
end_pos = item.find('?>') + 3
content = item[start_pos:end_pos]
continue

if item.find('</plist>') == -1:
content = content + item
else:
content = content + item
break
# save_file('content.txt', content)
# print content
if content:
pl = plistlib.readPlistFromString(content)
if pl:
#print pl
#print pl['PayloadRemovalDisallowed']
remove_vpn_profile = "PayloadRemovalDisallowed:%s" % pl['PayloadRemovalDisallowed']
save_file(self.removeoption_name, remove_vpn_profile)

pl_content = pl['PayloadContent']
for item in pl_content:
#print item
if item.has_key('Proxies'):
save_file(self.pacfile_name, item['Proxies']['ProxyAutoConfigURLString'])
if item.has_key('Password'):
save_file(self.passinfile_name, item['Password'])
#save_file('user.b64', item['PayloadContent'].data)
save_file(self.p12file_name, item['PayloadContent'].data)

if __name__ == '__main__':
pp = ParsePayloadFile()
pp.parse_payloadfile_xml()

Shell和Python脚本解析VPN Profile for Android设备

 代码如下 复制代码
#!/bin/bash

httpserver="http://10.226.200.96/"
vpnprofilename="vpn_ard.mobileconfig"

if [ ! -d "/tmp/vpn" ]; then
mkdir /tmp/vpn
fi
cp ../tms_rest/$vpnprofilename /tmp/vpn
cp ../tms_rest/get_ard_vpnprofile.py /tmp/vpn
cd /tmp/vpn

if [ ! -f $vpnprofilename ]; then
wget $httpserver$vpnprofilename -o log
fi

python get_ard_vpnprofile.py $vpnprofilename
cat ard_vpn | tr -d ' ' | grep "Username:" | sed 's/;/\n/g'
cat pacfile

echo ''

--------------------------------------------------------------------------------------------------------------------------------

get_ard_vpnprofile.py

import plistlib
import sys
from xml.etree import ElementTree

def save_file(filename, content):
if filename and content:
fd = open(filename, 'w')
fd.write(content)
fd.close()

class ParsePayloadFile(object):
def __init__(self):
#self.payloadfile_name = 'vpn.mobileconfig'
self.payloadfile_name = sys.argv[1]
self.pacfile_name = 'pacfile'
self.passinfile_name = 'passin'
self.p12file_name ='user.p12'
self.removeoption_name = 'removeoption'
self.ard_vpnprofile = 'ard_vpn'

def __del__(self):
pass

def get_child_node(self, node, child_node_name):
node_childs = node.getchildren()
for child in node_childs:
if child.text == child_node_name:
return child
return None

def get_next_node(self, node, child_node_name):
node_childs = node.getchildren()
next_node = False
for child in node_childs:
if next_node:
return child
elif child.text == child_node_name:
next_node = True
return None

def parse_payloadfile_ard(self):
et = ElementTree.parse(self.payloadfile_name)
root = et.getroot()
nodes = root.getchildren()
for node in nodes:
key = node.get('key')
if key == 'com.websense.android.wms.extra.PROXY_PAC_FILE_URL':
save_file(self.pacfile_name, node.get('value'))
elif key == 'com.websense.android.wms.extra.PROXY_AUTH_STRING':
save_file(self.ard_vpnprofile, node.get('value'))

def parse_payloadfile_xml(self):
result=ElementTree.parse(self.payloadfile_name)
node_root=result.getroot()
node_dict=node_root.getchildren()[0]
#print node_dict
node_payloads_val = self.get_next_node(node_dict, 'PayloadContent')
self.node_vpn = node_payloads_val.getchildren()[0]
node_pro_val = self.get_next_node(self.node_vpn, 'Proxies')
node_pro_url_val = self.get_next_node(node_pro_val, 'ProxyAutoConfigURLString')
save_file(self.pacfile_name,node_pro_url_val.text)
#print node_pro_url_val.text

node_py4 = node_payloads_val.getchildren()[4]
node_py4_pw = self.get_next_node(node_py4, 'Password')
save_file(self.passinfile_name, node_py4_pw.text)
#print node_py4_pw.text

node_py4_pc = self.get_next_node(node_py4, 'PayloadContent')
#print node_py4_pc.text
save_file(self.p12file_name, node_py4_pc.text)

node_vpntag = self.get_next_node(node_dict,'PayloadRemovalDisallowed')
remove_vpn_profile="PayloadRemovalDisallowed:%s" % node_vpntag.tag
save_file(self.removeoption_name, remove_vpn_profile)

def parse_payloadfile(self):
fd = open(self.payloadfile_name, 'r')
#fd = open(sys.argv[1], "r")
text = fd.readlines()
fd.close()

content = ''
for item in text:
if item.find('<?xml') >= 0:
start_pos = item.find('<?xml')
end_pos = item.find('?>') + 3
content = item[start_pos:end_pos]
continue

if item.find('</plist>') == -1:
content = content + item
else:
content = content + item
break
# save_file('content.txt', content)
# print content
if content:
pl = plistlib.readPlistFromString(content)
if pl:
#print pl
#print pl['PayloadRemovalDisallowed']
remove_vpn_profile = "PayloadRemovalDisallowed:%s" % pl['PayloadRemovalDisallowed']
save_file(self.removeoption_name, remove_vpn_profile)

pl_content = pl['PayloadContent']
for item in pl_content:
#print item
if item.has_key('Proxies'):
save_file(self.pacfile_name, item['Proxies']['ProxyAutoConfigURLString'])
if item.has_key('Password'):
save_file(self.passinfile_name, item['Password'])
#save_file('user.b64', item['PayloadContent'].data)
save_file(self.p12file_name, item['PayloadContent'].data)

if __name__ == '__main__':
pp = ParsePayloadFile()
pp.parse_payloadfile_ard()

时间: 2024-09-16 09:03:32

分享一段Shell和Python脚本解析VPN Profile for iOS/Android设备的代码的相关文章

Linux集群和自动化维2.6 生产环境下的Shell和Python脚本分类

2.6 生产环境下的Shell和Python脚本分类 生产环境下的Shell和Python脚本的作用还是挺多的,这里根据2.1节所介绍的日常工作中Shell脚本的作用,将生产环境下的Shell脚本分为备份类.监控类.统计类.运维开发类和自动化运维类.前面3类从字面意义上看比较容易理解,后面的两类需要稍微解释一下,运维开发类脚本是利用Shell或Python实现一些非系统类的管理工作,比如SVN的发布程序等:而自动化运维类脚本则是利用Shell或Python来自动替我们做一些烦琐的工作,比如自动生

通过shell、python脚本管理 kvm 虚拟机

一个想法: 1 python2.7 2 python的web框架 bottle 3 shell脚本管理kvm 组合在一起就可以了~ 这段时间我会用bottle 简单的实现管理kvm 主机,开源出去的~ 性能烂的话,别怪我~ 管理kvm主机完全可以在页面上完成,国外有个人用django写了这套程序,感觉还不错,只是稍复杂,bug有点多....  个人觉得 自己开写一套简单的,python本身有kvm的库,大家要是觉得麻烦的话,也可以用os模块,调用virsh的命令来管理kvm主机,这完全是可行的~

python脚本实现集群检测和管理

场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是30台左右吧),由于管理较为混乱导致了哪台机器有人用.哪台机器没人用都不清楚,从而产生了一个想法--利用一台机器来管理所有的机器,记录设备责任人.设备使用状态等等信息....那么,为什么选择python,python足够简单并且拥有丰富的第三方库的支持. 最初的想法 由于刚参加工作不久,对这些东西也都没有接触过,轮岗到某个部门需要做出点东西来(项目是什么还没情况,就要做出东西来,没办法硬着头皮想点子吧)... 本想做一个简单点的自动

Python脚本实现集群检测和管理功能_python

场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是30台左右吧),由于管理较为混乱导致了哪台机器有人用.哪台机器没人用都不清楚,从而产生了一个想法--利用一台机器来管理所有的机器,记录设备责任人.设备使用状态等等信息....那么,为什么选择python,python足够简单并且拥有丰富的第三方库的支持. 最初的想法 由于刚参加工作不久,对这些东西也都没有接触过,轮岗到某个部门需要做出点东西来(项目是什么还没情况,就要做出东西来,没办法硬着头皮想点子吧)... 本想做一个简单点的自动

Shell和Python学习教程总结

博友们好,由于运维相关技术不断发展,个人能力也不断提高,渐渐积累的经验不能及时更新到以往的博文中.因此,为了更好的帮助大家学习运维技术,特地针对Shell和Python脚本语言总结了文档,此文档会不定期修改或增加知识点,为了能让你及时下载最新的文档,请点击GitHub收藏或请加QQ技术群:323779636(Shell/Python运维开发群),里面有更多的学习资料和定期的分享课,希望我们能一起学习,一起进步,一起走上人生巅峰!哈哈~ <<Shell从入门到精通>>和<<

编写Python脚本来获取mp3文件tag信息的教程

  这篇文章主要介绍了编写Python脚本来获取mp3文件tag信息的教程,代码基于Python2.x,文中的注释很详细,需要的朋友可以参考下 下面利用一个python的实例程序,来学习python.这个程序的目的就是分析出所有MP3文件的Tag信息并输出. import os # 导入os模块,提供文件路径,列出文件等方法 import sys # 导入sys模块,使用sys.modules获取模块中的所有内容,类似反射的功能 from UserDict import UserDict # 这

使用Shell自动化管理脚本清理Nginx的proxy_cache缓存

Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存.两者的功能基本上一样. 在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能.清除指定URL缓存的功能.而在性能上,Nginx对多核CPU的利用,胜过Squid不少.另外,在反向代理.http://www.aliyun.com/zixun/aggregation/13996.html

Linux集群和自动化维2.1 Shell和Python语言的简单介绍

第2章 生产环境下的Shell和Python脚本 接触Linux系统十多年了,Shell和Python脚本都已经完全融入笔者的生活中了.虽然Shell脚本只是一个简单的解释型语言,不受开发人员的重视,但对于系统运维工程师来说,它的作用举足轻重,它就像我们的瑞士军刀一样,可以帮助我们简化日常的工作并减少工作量.在系统维护工作中,Shell脚本常常能比用C或C++语言编写的程序更快地解决相同的问题,此外,Shell脚本具有很好的可移植性,有时跨越Unix与POSIX兼容的系统,只须略作修改即可,甚至

Zabbix监控之Linux命令行/Shell脚本解析json

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1684266 本文主要写了在Linux下如何用Shell脚本解析json数据,以便于在Zabbix中添加适合于业务应用的监控项. 为什么要使用json? json作为一种文本化的数据格式(文本化协议),符合UNIX编程的哲学,既符合透明性(透明性:设计可见,便于审查和调试)又符合文本性(文本性:数据应该保存为文本文件