如何在python脚本中源/etc/apache2/ envars ?



我想在运行apache2 -V命令之前找到这个/etc/apache2/envars的源代码,这个命令会给我这个没有源代码的输出

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/envars从终端使上述警告消失,但我想在python脚本中这样做,因为我正在调用apache2 -V从我的python脚本对输出进行一些解析。

我正在使用命令execfile来源文件,但我得到错误,不知道如何解决这个问题。在python脚本

中找到/etc/apache2/envars文件是否有正确的方法?
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
>>>

execfile用于执行Python代码,而不是shell变量。我想你已经找到答案了。它的意思不是执行envvars文件,而是执行一些Python代码,在globals参数中传递所需的变量。

但是你不能source因为它是一个内置的shell。这个问题

你能考虑用这个命令代替吗?

$ 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'1718n',这证明fake_apache2.py看到了envvar。


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

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

最新更新