围绕OpenSSH的简单C包装(在Windows上使用Cygwin)

围绕OpenSSH的简单C包装(在Windows上使用Cygwin),c,windows,ssh,cygwin,C,Windows,Ssh,Cygwin,我正在Windows上打包一个程序,希望能够从外部调用OpenSSH。因此,我需要用它打包ssh.exe,并且我需要强制ssh.exe始终使用自定义命令行参数调用(特别是-F来指定它应该使用的配置文件)。没有办法强制调用程序执行此操作,在Windows中也没有其他简单的方法来执行此操作(无论如何,我可以想到-符号链接或cmd脚本将不起作用),因此我只打算用C编写一个简单的包装器来执行此操作 这是我编写的代码: #include <stdio.h> #include <stdli

我正在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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int ret;
字符**newv=malloc((argc+2)*sizeof(*newv));
memmove(新版本、argv、sizeof(*新版本)*argc);
newv[argc]=“F ssh.conf”;
newv[argc+1]=0;
ret=execv(“ssh.orig.exe”,newv);
printf(“execv失败,返回值为%i”,ret);
返回ret;
}
然后我在Cygwin中使用GCC4.6.3编译了这段代码,它运行时没有错误;然而,在输入和输出方面有一种奇怪的行为。当您在控制台上输入(确认主机的真实性并输入密码等)时,控制台上只显示部分输入。例如,如果我键入单词“yes”并按enter键,控制台上将只显示“e”,SSH将显示一个关于需要键入“yes”或“no”的错误。在Windows命令提示符下执行此操作将导致您的输入返回到命令提示,因此当您键入“是”并按enter键时,您会收到“是”不被识别为内部或外部命令…”消息,就好像输入是在命令提示符下键入的一样。最终SSH将在这之后超时

所以,这里我显然遗漏了一些东西,我假设这与execv的工作方式有关(至少是posixcygwin版本)

这里有我遗漏的东西吗,或者有其他选择吗?我想知道是否需要分叉并将I/O重定向到分叉(虽然fork()似乎不起作用,但Windows上还有其他问题)。我尝试使用process.h中的_execv,但在获取正确的代码时遇到了问题(也可能与尝试使用gcc有关)

也有可能有一种非编程的方式来实现这一点,我没有想到,但我尝试过的所有可能性似乎都不起作用


想法?

我最终找到了解决这个问题的办法。我相信还有其他方法可以做到这一点,但这似乎解决了问题,效果很好。我已将execv行替换为以下代码:

ret = spawnv(P_WAIT, "ssh.orig.exe", newv);
您必须使用“p_WAIT”,否则父进程将完成并退出,您仍然会遇到与以前相同的问题。这会导致父进程等待,但仍会将输入和输出传输到子进程