背景:做svn自动更新成root用c写的,但是其是root后,环境变量的HOME变量还是原来用户,需要转下,于是查了下C设置环境变量,达到了尽管能通过chmod u+s  resetServerAndOptSVN成root,但是这种root里的$_ENV还是原来用户的环境变量。 
这个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 
Logo

更多推荐