我正在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编译此代码,它运行时没有错误;但是,输入和输出方面存在奇怪的行为。当您在控制台上键入内容(确认主机的真实性并输入密码等)时,控制台上只会显示部分输入。例如,如果我输入单词&#39; yes&#39;然后按输入,只有&#39; e&#39;将出现在控制台上,SSH将显示有关需要键入“是”的错误。或者没有&#39;。从Windows命令提示符执行此操作将导致您的输入返回到命令propmt,因此当您键入&#39; yes&#39;然后按输入,即可获得&#39;是&#39;是不被视为内部或外部指令......&#39;消息,就像在命令提示符下输入输入一样。最终SSH将在此之后超时。
所以,我在这里显然遗漏了一些东西,我假设它与execv的工作方式有关(至少是POSIX Cygwin版本)。
我在这里缺少什么或有其他选择吗?我想知道是否可能需要将它分叉并将I / O重定向到fork(虽然fork()似乎不起作用 - 但Windows上还有其他问题)。我尝试使用process.h中的_execv,但是我遇到了正确的代码问题(也可能与尝试使用gcc有关)。
也可能有一种非编程方式可以做到这一点,我还没有想过,但我尝试过的所有可能性似乎都没有工作
思想?
答案 0 :(得分:1)
我最终找到了解决这个问题的方法。我确信还有其他方法可以做到这一点,但这似乎解决了这个问题并且效果很好。我用以下代码替换了execv行:
ret = spawnv(P_WAIT, "ssh.orig.exe", newv);
您必须使用'P_WAIT'否则父进程完成并退出,您仍然遇到与以前相同的问题。这会导致父进程等待,但仍会将输入和输出传输到子进程。