5

在 Linux 中使用二进制环境变量时,我发现了一些奇怪的行为,其中一些单字节似乎不好。我仔细检查了它,似乎某些字节在给 setenv() 时总是会被错误地“转换”。看这个:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char array[256];

    int i;
    for(i = 1; i < 256; i++) {
        array[i] = i;
    }

    setenv("badenv", array, 1);

    system("/bin/sh");

    return 0;
}

我执行这个程序,然后当我执行 echo $badenv > test; 我看到的 hexdump 测试:

0000000 0101 0302 0504 0706 2008 0c0b 0e0d 100f
0000010 1211 1413 1615 1817 1a19 1c1b 1e1d 201f
0000020 2221 2423 2625 2827 2a29 2c2b 2e2d 302f
0000030 3231 3433 3635 3837 3a39 3c3b 3e3d 403f

似乎 0x9 被转换为 0x20,0xa 被转换为 0xb 等等。

我是在滥用 setenv(),还是在滥用环境变量?我查看了联机帮助页并搜索了一些环境变量是否应该能够处理二进制值,但我不确定。

这种行为的原因是什么,有什么办法可以解决它,同时仍然使用环境变量?

4

1 回答 1

5

环境变量根据 的值拆分为“单词”,$IFS“单词”用单个分隔符连接 - 在本例中为普通空格。因此"\x09\x0a",在"\t\n",解释.'\x20'array

IFS - 内部字段分隔符,用于扩展后的分词并使用 read 内置命令将行拆分为单词。默认值为“空格制表符换行符”。

您可以通过(暂时)更改来避免替换$IFS

但是请注意,

  • array[0]具有不确定的价值
  • array不是 0 终止的

在你的程序中。你应该解决这个问题。

于 2013-04-02T15:09:39.817 回答