Execlp 与 Execl
Execlp vs Execl
在什么情况下使用 execl
比 execlp
更好?
我认为当一个程序位于两个不同的文件夹中时,使用 execlp
可能会导致混淆,但我不知道这是否是唯一的情况。
我问是因为有人会认为写 execlp("ls", ...)
比写 execl("/bin/ls", ...)
.
更容易
安全
通过PATH
查找程序很方便,但也可能不安全。如果用户 PATH
中的目录是全局可写的,则可以将恶意程序注入 PATH
查找。这会影响 execlp
但不会影响 execl
。
例如,如果您有一个像 /foo/bar/bin:/home/you/bin:/usr/bin:/bin
这样的 PATH
并且 /foo/bar/bin
是世界可写的,那么有权访问该机器的人可以将恶意程序复制到 /foo/bar/bin/ls
.然后执行 ls
将 运行 /foo/bar/bin/ls
而不是 /bin/ls
。他们将能够像您一样执行命令并获得更大的访问权限。
因此,在已知位置引用特定的可执行文件通常是个好主意。或者在可执行文件中硬连线安全 PATH
。
兼容性
While there is a common set of Unix commands and features specified by POSIX,很多程序都依赖扩展。如果您的程序使用了这些扩展,那么获取 PATH
中的第一个可能不是一个好主意。
例如,在 OS X 上,/bin
和 /usr/bin
中安装的实用程序是 BSD 风格的。但是我的 PATH
中较早安装了 GNU 版本。设计为 OS X 上的 运行 的程序会想要显式使用,例如,/bin/ls
或 /usr/bin/tar
以确保他们获得这些实用程序的已知版本。
$ /usr/bin/tar --version
bsdtar 2.8.3 - libarchive 2.8.3
$ tar --version
tar (GNU tar) 1.29
如果您的可执行文件位于不同的文件夹或同一文件夹中,execl()
和 execlp()
都可以正常工作并且类似,但如果不同的文件夹,则需要设置 $PATH。
从 命令行 执行可执行文件(如 "ls")需要 execl()
,因为你不能使用 execlp()
案件。我在下面添加了快照。
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
if(argc!=2)
{
printf("Usage Msg: ./a.out userdefined_executable \n");
return;
}
//execl(argv[1],argv[1],NULL);//**it works**
execlp(argv[1],argv[1],NULL);//**it doesn't work**
return 0;
}
//Input will be like this, here "p1" is an user-defined executable.
//xyz@xyz:~/stack_overflow$ ./a.out p1
在什么情况下使用 execl
比 execlp
更好?
我认为当一个程序位于两个不同的文件夹中时,使用 execlp
可能会导致混淆,但我不知道这是否是唯一的情况。
我问是因为有人会认为写 execlp("ls", ...)
比写 execl("/bin/ls", ...)
.
安全
通过PATH
查找程序很方便,但也可能不安全。如果用户 PATH
中的目录是全局可写的,则可以将恶意程序注入 PATH
查找。这会影响 execlp
但不会影响 execl
。
例如,如果您有一个像 /foo/bar/bin:/home/you/bin:/usr/bin:/bin
这样的 PATH
并且 /foo/bar/bin
是世界可写的,那么有权访问该机器的人可以将恶意程序复制到 /foo/bar/bin/ls
.然后执行 ls
将 运行 /foo/bar/bin/ls
而不是 /bin/ls
。他们将能够像您一样执行命令并获得更大的访问权限。
因此,在已知位置引用特定的可执行文件通常是个好主意。或者在可执行文件中硬连线安全 PATH
。
兼容性
While there is a common set of Unix commands and features specified by POSIX,很多程序都依赖扩展。如果您的程序使用了这些扩展,那么获取 PATH
中的第一个可能不是一个好主意。
例如,在 OS X 上,/bin
和 /usr/bin
中安装的实用程序是 BSD 风格的。但是我的 PATH
中较早安装了 GNU 版本。设计为 OS X 上的 运行 的程序会想要显式使用,例如,/bin/ls
或 /usr/bin/tar
以确保他们获得这些实用程序的已知版本。
$ /usr/bin/tar --version
bsdtar 2.8.3 - libarchive 2.8.3
$ tar --version
tar (GNU tar) 1.29
如果您的可执行文件位于不同的文件夹或同一文件夹中,execl()
和 execlp()
都可以正常工作并且类似,但如果不同的文件夹,则需要设置 $PATH。
execl()
,因为你不能使用 execlp()
案件。我在下面添加了快照。
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
if(argc!=2)
{
printf("Usage Msg: ./a.out userdefined_executable \n");
return;
}
//execl(argv[1],argv[1],NULL);//**it works**
execlp(argv[1],argv[1],NULL);//**it doesn't work**
return 0;
}
//Input will be like this, here "p1" is an user-defined executable.
//xyz@xyz:~/stack_overflow$ ./a.out p1