在Linux中使用二進制環境變量時,我發現一些奇怪的行爲,看起來有些單字節不好。我仔細檢查了它,看起來某些字節在給setenv()時總會被錯誤地「轉換」。看看這個:二進制環境變量和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(),或者甚至濫用環境變量?我查看了manpage並搜索了一些,看看環境變量是否應該能夠處理二進制值,但我不確定。
這種行爲的原因是什麼,有沒有辦法繞過它,同時仍然使用環境變量?
對於什麼可以進入env變量似乎有一些沉默的限制。 'export a ='echo -e「\ t」'會產生同樣的效果,用tab替換空格。 – elmo
由於'setenv'需要一個以0結尾的字符串(a.k.a. C-style字符串)作爲變量值,因此該值顯然不能是任意的二進制數據,因爲它不能很好地處理0字節。不過,我不知道爲什麼它會將「0x9」這樣的控制字符轉換爲空格。最可能的是一些安全措施。 – shakurov