背景
要用Salt Api在目标机群(centos/window)实现很复杂的配置文件处理操作。
本来的想法
awk powershell。结果awk太难,powershell不会...然后有Salt必有Python,有Python就可以执行python -c "print 1"
。但是由于
太复杂,要先读取目标机子上的文件,然后分析逻辑,然后在做文件写操作。于是引发了一个问题,python脚本中有许多字符。例如:
, TAB
等等。远程执行各种报错,出错原因是字符问题。
比如我要执行以下代码:
temp = []
with open('/etc/test.conf', 'r') as f:
for line in f.readlines():
if line.startswith('# TEST '):
temp.append(line)
with open('/etc/test2.conf', 'w') as f:
f.writelines(temp)
f.write('''
Add Some doc...
Add Some doc...
''')
这段代码是无法用python -c "我的命令"
去执行得。代码中有'''
:
.
这种字符。
洋洋自得
如何解决上面的问题。比如我们有这么一段代码
print 1
print 2
print '''
so simple
'''
- 第一步,我们可以用
exec
这个关键词执行一段String文本。例如
>>> exec """print 1"""
1
- 第二不, 我们可以将某个文本全部转化为数字,这样就可以去除文本中的特殊字符。例如
>>> code = """
... print 1
... print 2
... print '''
... so simple
... '''
... """
>>> code_char_list = list(map(ord, code))
>>> code_char_list
[10, 112, 114, 105, 110, 116, 32, 49, 10, 112, 114, 105, 110, 116, 32, 50, 10, 112, 114, 105, 110, 116, 32, 39, 39, 39, 10, 32, 32, 32, 32, 32, 115, 111, 32, 115, 105, 109, 112, 108, 101, 10, 39, 39, 39, 10]
>>> str(bytearray(code_char_list))
"\nprint 1\nprint 2\nprint '''\n so simple\n'''\n"
>>> exec str(bytearray(code_char_list))
1
2
so simple
也就是说,我们在利用Salt远程Api执行某个复杂命令是,可以将原有代码转成如上的数组,这样只有[
]
,
0-9
这些字符。就不会被shell命令行 特殊字符所困扰了