【问题标题】:Python subprocess.Popen pass modified environment to use new environment varibels in postinst script [duplicate]Python subprocess.Popen通过修改环境以在postinst脚本中使用新的环境变量[重复]
【发布时间】:2021-12-30 01:25:00
【问题描述】:

我有一台服务器来安装包含postinst 脚本的不同 debian 软件包。

一些软件包需要一个修改过的环境,其中包含一些要连接的端口。

当我调用服务器安装包时,我在请求中传递了一个对象参数vars,其中包含自定义端口: {'vars': {'CUSTOM_PORT_1': '7755', 'CUSTOM_PORT_2': '7766'}}

在我的代码中,我调用subprocess.Popen 来运行将安装debian 包的命令。这是我的代码:

def open_process(command, app_vars=None):
    my_env = os.environ.copy()
    if app_vars:
        my_env.update(app_vars)

    p = subprocess.Popen(['sudo', 'dpkg', '-i', 'path-to-package'], env=my_env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
    
    output, err = p.communicate()
    return_code = p.returncode
    return output, err, return_code

我希望修改后的环境将通过env=my_env 传递给postinst 脚本,以便我可以将它们打印出来。 postinst 脚本运行一个应用程序,该应用程序使用修改后的环境中的这些端口,因此我必须在运行应用程序之前导出它们。这是来自postinst 脚本的代码:

#!/bin/bash
.
.
.
echo "CUSTOM_PORT_1:$CUSTOM_PORT_1"
echo "CUSTOM_PORT_2:$CUSTOM_PORT_2"

export APP_PORT_1=$CUSTOM_PORT_1
export APP_PORT_2=$CUSTOM_PORT_2 

echo "APP_PORT_1:$APP_PORT_1"
echo "APP_PORT_2:$APP_PORT_2"
.
.
.
*run-the-app*

不幸的是,这是输出:

CUSTOM_PORT_1: 
CUSTOM_PORT_2:

APP_PORT_1: 
APP_PORT_2:

我必须提到我还尝试了subprocess.Popen 行的其他几种方式:

1.

p = subprocess.Popen(['sudo dpkg -i /path-to-package', env=my_env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
def open_process(command, app_vars=None):
    if app_vars:
        for key in app_vars:
           os.environ[key] = app_vars.get(key)

    p = subprocess.Popen(['sudo', 'dpkg', '-i', 'path-to-package'], env={**os.environ}, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)

我有什么遗漏的吗?

我的期望合理吗?

这可能吗?

【问题讨论】:

    标签: python environment-variables subprocess dpkg post-install


    【解决方案1】:

    我刚刚了解到,当使用sudo 运行命令时,本地用户环境变量与 root 用户不同。

    为了在使用sudo 运行命令时保留环境变量,您应该添加标志-E,如本答案how-to-keep-environment-variables-when-using-sudo 中所述。

    我从 how-to-keep-environment-variables-when-using-sudo 复制了手册页中的引用:

    -E, --preserve-env
    向安全策略表明用户希望保留其 现有的环境变量。安全策略可能会返回错误 如果用户没有保护环境的权限。

    一旦我将命令字符串更改为sudo -E dpkg -i path-to-packagepostinst 脚​​本就能够按我的预期打印出变量:

    CUSTOM_PORT_1: 7755
    CUSTOM_PORT_2: 7766
    
    APP_PORT_1: 7755
    APP_PORT_2: 7766
    

    【讨论】:

    • 顺便说一句,sudo env CUSTOM_PORT_1=7765 CUSTOM_PORT_2=7766 APP_PORT_1=7755 APP_PORT_2=7766 dpkg -i path-to-package 是另一种工作方法。
    猜你喜欢
    • 2016-03-22
    • 2020-04-05
    • 2013-10-12
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2017-10-02
    • 2020-10-05
    • 1970-01-01
    相关资源
    最近更新 更多