有几种方法可以做到这一点,速度和复杂性各不相同。 [自然:-)],最快的需要最多的设置。
(1) 您可以用输出管道替换您的两个命令序列。
您通过pipe(2) 创建一个管道。你做一个fork(2)。孩子将管道的输出文件附加到标准输出。孩子做execvp("ssh","remote","my_program","blah")。父级从管道的输入文件中读取结果。不需要临时文件。
这与您当前正在执行的操作类似,您为要执行的每个远程命令执行 ssh,但消除了临时文件和 scp。
(2) 您可以修改my_program 以接受来自stdin 的各种命令。我相信你已经在程序的“shell”模式下这样做了。
您通过pipe(2) 创建两个 管道。同样,fork 一个孩子。像以前一样将“from_remote”管道的输出文件附加到stdout。但是,现在,将“to_remote”管道的输入文件附加到stdin。
在父级中,使用“to_remote”管道的输出文件,发送命令行。远程 [通过“to_remote”管道的输入文件读取这一行,以 shell 的方式对其进行解析,然后 fork/execs 生成的命令。
遥控器上的子程序终止后,my_program 可以输出一个单独的行。
父级像以前一样读取数据,直到它看到这个分隔线。
现在,只要本地人想在远程服务器上做某事,管道就已经设置好了。它可以将后续命令写入“to_remote”管道的输出文件并重复该过程。
因此,不需要拆解和重新制作。只需设置一个ssh。这类似于使用套接字设置服务器,但我们使用的是ssh 和管道。
如果本地希望关闭连接,它可以在其末端关闭管道[或发送(例如)“!!!stop”命令]
如果您的远程目标命令是基于文本的,则分隔符相对容易(即您的程序都不会输出的一些字符串,例如:_jsdfl2_werou_tW__987_)。
如果您有原始二进制数据,my_program 可能必须以某种方式过滤/封装数据(例如,类似于PPP 协议对其flag 字符所做的操作)
(3) 您可以创建一个版本的my_program(例如my_program -server),它的作用类似于一个侦听套接字的服务器[在 shell 模式下]。
“协议”类似于上面的情况 (2),但可能更容易设置,因为网络套接字本质上是双向的(相对于 两个 pipe(2) 调用的需要以上)。
这里的一个优点是您直接通过 TCP 套接字进行通信,绕过了加密层的开销。
您可以在启动时启动远程服务器,也可以使用 [one-time] ssh 调用将其启动到后台。
还有一个额外的优势。代替上面的“分隔线”,本地可以为每个命令与服务器建立单独的套接字连接。这仍然比上面慢,但比在每次调用时创建 ssh 快。