【发布时间】:2016-03-25 10:39:57
【问题描述】:
我一直在尝试在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;
}
为什么同一个程序不同权限的输出不同?
【问题讨论】:
-
您的
ls执行导致了段错误。所以你应该显示ls代码。并在发生 seg 错误时显示 gdb 中的堆栈跟踪。 -
您的
ls正在调用 vfprintf() 并带有 NULL 第一个参数(文件 *) -
你好@kaylum为什么相同的代码不会导致root权限的seg错误?我正在使用 fork+execvp 系统调用执行 ls。
-
因为 root 对
PATH有不同的设置,而您正在操纵环境。 -
您如何展示该代码,然后我们将讨论可能的问题?特别是,最好能看到触发 seg 错误的确切代码。