C代码在这里:
#include <stdio.h>
#include <stdlib.h>
int main () {
printf("PATH : %s\n", getenv("PATH"));
printf("HOME : %s\n", getenv("HOME"));
printf("ROOT : %s\n", getenv("ROOT"));
printf("TMPDIR : %s\n", getenv("TMPDIR"));
return(0);
}
做之后:
gcc env.c -o printenv
setcap 'cap_dac_override+eip' printenv
sudo -S su -s $(which bash) steve
export TMDIR=hello
./printenv
我得到了这个输出:
PATH : /sbin:/bin:/usr/sbin:/usr/bin
HOME : /home/steve
ROOT : (null)
TMPDIR : (null)
如果我删除设置为 'printenv' 的 CAP,则输出为:
PATH : /sbin:/bin:/usr/sbin:/usr/bin
HOME : /home/steve
ROOT : (null)
TMPDIR : hello
这怎么可能?
经过一番搜索,我发现了这个:http ://polarhome.com/service/man/?qf=secure_getenv&tf=2&of=RedHat&sf=
它提到这可能是由于设置功能时 getenv 变为 secure_getenv 因此所有 getenv() lib 调用都返回 nil,但是在这种情况下如何PATH
打印HOME
环境变量?