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

标签 c windows ssh cygwin

我在 Windows 上打包一个程序,希望能够从外部调用 OpenSSH。因此,我需要用它打包 ssh.exe,并且我需要强制始终使用自定义命令行参数调用 ssh.exe(特别是 -F 以指定它应该使用的配置文件)。没有办法强制调用程序执行此操作,并且在 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 命令提示符执行此操作将导致您的输入返回到命令提示符,因此当您键入“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/

相关文章:

c - 我怎样才能使 fscanf 更多 'stringent' 或完全不同的方法来解决我的额外行?

c - printf 以连续函数作为参数,未定义的行为

windows - 有没有办法将 Windows 桌面应用程序转换为 Universal UWP 和 Vice Versa?

windows - 为什么我的代码执行得更慢?

c# - 如何在给定设备路径的情况下获取 USB_DEVICE_DESCRIPTOR

c - 为什么人们要定义自己的 offsetof?

c - 双指针不会在函数中得到 malloc

linux - ssh-keygen:当提示“输入用于保存 key 的文件(/home/***/.ssh/id_rsa):”时,我不小心输入了“y”:

ruby - 使用 Ruby/Net::SSH 进行远程数据库连接的本地到远程端口转发

visual-studio-code - 如何在 Visual Studio Code Remote - SSH 扩展中确认新的远程主机 key ?