【问题标题】:Open a Shell Program, pass it params, and return the results打开一个Shell程序,传递参数,并返回结果
【发布时间】:2015-04-12 21:16:06
【问题描述】:

我正在用 c++ 编写一个 shell 脚本,我正在尝试编写一种方法来通过比较系统运行时生成的输出和我的 shell diff-wise 来进行一些基本的单元测试。

根据阅读大量 StackOverflow 文章,这是我用来捕获简单 ls 命令输出的方法:

FILE *syst;
char buff[512];
string systout ( "" );
if(!(syst = popen("ls ", "r"))){
    cout << "Failed! " << endl;
    return 1;
}

while(fgets(buff, sizeof(buff), syst)!=NULL){
    systout.append(buff);
}

fflush(syst);   

pclose(syst);

这很好用。

问题是我找不到让它适用于我的 shell 脚本的方法。 通常我使用sudo ./shell 运行它,然后使用ls

这是我现在拥有的,但它不起作用。我认为它没有找到我的外壳或其他东西,但没有任何输出。我知道 shell 可以工作,因为我手动运行了它,结果符合预期。

FILE *shel;
char buff2[512];
string shelout ( "" );
if(!(shel = popen("sudo ./shell ls ", "r"))){
    cout << "Failed! " << endl;
    return 1;
}

while(fgets(buff2, sizeof(buff2), shel)!=NULL){
    shelout.append(buff2);
}

fflush(shel);

pclose(shel);

有什么想法吗?

【问题讨论】:

  • "通常我使用sudo ./shell 运行它,然后使用ls。"所以在我看来,这与运行sudo ./shell ls 不同。也许您想将字符串ls写入子进程的STDIN?
  • 您可能应该使用sudo 运行您的程序并在不添加前缀的情况下调用脚本,但这取决于您在做什么。

标签: c++ linux shell


【解决方案1】:

当您说“通常我使用 sudo ./shell,然后 ls 运行它”时,您的意思是:

  1. 你执行“sudo”,传递一个参数“./shell”。

  2. sudo 运行“./shell”(作为 root,但这与这里无关)。

  3. “shell”可执行文件提示输入某种命令,您键入“ls”即可获得输出。

您正在尝试通过以下代码使其自动化:

popen("sudo ./shell ls ", "r")

这是做什么的

  1. 执行“sudo”,并向“sudo”命令传递两个参数:“./shell”和“ls”。

这与第一部分的步骤 1 到 3 完全不同;这就是为什么它不起作用。

您要做的最简单的事情是修改您的“./shell”以支持将命令作为参数传递给它的替代调用方式,而不是让“./shell”以交互方式提示执行命令。

【讨论】:

    【解决方案2】:

    您可以使用script 命令来捕获您的输入和输出。 之后,您可以比较两种情况的输出(使用 diffcmp 并使用简单程序过滤差异)。

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多