2010-12-18 35 views
1

问题::提供到c登录名和密码++像预期脚本的Unix/Linux

我想远程登录SSH的服务器,并执行一些命令和检索excuted命令的输出。

解决方案::

我一直在使用它我的“expect脚本”在我的perl脚本,然后做处理取得一致。但是,它太慢了,需要大约10秒才能获得远程进程的PID,然后检查其内存和CPU使用情况。

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

要求::

是否有可能acheive在C相同/ ++不使用使用管道或FIFO任何额外的库C 2 ()似乎是一个选项,但它只是单向的(双向只存在* BSD),并且使用FIFO,我不知道如何使ssh命令输入和输出连接到FIFO以及SSH命令需要登录和密码始终来自终端。

在此先感谢。

+0

fork()和exec()会诀窍吗?如果我dup2()子进程的标准输入和标准输出,然后执行SSH命令。 – Arunmu 2010-12-18 08:32:10

+0

真正的问题是什么让脚本变慢:执行速度,带宽或延迟。但是这当然是可能的。 – 2010-12-18 12:20:59

回答

1

这是可能的,但它需要一个lot的工作和一个完整的程序来做到这一点太长,张贴在这里。特别是在读写交错时应考虑I/O缓冲。然而,单个写入阶段后跟单个读取阶段将非常容易。

在任何情况下,我建议使用socketpair而不是管道。这些允许双向通信,而管道是单向的(所以你需要两个管道,即四个文件描述符)。

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] 
} 

此外,还要确保你得到合适的报价,如果你需要构建/解析SSH命令为argv式的缓冲器。如果您需要示例代码(或对问题的讨论),请查看Git中的quote.c

+0

是的,你是对的。我需要一些时间来实施它。 – Arunmu 2010-12-18 12:20:20