Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在空环境中生成时,shell如何猜测路径?_Shell_Unix_Path_Exec_Environment Variables - Fatal编程技术网

在空环境中生成时,shell如何猜测路径?

在空环境中生成时,shell如何猜测路径?,shell,unix,path,exec,environment-variables,Shell,Unix,Path,Exec,Environment Variables,使用以下代码通过/bin/shnworks fine运行ls命令: #include <unistd.h> int main(int argc, char **argv, char **envp) { execle("/bin/sh", "sh", "-c", "ls", (char*)NULL, envp); } 它也有效 即使我没有通过任何环境,shell如何知道到ls的路径?从execle手册页: 在某些其他系统上,默认路径(在环境执行此操作时使用) 不包含变量路径)

使用以下代码通过
/bin/sh
nworks fine运行
ls
命令:

#include <unistd.h>
int main(int argc, char **argv, char **envp) {
    execle("/bin/sh", "sh", "-c", "ls", (char*)NULL, envp);
}
它也有效


即使我没有通过任何环境,shell如何知道到
ls
的路径?

execle
手册页:

在某些其他系统上,默认路径(在环境执行此操作时使用)
不包含变量路径)已列出当前工作目录
在/bin和/usr/bin之后,作为反特洛伊木马措施。Linux使用
这里是传统的“当前目录优先”默认路径。


因此,我猜您的默认路径是
/:/bin:/usr/bin
,如果在Linux上,则为
/bin:/usr/bin

可执行文件
手册页:

在某些其他系统上,默认路径(在环境执行此操作时使用)
不包含变量路径)已列出当前工作目录
在/bin和/usr/bin之后,作为反特洛伊木马措施。Linux使用
这里是传统的“当前目录优先”默认路径。


因此,我猜您的默认路径是
/:/bin:/usr/bin
,如果在Linux上,则为
/bin:/usr/bin

/bin/sh
如果在启动时变量尚未定义,则会自行设置许多变量。通过运行
env-ish-cset

例如,在我的系统上:

$ env -i sh -c set
IFS='   
'
OPTIND='1'
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
PPID='2299'
PS1='$ '
PS2='> '
PS4='+ '
PWD='/home/jb'
请注意这是如何包括路径的。还要注意,PATH只获取变量的状态;它不会升级到导出的环境。用
env-ish-c env
交叉检查

$ env -i sh -c env
PWD=/home/jb

/bin/sh
如果变量在启动时尚未定义,则会自行设置许多变量。通过运行
env-ish-cset

例如,在我的系统上:

$ env -i sh -c set
IFS='   
'
OPTIND='1'
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
PPID='2299'
PS1='$ '
PS2='> '
PS4='+ '
PWD='/home/jb'
请注意这是如何包括路径的。还要注意,PATH只获取变量的状态;它不会升级到导出的环境。用
env-ish-c env
交叉检查

$ env -i sh -c env
PWD=/home/jb

让我们按照以下方式重新编写程序:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv, char **envp) 
{
        execle("/bin/sh", "sh", "-c", "ls", (char*)NULL, NULL);
        return 0;
}
#包括
#包括
内部主(内部argc、字符**argv、字符**envp)
{
execle(“/bin/sh”、“sh”、“-c”、“ls”、(char*)NULL、NULL);
返回0;
}
现在,编译并运行之后,您将在输出中找到以下代码段:

<... bsearch resumed> )                                                     = NULL
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/usr/local/sbin", 15)                                   = 0x0061cbe0
strcpy(0x0061cbf0, "ls")                                                    = 0x0061cbf0
__xstat64(1, "/usr/local/sbin/ls", 0x7fffb173e120)                          = -1
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/usr/local/bin", 14)                                    = 0x0061cbe0
strcpy(0x0061cbef, "ls")                                                    = 0x0061cbef
__xstat64(1, "/usr/local/bin/ls", 0x7fffb173e120)                           = -1
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/usr/sbin", 9)                                          = 0x0061cbe0
strcpy(0x0061cbea, "ls")                                                    = 0x0061cbea
__xstat64(1, "/usr/sbin/ls", 0x7fffb173e120)                                = -1
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/usr/bin", 8)                                           = 0x0061cbe0
strcpy(0x0061cbe9, "ls")                                                    = 0x0061cbe9
__xstat64(1, "/usr/bin/ls", 0x7fffb173e120)                                 = -1
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/sbin", 5)           
strcpy(0x0061cbe6, "ls")                                                    = 0x0061cbe6
__xstat64(1, "/sbin/ls", 0x7fffb173e120)                                    = -1
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/bin", 4)                                               = 0x0061cbe0
strcpy(0x0061cbe5, "ls")                                                    = 0x0061cbe5
__xstat64(1, "/bin/ls", 0x7fffb173e120)                                     = 0
strlen("ls")                                                                = 2
malloc(26)                                                                  = 0x025fa110
strcpy(0x025fa123, "ls")                                                    = 0x025fa123
realloc(NULL, 160)                                                          = 0x025fa140
fork()                         
)=NULL
strlen(“ls”)=2
memcpy(0x0061cbe0,“/usr/local/sbin”,15)=0x0061cbe0
strcpy(0x0061cbf0,“ls”)=0x0061cbf0
__xstat64(1,“/usr/local/sbin/ls”,0x7fffb173e120)=-1
strlen(“ls”)=2
memcpy(0x0061cbe0,“/usr/local/bin”,14)=0x0061cbe0
strcpy(0x0061cbef,“ls”)=0x0061cbef
__xstat64(1,“/usr/local/bin/ls”,0x7fffb173e120)=-1
strlen(“ls”)=2
memcpy(0x0061cbe0,“/usr/sbin”,9)=0x0061cbe0
strcpy(0x0061cbea,“ls”)=0x0061cbea
__xstat64(1,“/usr/sbin/ls”,0x7fffb173e120)=-1
strlen(“ls”)=2
memcpy(0x0061cbe0,“/usr/bin”,8)=0x0061cbe0
strcpy(0x0061cbe9,“ls”)=0x0061cbe9
__xstat64(1,“/usr/bin/ls”,0x7fffb173e120)=-1
strlen(“ls”)=2
memcpy(0x0061cbe0,“/sbin”,5)
strcpy(0x0061cbe6,“ls”)=0x0061cbe6
__xstat64(1,“/sbin/ls”,0x7fffb173e120)=-1
strlen(“ls”)=2
memcpy(0x0061cbe0,“/bin”,4)=0x0061cbe0
strcpy(0x0061cbe5,“ls”)=0x0061cbe5
__xstat64(1,“/bin/ls”,0x7fffb173e120)=0
strlen(“ls”)=2
malloc(26)=0x025fa110
strcpy(0x025fa123,“ls”)=0x025fa123
realloc(NULL,160)=0x025fa140
fork()
如您所见,在使用
'/bin/ls'
执行fork()之前,它显然在寻找正确的路径,这是
'ls'
的正确路径。如果给定了
$PATH
变量,
sh
将尝试这些路径来查找
ls
的位置。由于在这种情况下没有提供
$PATH
,因此仍然尝试合理的路径(例如
/bin
/usr/bin
/sbin

execle
手册页:

如果未指定此路径变量, 默认路径是根据 _路径\定义中的路径定义, 设置为/usr/bin:/bin


让我们按照以下方式重新编写程序:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv, char **envp) 
{
        execle("/bin/sh", "sh", "-c", "ls", (char*)NULL, NULL);
        return 0;
}
#包括
#包括
内部主(内部argc、字符**argv、字符**envp)
{
execle(“/bin/sh”、“sh”、“-c”、“ls”、(char*)NULL、NULL);
返回0;
}
现在,编译并运行之后,您将在输出中找到以下代码段:

<... bsearch resumed> )                                                     = NULL
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/usr/local/sbin", 15)                                   = 0x0061cbe0
strcpy(0x0061cbf0, "ls")                                                    = 0x0061cbf0
__xstat64(1, "/usr/local/sbin/ls", 0x7fffb173e120)                          = -1
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/usr/local/bin", 14)                                    = 0x0061cbe0
strcpy(0x0061cbef, "ls")                                                    = 0x0061cbef
__xstat64(1, "/usr/local/bin/ls", 0x7fffb173e120)                           = -1
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/usr/sbin", 9)                                          = 0x0061cbe0
strcpy(0x0061cbea, "ls")                                                    = 0x0061cbea
__xstat64(1, "/usr/sbin/ls", 0x7fffb173e120)                                = -1
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/usr/bin", 8)                                           = 0x0061cbe0
strcpy(0x0061cbe9, "ls")                                                    = 0x0061cbe9
__xstat64(1, "/usr/bin/ls", 0x7fffb173e120)                                 = -1
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/sbin", 5)           
strcpy(0x0061cbe6, "ls")                                                    = 0x0061cbe6
__xstat64(1, "/sbin/ls", 0x7fffb173e120)                                    = -1
strlen("ls")                                                                = 2
memcpy(0x0061cbe0, "/bin", 4)                                               = 0x0061cbe0
strcpy(0x0061cbe5, "ls")                                                    = 0x0061cbe5
__xstat64(1, "/bin/ls", 0x7fffb173e120)                                     = 0
strlen("ls")                                                                = 2
malloc(26)                                                                  = 0x025fa110
strcpy(0x025fa123, "ls")                                                    = 0x025fa123
realloc(NULL, 160)                                                          = 0x025fa140
fork()                         
)=NULL
strlen(“ls”)=2
memcpy(0x0061cbe0,“/usr/local/sbin”,15)