【问题标题】:How to source /etc/apache2/envvars within python script?如何在 python 脚本中获取 /etc/apache2/envvars?
【发布时间】:2021-11-10 06:34:39
【问题描述】:

我想在运行 apache2 -V 命令之前获取这个 /etc/apache2/envvars 的源代码,它会在没有源代码的情况下给我这个输出

user@ubuntu16:~$ apache2 -V
[Tue Sep 14 05:01:39.045086 2021] [core:warn] [pid 13942] AH00111: Config variable ${APACHE_RUN_USER} is not defined
[Tue Sep 14 05:01:39.045115 2021] [core:warn] [pid 13942] AH00111: Config variable ${APACHE_RUN_GROUP} is not defined
[Tue Sep 14 05:01:39.045142 2021] [core:warn] [pid 13942] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
[Tue Sep 14 05:01:39.053712 2021] [core:warn] [pid 13942] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
[Tue Sep 14 05:01:39.053860 2021] [core:warn] [pid 13942] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
[Tue Sep 14 05:01:39.053878 2021] [core:warn] [pid 13942] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
AH00543: apache2: bad user name ${APACHE_RUN_USER}

从终端运行命令 source /etc/apache2/envvars 会使上述警告消失,但我想从 python 脚本中执行此操作,因为我正在调用 apache2 - V 从我的 python 脚本中对输出进行一些解析。

我正在使用命令 execfile 来获取文件,但我收到了错误并且不知道如何解决这个问题。在 python 脚本中是否有任何正确的方式来获取这个 /etc/apache2/envvars 文件

root@ubuntu16:/home/virsec# python
Python 2.7.12 (default, Mar  1 2021, 11:38:31)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> execfile("/etc/apache2/envvars")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/etc/apache2/envvars", line 4
    unset HOME
             ^
SyntaxError: invalid syntax
>>>

【问题讨论】:

    标签: python python-3.x python-2.7 apache ubuntu-16.04


    【解决方案1】:

    execfile 用于执行 Python 代码,而不是用于 shell 变量。我猜你找到了this answer。它的意思不是执行envvars 文件,而是执行一些Python 代码,在globals 参数中传递所需的变量。参见Python 2 docs

    但您不能从 Python source,因为它是内置的 shell。参考this question

    你可以考虑运行这个命令吗:

    $ source envvars && python so69188563.py
    

    # file: envvars
    export ARYAMAN=1718
    
    # file: so69188563.py
    import subprocess
    
    outcome = subprocess.run(["python", "fake_apache2.py"], stdout=subprocess.PIPE)
    if outcome.returncode != 0:
        print("error !")
    else:
        print(outcome.stdout)  # do something with it
    
    # file: fake_apache2.py
    import os
    print(os.environ.get("ARYAMAN", "MISSING!"))  # print the value or missing
    

    或将其放入文件中:

    # !/bin/sh
    # file: run.sh
    source envvars
    echo $ARYAMAN
    python so69188563.py
    

    并正常执行:./run.sh

    无论哪种方式,您都会得到 b'1718\n',这证明 fake_apache2.py 看到了 envvar。


    关于我的解决方案的一些细节:

    • 我假设你不想在命令行中设置它们,比如export ARYAMAN=1718; python so69188563.py
    • 你不能做像source envvar &amp;&amp; python so69188563.py这样的事情,因为shell对每个单独的命令都使用子进程,它们不共享环境变量(参见this question,但答案很糟糕)
    • envvar 中的变量必须是exported,参见this question
    • 我不想像 this question 那样解析 (Ba)sh 语法

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2012-02-27
      • 2010-10-22
      • 1970-01-01
      • 2022-10-15
      • 2015-02-13
      • 2014-03-16
      • 2016-04-18
      相关资源
      最近更新 更多