我需要在Python中运行一些Shell / Bash脚本(例如,使用子进程或系统)并获取这些脚本中的一些变量的值。我知道变量的名称,因为它们在每个变量中都是相同的,但值不同。
我无法使用正则表达式来提取变量内容,因为有时这些脚本会带有处理,比如if语句会根据计算机规范更改这些变量的内容(例如,Linux内核的版本,架构......)
但是我会下载这些脚本,所以我不能简单地将变量添加到env或者回显脚本中的变量内容,我需要从Python中获取脚本变量。
真正理想的是避免将脚本保存到磁盘,因为它会运行几次并且从磁盘写入/读取可能是个问题。我使用urllib从网址获取脚本。
答案 0 :(得分:2)
This answer似乎或多或少地涵盖了您正在寻找的内容。为什么不下载脚本,来源它(虽然,在该场景中运行未知代码的常用警告适用)和regex变量的“set”输出,只要你知道它们的名字?
#### testSource.sh file
foo="abcdef"
bar="uvwxyz"
if [[ -z $bar ]]; then
var3="test"
else
var3="testing"
fi
编辑:以下示例应该不需要将脚本下载到磁盘。这个版本实际上下载了上面的'testSource'文件并将其直接写入Bash子流程的标准输入 - 你应该能够将你想要下载的链接放入'urls'数组并初始化'值'带有与所需变量名对应的键的字典:
import subprocess
import re
import requests
urls = ['http://192.168.1.10/testSource.sh']
for url in urls:
response = requests.get(url).content
values = dict.fromkeys(['foo', 'bar', 'var3'])
proc = subprocess.Popen(['bash', '0<'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
proc.stdin.write(response)
proc.stdin.flush()
output, err = proc.communicate(input='set')
for key in values:
match = re.search('%s=(.*)$' % key, output, re.MULTILINE)
if match:
values[key] = match.group(1)
print('%s=%s' % (key,values[key]))