c - Execlp vs Execl

  • 本文关键字:Execl vs Execlp c 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

兼容性

虽然POSIX指定了一组通用的Unix命令和功能,但许多程序都依赖于扩展。如果您的程序使用这些扩展,那么获取PATH中的第一个扩展可能不是一个好主意。

例如,在OSX上,/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_executablen");
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 

相关内容

  • 没有找到相关文章

最新更新