Salt执行复杂python命令

背景

要用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命令行 特殊字符所困扰了

    原文作者:python运维
    原文地址: https://www.jianshu.com/p/99d2184b6dc2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞