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

时间:2014-01-04 18:59:09

标签: c windows ssh cygwin

我正在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有关)。

也可能有一种非编程方式可以做到这一点,我还没有想过,但我尝试过的所有可能性似乎都没有工作

思想?

1 个答案:

答案 0 :(得分:1)

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

ret = spawnv(P_WAIT, "ssh.orig.exe", newv);

您必须使用'P_WAIT'否则父进程完成并退出,您仍然遇到与以前相同的问题。这会导致父进程等待,但仍会将输入和输出传输到子进程。