【问题标题】:Bash variable not set when calling the script from wrapper binary从包装二进制文件调用脚本时未设置 Bash 变量
【发布时间】:2021-01-17 00:10:38
【问题描述】:

我有以下代码,
bash 脚本“tryme.sh”:

#!/usr/bin/env bash

PATH=$(/usr/bin/getconf PATH || /bin/kill $$)

PASS="hellthatrocks"

if [ ! -v "$1" ]; then
    echo "no.."
    echo "hell..."
    exit 1
fi

if test "$1" = "$PASS" ; then
    echo "yeah it is : $PASS"
else
    echo "humm..."
fi

exit 0

以及包装二进制文件“wrapper.c”:

#include <unistd.h>

int main(int arc, char** arv) {
    char *argv[] = { "/bin/bash", "-p", "./tryme.sh", arv[1] , NULL };
    execve(argv[0], argv, NULL);
    return 0;
}

compiled gcc -o wrapper wrapper.c
export hellthatrocks="hellthatrocks"

问题是当我给出一个模式作为参数时,它在命令行中寻找已定义的环境变量,例如:

./tryme.sh ${!h*}

它给了我,“是的,它是hellthatrocks”。

但如果我从包装器中调用脚本,它不会找到变量并给出“no... hell....”

./wrapper ${!h*}

出了什么问题?
谢谢,

【问题讨论】:

  • and gives "no... hell...." 你在什么系统上? execve 应该是错误的......你为什么要使用 ${!h*} ?为什么不简单的"hellthatrocks"?我希望您知道您的脚本确实读取环境变量的值 - 那么设置它的意义何在?哦,我明白为什么它没有出错,来自man execve,但引用Do not take advantage of this nonstandard and nonportable misfeature!
  • 没有错误...它适用于 Linux 5.4.0-62-generic #70~18.04.1-Ubuntu... 包装器没有错误。但是它调用了脚本并且脚本找不到 hellthatrocks...我检查了每个变量...它识别了 hellthatrocks 但无法确定它是否设置为...
  • @hellXY 既然你用了execve,原来的环境就换成空的了。
  • 有没有办法从调用 tryme.sh 脚本的包装二进制文件中读取密码?因为脚本和二进制文件都具有相同的用户....

标签: bash variables wrapper


【解决方案1】:

怎么了?

envp 在 Linux 上可能被错误地指定为 NULL,来自手册页:

在 Linux 上,可以将 argv 和 envp 指定为 NULL。在这两种情况下,
这与将参数指定为指向的指针具有相同的效果 包含单个空指针的列表。 不要利用 这种非标准且不可移植的错误功能!

您将其指定为NULL,因此在子进程中环境为空,因此导出的hellthatrocks 变量不存在-因此检查[ -v "$1" ]$1=hellthatrocks 失败。

【讨论】:

  • 感谢您的解释。我投票给这篇文章作为答案...不幸的是,我不能投票,因为我没有 15 名声望。抱歉...我必须更频繁地在这里发帖才能进入这个行业。再次感谢...
猜你喜欢
  • 1970-01-01
  • 2016-10-07
  • 2010-12-30
  • 2013-08-26
  • 2018-10-24
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多