【问题标题】:Simple C Wrapper Around OpenSSH (with Cygwin on Windows)OpenSSH 周围的简单 C 包装器(在 Windows 上使用 Cygwin)
【发布时间】: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 有关)。

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

想法?

【问题讨论】:

    标签: c windows ssh cygwin


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 2021-07-17
      • 2019-04-04
      • 2023-03-29
      • 2010-12-18
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多