C++ 通过c+提供登录和密码+;类似于Unix/Linux中的expect脚本

C++ 通过c+提供登录和密码+;类似于Unix/Linux中的expect脚本,c++,c,ssh,ipc,unix,C++,C,Ssh,Ipc,Unix,问题:: 我想通过SSH远程登录到服务器,执行一些命令并检索已执行命令的输出 解决方案:: 我在perl脚本中使用“expect脚本”实现了同样的效果,然后对其进行处理。但是,它太慢了,需要大约10秒钟才能获得远程进程的PID,然后检查其内存和CPU使用情况 使用ssh-keygen生成rsa-ID是一种选择,但双向通信仍然存在一个问题 要求:: 是否可以在C/C++中实现同样的功能,而不使用任何使用管道或FIFO的额外库 Popen()似乎是一个选项,但它只是单向的(双向存在仅用于*BSD),

问题::

我想通过SSH远程登录到服务器,执行一些命令并检索已执行命令的输出

解决方案::

我在perl脚本中使用“expect脚本”实现了同样的效果,然后对其进行处理。但是,它太慢了,需要大约10秒钟才能获得远程进程的PID,然后检查其内存和CPU使用情况

使用ssh-keygen生成rsa-ID是一种选择,但双向通信仍然存在一个问题

要求::

是否可以在C/C++中实现同样的功能,而不使用任何使用管道或FIFO的额外库

Popen()似乎是一个选项,但它只是单向的(双向存在仅用于*BSD),并且使用FIFO,我不知道如何使ssh命令输入和输出连接到FIFO,而且ssh命令需要始终从终端登录和密码


提前感谢。

这是可能的,但要完成这项工作需要大量的工作,而且一个完整的程序太长,无法在此发布。尤其是读写交错时,应考虑I/O缓冲。不过,一个写阶段接着一个读阶段是相当容易的

在任何情况下,我都建议使用a而不是管道。它们允许双向通信,而管道是单向的(因此需要两个管道,即四个文件描述符)


另外,如果需要将SSH命令构造/解析到
argv
样式的缓冲区中,请确保引用正确。如果您需要示例代码(或问题讨论),请从中查看。

这是可能的,但需要做大量工作,而且完整的程序太长,无法在此处发布。尤其是读写交错时,应考虑I/O缓冲。不过,一个写阶段接着一个读阶段是相当容易的

在任何情况下,我都建议使用a而不是管道。它们允许双向通信,而管道是单向的(因此需要两个管道,即四个文件描述符)


另外,如果需要将SSH命令构造/解析到
argv
样式的缓冲区中,请确保引用正确。如果您需要示例代码(或问题讨论),请从中查看。

fork()和exec()会起作用吗?如果我dup2()复制子进程的stdin和stdout,然后执行SSH命令,真正的问题是什么让脚本变慢了:执行速度、带宽或延迟。但这当然是可能的。fork()和exec()会起作用吗?如果我dup2()复制子进程的stdin和stdout,然后执行SSH命令,真正的问题是什么让脚本变慢了:执行速度、带宽或延迟。但这当然是可能的。是的,你是对的。按照我现在的时间表来实施它需要一些时间。是的,你是对的。这将需要一些时间来实施它与时间表,我有。
enum { FROMCHILD = 0, TOCHILD = 1 };
int fd[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, fd); // check for errors

switch (fork()) {
  case -1:
    // handle error
  case 0:
    // child
    dup2(fd[TOCHILD],   0);
    dup2(fd[FROMCHILD], 1);
    // try to exec
    _exit(1);
  default:
    // parent: we may read from fd[FROMCHILD] and write to fd[TOCHILD]
}