【问题标题】:Casting Command Line Arguments?铸造命令行参数?
【发布时间】:2010-10-13 07:59:43
【问题描述】:

我有一个命令行可执行程序,它接受一个配置文件,因为它是启动的一个参数。配置文件只包含两行代码:

#ConfigFile.cfg
name=geoffrey
city=montreal

目前,我为此命令行可执行程序构建的包装程序将配置文件写入磁盘,然后将该写入的文件作为参数发送到命令行上启动程序。

> myProgram.exe configFile.cfg

是否可以将这些配置文件条目转换为配置文件,让我绕过将配置文件写入磁盘但仍允许程序像从配置文件中读取一样运行?

可能类似于以下内容:

> myProgram.exe configFile.cfg(name=geoffrey) configFile.cfg(city=montreal)

【问题讨论】:

  • 如果您编写了控制台应用程序,是什么阻止您自己这样做? (我想我理解这个问题,但不确定)。
  • 什么操作系统、shell等?
  • 我没有编写控制台应用程序,也无权访问代码,因此无法重写。我同时使用 unix 和 windows 命令行,因为它们的启动机制是相同的。

标签: command-line casting arguments


【解决方案1】:

如果您不控制要包装的程序的源代码,并且它还没有提供以其他方式接收输入的设施,那么您将发现它充其量是困难的。

一种可能性是拦截程序使用的文件打开和访问调用,尽管这是一种可怕的方法。

这可能涉及在程序和真实库之间注入您自己的包含(对于 C)fopenfclosefread 等的运行时库(例如使用 LD_LIBRARY_PATH 或类似的东西) ,这是假设它不是静态链接的。不适合胆小的人。

如果您担心人们会看到您的文件,有很多方法可以避免这种情况,例如在类似受保护的目录中创建具有rwx------ 权限的文件(假设类似 UNIX 的操作系统)。这可能比使用任何登录的小丑都可以通过ps 命令找到的命令行参数更安全。

如果您只是不想创建文件的麻烦,我想您会发现避免它的麻烦会更多。

根据你真正追求的是什么,将一个接受参数的程序组合在一起,将它们写入一个临时文件,称为 real 程序并具有该临时文件名,并不需要太多,然后删除该文件。

它仍会被写入磁盘,但这不再是您的包装程序的责任。大致如下(有点粗略,但你应该明白):

#include <stdio.h>
#define PROG "myProgram"
int main (int argCount, char *argVal[]) {
    char *tmpFSpec;
    FILE *fHndl;
    int i;
    char *cmdBuff;

    tmpFSpec = getTempFSpec(); // need to provide this.

    cmdBuff = malloc (sizeof(PROG) + 1 + strlen (tmpFSpec) + 1);
    if (cmdBuff == NULL) {
        // handle error.
        return 1;
    }

    fHndl = fopen (tmpFSpec, "w");
    if (fHndl == NULL) {
        // handle error.
        free (cmdBuff);
        return 1;
    }

    for (i = 1; i < argCount; i++)
        fprintf (fHndl, "%s\n", argVal[i]);

    sprintf (cmdBuff, "%s %s", PROG, tmpFSpec);
    system (cmdBuff);

    return 0;
}

【讨论】:

  • 哈哈。我会相信你的话,只需编写配置文件以避免头痛。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多