加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何通过包括execvp运行perl脚本?

发布时间:2020-12-15 23:22:55 所属栏目:大数据 来源:网络整理
导读:RHEL6 在C中,一个传递如何包含execvp,而execvp又运行perl可执行文件? (这是在打开污点模式时将PERL5LIB的缺失翻译替换为@INC的方法) 这个问题正在寻找暴民提供的答案的工作实施…… Why does @INC change when setgid-bit of C wrapper around perl script
RHEL6

在C中,一个传递如何包含execvp,而execvp又运行perl可执行文件? (这是在打开污点模式时将PERL5LIB的缺失翻译替换为@INC的方法)

这个问题正在寻找暴民提供的答案的工作实施……
Why does @INC change when setgid-bit of C wrapper around perl script change?.

我在一个使用execvp调用perl的C程序中包装perl脚本执行.由于启用了污点模式,因此@INC将不会加载$PERL5LIB的内容,因此我已使用“-I”将路径传递给perl可执行文件. perlsec说这是可能的(参考上面注释中的暴徒提供的答案).

我尝试这样做的尝试失败了.我的C程序试图将perl可执行文件作为execvp的第一个arg运行,然后将perl脚本作为参数列表的一部分运行.包含是perl脚本可执行语句的一部分.这是一个例子……

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

int main(int argc,char *argv[])
{
  char **args;  /*args will be passed to execvp.  prepend perl executable*/

  args=malloc(3*sizeof(char*));

  args[0]=malloc(sizeof("/tools/bin/perl -I/proj/perlmods")+1);
  strcpy(args[0],"/tools/bin/perl -I/proj/perlmods");

  args[1]=malloc(sizeof("/home/me/the.pl")+1);
  strcpy(args[1],"/home/me/the.pl");

  args[2]=NULL;

  execvp("/tools/bin/perl",args);

}

perl脚本很简单……

use html_mail;
print "In my.pln";
exit;

/ proj / perlmods有html_mail.pm

使用-I在linux提示符下直接执行perl执行…

% /tools/bin/perl -I /proj/perlmods /home/me/my.pl
In my.pl

但是运行C二进制文件却没有.它抱怨无法找到perl模块.但是,如果将/ proj / perlmods放入PERL5LIB中,那么它确实有效.所以我认为args是好的,因为perl脚本在args [1]中.

我相信我投入args的include语句被忽略了.如果我把它作为后缀添加到execvp中的perl可执行调用中…

execvp("/tools/bin/perl -I /proj/perlmods",args);

… C程序失败了,所以我不认为它属于那里.如果我把include作为perl脚本调用的一部分….

strcpy(args[1],"/home/me/the.pl -I /proj/perlmods");

… 它失败.如果我将它添加为args的新元素(args [3]),它只是作为arg传递给perl脚本并且没有任何影响.

我看了execvpe,但这看起来像是设置env vars的一种方法.

问题是,如何将包含信息实际传递给execvp?

解决方法

您需要将每个参数作为args中的单独条目.试试这个:

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

int
main(int argc,char *argv[])
{
    char *args[4];       /* args will be passed to execvp.  prepend perl executable */

    args[0] = "/tools/bin/perl";
    args[1] = "-I/proj/perlmods";
    args[2] = "/home/me/the.pl";
    args[3] = NULL;

    execvp(args[0],args);

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读