标签: getenv

如何使用putenv()更新现有环境变量?

编辑:据我所知,我的问题是因为PHP存在缺陷.我在这里将这个问题复制到PHP bug跟踪器:https://bugs.php.net/bug.php?id = 74143并计划尝试实现修复.


putenv函数设置环境变量的值.根据手册,putenv在成功时返回true,在失败时返回false.

但是,我发现putenv函数有时会返回true而不更新当前会话的环境变量.

要重现此问题,请使用PHP FPM在Web服务器中使用fastcgi_param指令设置环境变量.这非常有用,因为它允许将环境变量隔离设置到同一服务器上的其他主机.

示例nginx.conf:

location ~ \.php$ {
        fastcgi_pass    unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_param   TESTVAR_ENV     old-value;
        include         fastcgi_params;
}
Run Code Online (Sandbox Code Playgroud)

示例test.php:

var_dump(getenv("TESTVAR_ENV"));
var_dump(putenv("TESTVAR_ENV=new-value"));
var_dump(getenv("TESTVAR_ENV"));
Run Code Online (Sandbox Code Playgroud)

test.php的输出:

string(12) "old-value"
bool(true)
string(12) "old-value"
Run Code Online (Sandbox Code Playgroud)

如你看到的:

  1. getenv成功读取现有值,
  2. putenv函数返回true,表示成功,
  3. 实际上没有设置新值,这令人难以置信.

我误解了putenv函数的用途是什么?setenv手册页上是否有一些缺少的文档?如何使用putenv()更新现有环境变量?

php environment-variables getenv

13
推荐指数
1
解决办法
5662
查看次数

os.getenv返回None而不是正确的值

我有一个我无法发布的复杂软件,也没有具体的工作示例.我会尝试解释这个问题,也许有人曾经遇到过这个问题.

在Linux shell上我定义了一个环境变量:

> export MY_TEST_ENV=4711
> echo $MY_TEST_ENV
> 4711
Run Code Online (Sandbox Code Playgroud)

在复杂的代码中我想用这个变量获取

print os.getenv('MY_TEST_ENV')
Run Code Online (Sandbox Code Playgroud)

总是回来None.如果我创建一个测试脚本来测试这种行为,即使是不同文件中的类,我总是得到所需的行为,例如,os.getenv('MY_TEST_ENV')返回正确的值4711.

代码以sudo.开头.

任何想法可能是什么原因?

python linux environment-variables getenv

10
推荐指数
1
解决办法
1万
查看次数

标准C使用getenv和安全做法

我正在尝试编写在UNIX环境中使用一些ENV变量的C代码.问题是:读取变量(例如getenv())会导致缓冲区溢出吗?此外,如何找到我的平台的env变量大小的限制?例如哪个头文件?

最后,阅读环境提供的变量中最安全的代码实践是什么?

c unix environment-variables getenv

9
推荐指数
1
解决办法
1万
查看次数

为什么在运行时更改LD_LIBRARY_PATH dosen一旦Executable被加载就反映在Executable上

我正试图改变LD_LIBRARY_PATH我的C++程序.我能够使用它来获取它的值getenv("LD_LIBRARY_PATH")并使用它设置它的值setenv()(我知道这是有效的,因为当我getenv("LD_LIBRARY_PATH")再次调用时,我得到更新的值),但是从程序内部改变它的值没有任何影响对它:我仍然收到此错误消息:

Failed to Load the shared library file

如果我在加载可执行文件或启动应用程序之前设置了值,它就可以正常工作.

c++ linux setenv getenv

7
推荐指数
1
解决办法
2659
查看次数

Docker Alpine映像+ grpc:警告:使用了不安全的环境读取功能'getenv'

当我使用以下图像时:node:6.11.0-alpine运行我的服务(使用GRPC),然后继续收到以下警告:

D0622 06:52:01.170502843       1 env_linux.c:66]             Warning: insecure environment read function 'getenv' used
D0622 06:52:01.554446816      12 env_linux.c:66]             Warning: insecure environment read function 'getenv' used
D0622 06:52:01.559295167      14 env_linux.c:66]             Warning: insecure environment read function 'getenv' used
D0622 06:52:01.566036292      13 env_linux.c:66]             Warning: insecure environment read function 'getenv' used
D0622 06:52:01.569975088      15 env_linux.c:66]             Warning: insecure environment read function 'getenv' used
Run Code Online (Sandbox Code Playgroud)

我会错过任何包裹吗?如何解决这个问题?

可以参考此问题#8104

getenv docker alpine-linux

7
推荐指数
1
解决办法
877
查看次数

无法在PHP中检索Apache环境变量

背景

我有一个Apache/2.2.15(Win32)与PHP/5.3.2设置,处理身份验证.

<Directory /usr/www/myhost/private>
  # core authentication and mod_auth_basic configuration
  # for mod_authn_dbd
  AuthType Basic
  AuthName "My Server"
  AuthBasicProvider dbd

  # core authorization configuration
  Require valid-user

  # mod_authn_dbd SQL query to authenticate a user
  AuthDBDUserPWQuery "SELECT Password,UserName,Realm,Access FROM authn WHERE user = %s"
</Directory>
Run Code Online (Sandbox Code Playgroud)

身份验证工作正常!没问题.

但是对于文档,从AuthDBDUserPWQuery返回的任何额外字段将被放入环境中的AUTHENTICATION_fieldname变量中.

有了phpinfo(),我可以在"Apache Environment"下看到这些变量和正确的值.

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS

问题

我无法从我的PHP中获取这些环境变量.

1 <?php
2   $Access = apache_getenv('AUTHENTICATE_ACCESS',true);
3   var_dump($Access);
4 ?>
Run Code Online (Sandbox Code Playgroud)

第3行打印bool(false),表示找不到变量!
但是,如果我更改为另一个Apache环境变量,例如'HTTP_HOST',它可以工作.
..是的,我也尝试过getenv(),同样的结果.

还有一个注意事项,Apache服务器需要使用APR 1.3.0进行编译才能工作.我使用了来自httpd.apache.org的Apache msi构建,它似乎是用APR编译的,高于版本2.因为我可以看到它们,phpinfo()所以它们必须可以从PHP访问.

php apache authentication environment-variables getenv

6
推荐指数
1
解决办法
3247
查看次数

TypeError:使用 Python 3.7 时,int() 参数必须是字符串、类似字节的对象或数字,而不是“NoneType”

我正在尝试运行下面的简单代码片段

port = int(os.getenv('PORT'))
print("Starting app on port %d" % port)
Run Code Online (Sandbox Code Playgroud)

我可以理解 PORT 是 s 字符串,但我需要转换为 int。为什么我收到错误

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
Run Code Online (Sandbox Code Playgroud)

python environment-variables getenv python-3.x

6
推荐指数
1
解决办法
9873
查看次数

删除getenv()返回的char数组

我应该释放为char数组分配的内存,该char * getenv( char * )函数返回指针吗?哪种方式 - C free()或C + delete []?如果没有 - 为什么?

我的意思是:

char * ptr = getenv( "LS_COLORS" );
cout << ptr << endl;
delete [] ptr; //Is this or free() call needed?
Run Code Online (Sandbox Code Playgroud)

谢谢.

c++ arrays pointers char getenv

5
推荐指数
1
解决办法
742
查看次数

C++ getenv 不更新

我正在尝试编写一个 bash 脚本运行的程序。我希望 bash 脚本能够更改 C++ 程序的状态,而我唯一能找到的就是使用环境变量。问题是,似乎 getenv 仅在程序运行时获取值。

重击

export BLINK=1
./blink &
sleep 5s
unset BLINK
Run Code Online (Sandbox Code Playgroud)

C++

int main(int args, char **argv) {

    char *blink = getenv("BLINK");

    while(blink && blink[0] == '1')
    {
        std::cout << getenv("BLINK") << std::endl;
        usleep(500000);
    }

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

所以它的作用是运行眨眼程序,等待 5 秒钟,然后取消环境设置。然而,C++ 程序始终将环境值视为 1 并且永远不会停止。程序运行时如何获取更新的环境变量?或者有没有更好的方法让 bash 脚本控制 C++ 程序的状态。

编辑我应该注意,我也不想只是终止该进程,因为它必须在结束时关闭硬件。

c++ linux bash getenv

5
推荐指数
1
解决办法
1780
查看次数

为什么/proc文件系统中environ的内容与extern environ指向的内容不同?

我的 C++ apache/cgi 中的 getenv() 给了我奇怪的东西,然后我检查了 /proc/${PID_OF_THE_RUNNING_PROCESS} 内的环境,它们不匹配,我认为它们应该匹配,我想知道 /proc 或它出了什么问题是 getenv() 吗?

shell@kernel # xargs --null --max-args=1 echo < /proc/${PID_OF_THE_RUNNING_PROCESS}/environ 
PATH=/usr/bin:/bin:/usr/sbin:/sbin
LD_LIBRARY_PATH=/usr/local/httpd-2.2.19/lib:
Run Code Online (Sandbox Code Playgroud)

PID_OF_THE_RUNNING_PROCESS 的代码

#include<stdio.h>
extern char **environ;

void run()
{
    char* s = *environ;
    printf("declare -x  all env begin\n");    
    for (int i = 1; NULL != s; ++i) {
        printf("declare -x  %s\n", s);
        s = *(environ+i);
    }
    printf("declare -x  all env end\n");
}
Run Code Online (Sandbox Code Playgroud)

PID_OF_THE_RUNNING_PROCESS 的控制台日志

declare -x  all env begin
declare -x  FCGI_ROLE=RESPONDER
declare -x  UNIQUE_ID=Wvq-Cn8AAAEAAAkmJlsAAAmM
declare -x  HTTP_HOST=www.example.com …
Run Code Online (Sandbox Code Playgroud)

environment environment-variables getenv environ

5
推荐指数
2
解决办法
2904
查看次数