将 shell/bash 脚本中的变量读入 python

Read variables from shell/bash script into python

我需要在 Python 中 运行 一些 Shell/Bash 脚本(例如,使用子进程或系统)并获取这些脚本中一些变量的值。我知道变量的名称,因为它们在每个变量中都是相同的,但值不同。

我无法使用正则表达式提取变量内容,因为有时这些脚本会进行处理,例如 if 语句会根据计算机规格(例如 linux 内核的版本更改这些变量的内容, 架构...).

但我会下载这些脚本,所以我不能简单地将变量添加到环境中或从脚本中回显变量内容,我需要从 Python.

获取脚本变量

真正理想的做法是避免将脚本保存到磁盘,因为它会 运行 多次,而从磁盘 write/read 可能是个问题。我正在使用 urllib 从网址获取脚本。

This answer 似乎或多或少地涵盖了您正在寻找的内容。为什么不直接下载脚本,获取它的源代码(虽然,与 运行 未知代码相关的常见警告适用于该场景)并为变量正则表达式 "set" 的输出,前提是你知道它们的名字?

#### testSource.sh file
foo="abcdef"
bar="uvwxyz"
if [[ -z $bar ]]; then
    var3="test"
else
    var3="testing"
fi

编辑:下面的例子应该消除了将脚本下载到磁盘的需要。该版本实际上下载了上述 'testSource' 文件并将其直接写入 Bash 子进程的标准输入——您应该能够将您尝试下载的链接放入 'urls' 数组并使用与所需变量名称相对应的键初始化 'values' 字典:

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]))