perl - 使用 SSH,从另一个 perl 文件远程执行 perl 文件并传递包含空格的参数的最佳方法是什么?

标签 perl ssh arguments space

这是我所拥有的- 服务器 A 上的 CGI 脚本获取在 web 表单中输入的参数,创建一个远程 ssh 命令,该命令调用服务器 B 上的另一个 perl 文件,并将所有参数作为参数传递给 ash 命令。服务器 B 上的 Perl 文件解析参数 n 之后进行操作。

现在,因为我不会一直填充所有参数,所以我在服务器 A 上的 CGI 的每个参数上附加了一个字符,例如“=”,在服务器 B 上处理之前,我将最后一个字符砍掉一个“=”。

但是,对于可以有空格的参数,这将失败。为了解决这个问题,我可以在添加“=”之前将每个参数括在///"中(基本上是一个斜线来转义“,然后是一个斜线来转义另一个斜线),然后再附加“=”(无论如何,一旦我附上每个参数,它可能会被丢弃),但这是实现我想要实现的最佳方式吗?

最佳答案

我建议使用IPC::Open2,而不是调用命令并读取其输出。或者可能 IPC::Open3并使用您的流程 B 作为过滤器:写入,读出。至此,您彻底消除了外壳。而且,根据我的经验,消除外壳总是一件好事。

然后,为了让事情变得非常简单,您通过 IPC::Open[23] 运行命令,向其写入序列化数据(通过 JSON 或 Storable),关闭写入管道(因此另一端获得 eof),并等待数据。在另一端,读取标准输入,反序列化它,使用它,然后再次序列化你的返回数据。回到 CGI 服务器,反序列化您收到的数据,然后离开。如果您需要进行两次或三次弹跳(通过一台机器 ssh 到另一台机器 ssh),这也非常有效。

可以添加足够多的引号以使其按您想要的方式工作。是中度疼痛。但是,这里有一些关于这个方向的提示。首先,在 CPAN 上找到一些东西它为您处理报价。 String::ShellQuote可能会奏效。其次,尽量避开外壳。也就是说,不要使用 open my $pipe, "ssh $server '$cmd' |",而是使用 open my $pipe, '-|', 'ssh', $server, $cmd。这将避免本地外壳。这减少了您不必担心引用任何内容的次数。但是每次执行另一次反弹时,您都必须重新引用所有内容,因为每台远程计算机仍将使用远程 shell。

关于perl - 使用 SSH,从另一个 perl 文件远程执行 perl 文件并传递包含空格的参数的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986572/

相关文章:

git - ssh 配置不工作。权限被拒绝(公钥)

docker - ssh-keygen : command not found in Docker

php - 获取方法的参数?

c# - 将方法名称和参数动态传递给thread.Start

oracle - Oracle DB链接不起作用

c# - Ubuntu终端上的.NET Core参数十进制错误

perl - Pod::Simple 没有输出

perl getopt::文件的长路径

xml - LWP::UserAgent 用于 XML POST 到 HTTPS 服务器不工作

perl - Perl 标识符中允许使用哪些字符?