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