没有sudo和sudo privilages的自定义shell的不同行为

时间:2016-03-25 10:39:57

标签: c linux shell

我一直在尝试在Linux中实现一个shell作为学习经验...更改目录功能和程序本身在不同的权限下提供不同的输出。

1)在正常用户权限下执行

    [Vivek-lappy]/home/Vivek-lappy/Documents/Zeus/Zeus>ls /
    0     dev   initrd.img  live-build  mnt   root  srv  usr
    bin   etc   lib     lost+found  opt   run   sys  var
    boot  home  lib64   media       proc  sbin  tmp  vmlinuz
    [Vivek-lappy]/home/Vivek-lappy/Documents/Zeus/Zeus>cd /
    PWD=/
    [Vivek-lappy]/>ls
    Segmentation fault

gdb显示以下错误:

    Program received signal SIGSEGV, Segmentation fault.
    _IO_vfprintf_internal (s=0x0, format=0x402953 "command:%s\n", 
    ap=ap@entry=0x7fffffffdd08) at vfprintf.c:1278
    1278    vfprintf.c: No such file or directory.

2)在sudo权限下执行

   [root](null)>ls /
    0     dev   initrd.img  live-build  mnt   root  srv  usr
    bin   etc   lib     lost+found  opt   run   sys  var
    boot  home  lib64   media       proc  sbin  tmp  vmlinuz
   [root](null)>cd /
    PWD=/
   [root]/>ls
   0     dev   initrd.img   live-build  mnt   root  srv  usr
   bin   etc   lib      lost+found  opt   run   sys  var
   boot  home  lib64    media       proc  sbin  tmp  vmlinuz
   [root]/>

3)其他信息 变更目录功能代码

    void add(char * name,char * value){
    unsetenv(name);setenv(name,value,1);
    }

    void dump(char * name){

       char * value=getenv(name);
       printf("%s=%s\n",name,value); 
   }


 int cd(char * argv[],int argc){

char cwd[1024];

if(argc>2){
    printf("\n Too many arguments cd accepts only one argument that is the directory name\n");
    return -1;
}

if(argv[1]==NULL){
    if(chdir(getenv("HOME"))==0){
        add("PWD",getenv("HOME"));
        dump("PWD");
        return 0;
    }

}


if(chdir(argv[1])!=0){
        printf("\n No Such Directory\n");
        printf("\nUSAGE:> cd Dir_name [Where Directory_Name is the Directory name] \n");
        return -1;

}
if (!getcwd (cwd, sizeof(cwd))) {
    perror ("getcwd");
    exit (EXIT_FAILURE);

}

else{

    add("PWD",cwd);
    dump("PWD");


}


return 0;


}

执行代码:

  int execute(char * argv[],int argc){

   int status;        

    if(strcmp(argv[0],"cd")==0){
        cd(argv,argc);
  }
  else if(strcmp(argv[0],"list")==0){

    list();
  }
  else if(strcmp(argv[0],"color")==0){

    color();

  }
  else if(strcmp(argv[0],"history")==0){
    history();
    }
    else
 {

    pid_t pid=fork();   
    if(pid<0){

        fprintf(stderr, "cant fork process%s\n",strerror(errno) );
        return 1;
    }
    else if(pid==0){

            if(execvp(argv[0],argv)<0){
                fprintf(stderr, "cant run program:%s\n",strerror(errno) );

            return 1;
            }

        }
    else
    {
        while(wait(&status)!=pid)
            ;


    }



 }

 return 0;
}

为什么同一程序的输出因不同的权限而不同?

1 个答案:

答案 0 :(得分:0)

您的分段错误很可能是因为使用了指向某些未初始化或随机数据的指针。根据此类随机数据的内容,您可能会遇到分段错误,或者数据似乎足以使您的程序继续执行。不同的情况(如sudo与否)可能会在随机或未初始化的数据中提供不同的内容。

为了进一步调试,我会调整你的限制,以便生成核心转储文件。通过该核心转储,您将能够在调试器中准确地看到程序段错误的位置。您可能已经这样做了,因为您知道segfault在函数vprintf中,您自己没有编写,但如果您在调用堆栈中看起来更高,您可能会发现自己的代码调用某些* printf函数不好的论点。