【问题标题】:Accessing environment variable inside the postinst script of the debian package在 debian 包的 postinst 脚本中访问环境变量
【发布时间】:2016-03-22 00:18:59
【问题描述】:

我已经制作了一个用于自动安装 oozie 的 debian 软件包。 postinst 脚本基本上是一个 shell 脚本,在安装包后运行。我想访问此脚本中的环境变量。我应该在哪里设置环境变量?

【问题讨论】:

  • 环境变量从父级继承(复制)到子级。因此,在父级中,即运行脚本的任何内容。
  • @cdarke,当我部署 debian 时,我仍然无法访问 env 变量。我将它们设置在 bashrc 文件中。
  • 您确定正在执行 .bashrc 文件吗?它通常不会为脚本执行,如果 bash 被调用为 sh 则不会执行。
  • 是的 .bashrc 文件已执行。当我像普通 shell 脚本一样运行 postinst 时,我可以访问 .bashrc 中的环境变量,但通过 debian 我无法访问环境变量。
  • 您在bash 标记中发布了此内容,但postinst 脚本需要能够在sh 下运行。

标签: bash environment-variables deb dpkg post-install


【解决方案1】:

根据您实际想要完成的任务,将信息传递给包脚本的正确方法是使用Debconf 变量。

简单地说,你添加一个类似这样的debian/templates 文件:

Template: oozie/secret
Type: string
Default: xyzzy
Description: Secret word for teleportation?
 Configure the secret word which allows the player to teleport.

并将您的 postinst 脚本更改为类似

#!/bin/sh -e

# Source debconf library.
. /usr/share/debconf/confmodule

db_input medium oozie/secret || true
db_go

# Check their answer.
db_get oozie/secret
instead_of_env=$RET
: do something with the variable

你可以在运行打包脚本之前preseed Debconf 数据库的值为oozie/secret;那么它不会提示输入值。只需做类似的事情

debconf-set-selections <<<'oozie oozie/secret string plugh'

使用值plugh 对其进行预配置。

另见http://www.fifi.org/doc/debconf-doc/tutorial.html

无法保证安装程序在特定环境中运行,或者dpkg 由特定用户调用,或者从完全可以由用户操作的环境中调用。在这些情况下,正确的包装需要稳健性和可预测性;还要考虑可用性。

【讨论】:

    【解决方案2】:

    将此添加到您的 postinst 脚本中:

    #!/bin/sh -e
    # ...
    pid=$$
    while [ -z "$YOUR_EVAR" -a $pid != 1 ]; do
        ppid=`ps -oppid -p$pid|tail -1|awk '{print $1}'`
        env=`strings /proc/$ppid/environ`
        YOUR_EVAR=`echo "$env"|awk -F= '$1 == "YOUR_EVAR" { print $2; }'`
        pid=$ppid
    done
    # ... Do something with YOUR_EVAR if it was set.
    

    仅在运行 dpkg -i 之前 export YOUR_EVAR=...

    不是推荐的方式,但它紧凑、简单,正是 PO 所要求的。

    【讨论】:

      【解决方案3】:

      隔了很久才回复。

      实际上,我是通过 dpkg 以 sudo 用户身份部署 oozie 自定义 debian。 因此,要启用对这些环境变量的访问,我实际上必须在 /etc/sudoers 文件中进行一些更改。 我所做的更改是将文件中的每个环境变量名称添加为

      Defaults        env_keep += "ENV)VAR_NAME"
      

      在此之后,我能够在 postinst 脚本中访问这些变量。

      【讨论】:

      • 无论调用方式如何,正确构建的包都应该正确运行。例如,Debian 安装程序应该能够在首次设置系统时安装它。
      猜你喜欢
      • 2021-12-02
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2010-11-07
      • 2015-03-11
      • 1970-01-01
      相关资源
      最近更新 更多