【发布时间】:2014-01-04 18:59:09
【问题描述】:
我正在 Windows 上打包一个程序,希望能够从外部调用 OpenSSH。因此,我需要将 ssh.exe 与其打包,并且我需要强制 ssh.exe 始终使用自定义命令行参数(特别是 -F 来指定它应该使用的配置文件)调用。没有办法强制调用程序执行此操作,并且在 Windows 中也没有简单的方法可以执行此操作(无论如何我都可以想到 - 符号链接或 cmd 脚本不起作用)所以我只是要写一个C 中的简单包装器来做到这一点。
这是我整理的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int ret;
char **newv = malloc((argc + 2) * sizeof(*newv));
memmove(newv, argv, sizeof(*newv) * argc);
newv[argc] = "-F ssh.conf";
newv[argc+1] = 0;
ret = execv("ssh.orig.exe", newv);
printf("execv failed with return value of %i", ret);
return ret;
}
然后我在 Cygwin 中使用 GCC 4.6.3 编译这段代码,它运行时没有错误;但是,关于输入和输出有一个奇怪的行为。当您在控制台上输入(确认主机的真实性并输入密码等)时,只有部分输入出现在控制台上。例如,如果我输入单词“yes”并按enter,控制台上只会出现“e”,SSH 将显示需要输入“yes”或“no”的错误.从 Windows 命令提示符执行此操作将导致您的输入返回到命令 propmt,因此当您键入“yes”并按 enter 时,您会得到“yes”不被识别为内部或外部命令...”消息,就好像在命令提示符下输入了输入一样。最终 SSH 会在那之后超时。
所以,我显然在这里遗漏了一些东西,我假设它与 execv 的工作方式有关(至少是它的 POSIX Cygwin 版本)。
这里有什么我遗漏的东西还是有其他选择?我想知道是否可能需要分叉并将 I/O 重定向到分叉(尽管 fork() 似乎不起作用 - 但 Windows 上还有其他问题)。我尝试使用 process.h 中的 _execv,但在获取正确的代码时遇到了问题(也可能与尝试使用 gcc 有关)。
也有可能有一种我没有想到的非编程方式来做到这一点,但我尝试过的所有可能性似乎都不起作用。
想法?
【问题讨论】: