我在Windows上打包了一个程序,希望可以从外部调用OpenSSH。因此,我需要使用它打包ssh.exe,并且必须强制使用总是通过自定义命令行参数(特别是-F指定它应该使用的配置文件)来调用ssh.exe。没有方法可以强制调用程序执行此操作,也没有简单的方法可以在Windows中执行此操作(无论如何我都可以想到-符号链接(symbolic link)或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版本)。
我在这里想念的东西还是有其他选择吗?我想知道是否需要将其 fork 并将I / O重定向到 fork (尽管fork()似乎不起作用-但Windows上还有其他问题)。我尝试使用来自process.h的_execv,但是在获取正确的代码方面遇到了问题(也可能与尝试使用gcc有关)。
我可能还没有想到有一种非编程的方式来做到这一点,但是我尝试过的所有可能性似乎都没有用。
有什么想法吗?
最佳答案
我最终找到了解决这个问题的方法。我敢肯定还有其他方法可以做到这一点,但这似乎可以解决该问题并且效果很好。我用以下代码替换了execv行:
ret = spawnv(P_WAIT, "ssh.orig.exe", newv);
您必须使用“P_WAIT”,否则父进程完成并退出,并且您仍然遇到与以前相同的问题。这将导致父进程等待,但仍将输入和输出传输到子进程。
关于c - 围绕OpenSSH的简单C包装器(在Windows上为Cygwin),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20925335/