linux限制var大小,linux-环境变量值的最大大小是多少?

linux-环境变量值的最大大小是多少?

在Linux上的环境变量中可以存储的数据量是否有限制,如果可以,它是什么?

对于Windows,我发现以下知识库文章总结如下:   Windows XP或更高版本:8191个字符   Windows 2000 / NT 4.0:2047个字符

6个解决方案

62 votes

我认为Linux上没有针对每个环境的变量限制。 所有环境变量的总大小在execve()时受到限制。 有关更多信息,请参见此处的“参数和环境大小的限制”。

进程可以使用setenv()或putenv()使环境超出exec分配的初始空间。

这是一个快速而肮脏的程序,它创建一个256 MB的环境变量。

#include

#include

#include

#include

int main(void)

{

size_t size = 1 << 28; /* 256 MB */

char *var;

var = malloc(size);

if (var == NULL) {

perror("malloc");

return 1;

}

memset(var, 'X', size);

var[size - 1] = '\0';

var[0] = 'A';

var[1] = '=';

if (putenv(var) != 0) {

perror("putenv");

return 1;

}

/* Demonstrate E2BIG failure explained by paxdiablo */

execl("/bin/true", "true", (char *)NULL);

perror("execl");

printf("A=%s\n", getenv("A"));

return 0;

}

sigjuice answered 2019-10-01T09:21:32Z

20 votes

好吧,我的盒子上至少有4M。 那时,我感到无聊和徘徊。 希望终端输出会在我周一恢复工作之前完成:-)

export b1=A

export b2=$b1$b1

export b4=$b2$b2

export b8=$b4$b4

export b16=$b8$b8

export b32=$b16$b16

export b64=$b32$b32

export b128=$b64$b64

export b256=$b128$b128

export b512=$b256$b256

export b1k=$b512$b512

export b2k=$b1k$b1k

export b4k=$b2k$b2k

export b8k=$b4k$b4k

export b16k=$b8k$b8k

export b32k=$b16k$b16k

export b64k=$b32k$b32k

export b128k=$b64k$b64k

export b256k=$b128k$b128k

export b512k=$b256k$b256k

export b1m=$b512k$b512k

export b2m=$b1m$b1m

export b4m=$b2m$b2m

echo $b4m

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

: : : : : : : : : : : :

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

如果您担心4M可能不足以容纳环境变量,那么您可能想重新考虑一下您的工作方式。

最好将信息放入文件中,然后使用环境变量来引用该文件。 我曾见过这样的情况:如果变量的格式为2549868524470770797312,则从文件path/to/any/fspec中获取实际信息。如果它不是以@开头,它将使用环境变量本身的值。

有趣的是,设置了所有这些变量后,每个命令都会开始抱怨参数列表太长,因此即使允许您设置参数列表,也可能无法在完成后启动程序(因为它必须 将环境传递给这些程序)。

paxdiablo answered 2019-10-01T09:22:18Z

5 votes

我使用以下代码段在Linux机器上进行了快速测试:

a="1"

while true

do

a=$a$a

echo "$(date) $(numfmt --to=iec-i --suffix=B --padding=7 ${#a})"

done

在我的盒子(Gentoo 3.17.8-gentoo-r1)上,这导致(输出的最后几行):

Wed Jan 3 12:16:10 CET 2018 16MiB

Wed Jan 3 12:16:11 CET 2018 32MiB

Wed Jan 3 12:16:12 CET 2018 64MiB

Wed Jan 3 12:16:15 CET 2018 128MiB

Wed Jan 3 12:16:21 CET 2018 256MiB

Wed Jan 3 12:16:33 CET 2018 512MiB

xrealloc: cannot allocate 18446744071562068096 bytes

所以:极限很高!

cyberbird answered 2019-10-01T09:22:55Z

1 votes

不太清楚,但经过快速实验后发现没有错误发生,例如 具有64kB的值:

% perl -e 'print "#include \nint main() { return setenv(\"FOO\", \"", "x"x65536, "\", 1); }\n";'\

| gcc -x c -o envtest - && ./envtest && echo $?

0

laalto answered 2019-10-01T09:23:19Z

1 votes

我使用了这个非常快速和肮脏的php代码(如下),将其修改为不同的值,发现它适用于最大长度为128k的可变长度。 在那之后,无论出于什么原因,它都不起作用。 没有引发异常,没有错误报告,但是该值未显示在子外壳程序中。

也许这是特定于php的限制? 也许有php.ini设置可能会影响它? 又或者子外壳程序将继承的vars大小有限制? 也许有相关的内核或外壳配置设置。

无论如何,默认情况下,在CentOS中,通过php中的putenv在环境中设置var的限制似乎约为128k。

$s = 'abcdefghijklmnop';

$s2 = "";

for ($i = 0; $i < 8100; $i++) $s2 .= $s;

$result = putenv('FOO='.$s2);

print shell_exec('echo \'FOO: \'${FOO}');

print "length of s2: ".strlen($s2)."\n";

print "result = $result\n";

?>

版本信息 -

[root@localhost scratch]# php --version

PHP 5.2.6 (cli) (built: Dec 2 2008 16:32:08)

[root@localhost scratch]# uname -a

Linux localhost.localdomain 2.6.18-128.2.1.el5 #1 SMP Tue Jul 14 06:36:37 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

[root@localhost scratch]# cat /etc/redhat-release

CentOS release 5.3 (Final)

Shavais answered 2019-10-01T09:24:04Z

0 votes

命令行(带有所有参数)加上环境变量应小于128k。

J-16 SDiZ answered 2019-10-01T09:24:30Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值