linux中用C语言对环境变量设置
背景:做svn自动更新成root用c写的,但是其是root后,环境变量的HOME变量还是原来用户,需要转下,于是查了下C设置环境变量,达到了尽管能通过chmod u+s resetServerAndOptSVN成root,但是这种root里的$_ENV还是原来用户的环境变量。 这个c调用PHP时,其PHP用:print_r($_EVN);还是原来普通用户的环境变量,如下: [HOME]
这个c调用PHP时,其PHP用:print_r($_EVN);还是原来普通用户的环境变量,如下:
[HOME] => /home/xiangdong [MAIL] => /var/spool/mail/xiangdong [USER] => xiangdong [LOGNAME] => xiangdong
直接在PHP里修改,好像无效果,于是,
从网上找到了一个通过C修改其环境变量的方法:
#include<stdlib.h>
#include <stdio.h>
main()
{
char * p;
if((p=getenv("USER")))
printf("USER =%s\n",p);
setenv("USER","test",1);
printf("USER=%s\n",getenv("USER"));
unsetenv("USER");
printf("USER=%s\n",getenv("USER"));
}
Run:[root@localhost tmp]# ./a.out
USER =root
USER=test
USER=(null)
摘自己:http://blog.csdn.net/xwdok/article/details/619728
根据自己情况,实践OK如下:
//开始伪装成root环境变量,让SVN误认为.subversion在root目录下。
setenv("USER","root",1);
setenv("HOME","/root",1);
setenv("LOGNAME","root",1);
setenv("MAIL","/var/spool/mail/root",1); //to avoid the error: TERM environment variable not set.
setenv("TERM","linux",1);
相关知识点链接:https://justwinit.cn/post/7555/关于用c语言提root权限:https://justwinit.cn/post/6975/
整个代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdarg.h>
int main(int argc, char *argv[])
{
uid_t uid ,euid;
//char cmd[1024]; //变量暂时未使用
uid = getuid() ;
euid = geteuid();
//printf("my uid :%u\n",getuid()); //这里显示的是当前的uid 可以注释掉. www=48
//printf("my euid :%u\n",geteuid()); //这里显示的是当前的euid root=0
if(setreuid(euid, uid)) //交换这两个id
perror("setreuid");
//printf("after setreuid uid :%u\n",getuid());
// root=0
//printf("afer sertreuid euid :%u\n",geteuid());
// www=48
//开始伪装成root环境变量,让SVN误认为.subversion在root目录下。
setenv("USER","root",1);
setenv("HOME","/root",1);
setenv("LOGNAME","root",1);
setenv("MAIL","/var/spool/mail/root",1); //to avoid the error: TERM environment variable not set.
setenv("TERM","linux",1);
char command[36000];
char opt[64];
char path[36000];
FILE *pPipe;
char psBuffer[36000];
strcpy(opt,argv[1]);
strcpy(path,argv[2]);
//snprintf(command,sizeof(command),"/usr/local/php/bin/php /data/htdocs/tools.xiyou.cntv.cn/resetServerAndOptSVN.php %s %s",opt,path); snprintf(command,sizeof(command),"/usr/local/php/bin/php ./getAndUpCodesServ.php %s %s",opt,path);
if( (pPipe = popen( command, "r" )) == NULL )
{
//执行脚本
printf("Excute Command Faild :%s",command);
exit( 1 );
}
while(!feof(pPipe))/* Read pipe until end of file. */
{
if(fgets(psBuffer, sizeof(psBuffer), pPipe) != NULL)
printf("%s",psBuffer);
}
/* Close pipe and print return value of pPipe. */
//printf( "\nProcess returned: %d\n", pclose( pPipe ) );
pclose(pPipe);
return 0;
}
这里想通过对PWD的环境变量作修改,好像不行,但对USER、HOME、LOGNAME、TERM均可修改其变量,达到了通过setreuid由常规用户变为root用户修改环境变量的目的,后再执行PHP,也就是root了,本来想通过PHP里修改,修改失败,还是得C铺路后再进行PHP,这样就不再是常规帐号的Home了,于是执行svn时不再去找如:xiangdong‘s HOME=>/home/xiangdong/.subversion 而是去/root/.subversion去执行,权限更大,更符合手工执行的环境,svn相关操作的脚本执行相当可靠。EOF更多推荐
所有评论(0)