Pra*_*oon 3 ssh perl arguments space
这就是我所拥有的 - 服务器A上的CGI脚本获取在webform中输入的参数,创建一个远程ssh命令,该命令调用服务器B上的另一个perl文件,并将所有参数作为参数传递给ash命令.服务器B上的Perl文件解析参数n之后运行.
现在因为我不会一直填充所有参数,所以我在服务器A上的CGI中传递了一个附加到每个参数的"="字符,在服务器B上处理之前,我将最后一个字符切换为"=" ".
但是,对于可以有空间的参数,这会失败.为了解决这个问题,我可以将每个参数包含在///"(基本上是一个斜线来逃避",然后是一个斜线以逃避其他斜杠),然后我追加"="(一旦我将每个参数括起来,它可能会被丢弃) ),这是我想要实现的最佳方式吗?
我建议使用IPC :: Open2或IPC :: Open3,并使用您的进程B作为过滤器,而不是调用命令并读取其输出:写入,读出.此时,您完全消除了shell.而且,根据我的经验,消除外壳总是一件好事.
然后,为了使事情变得非常简单,您可以通过IPC :: Open [23]运行命令,将序列化数据写入其中(通过JSON或Storable),关闭写入管道(以便另一方获取eof),并等待数据.在另一端,读取标准输入,反序列化,使用它,并再次序列化返回数据.回到CGI服务器,反序列化您收到的数据,然后离开.如果你需要进行双重或三重弹跳(通过一台机器ssh到另一台机器),这也很有效.
可以输入足够的报价以使其按照您想要的方式工作.这是中等痛苦的.但是,这方面有一些提示.首先,在CPAN上找到一些处理报价的东西. String :: ShellQuote可能有效.其次,尽可能避免使用shell.也就是说,而不是使用open my $pipe, "ssh $server '$cmd' |",使用open my $pipe, '-|', 'ssh', $server, $cmd.这将避免本地shell.这减少了你不必担心引用任何东西的次数.但是,每次进行另一次反弹时,您将不得不重新引用所有内容,因为每台远程计算机仍将使用远程shell.