gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:33 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com