在空环境中生成时,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)