从php网页启动并行ssh

从php网页启动并行ssh,php,perl,shell,Php,Perl,Shell,因此,我有5台云计算机在运行,我的第一台是作为apache服务器设置的。我的目标是让用户点击网页上的submit按钮,它将在我的第一台机器上运行并行ssh,并在其他云机器上启动脚本。我让网页运行,脚本运行,这是我试图从index.php启动并行ssh的尝试 因此,“master.txt”位于第一台保存其他云机器信息的云机器上。StrictHostKeyChecking用于忽略安全检查。perl命令将在所有云计算机上启动。我知道这个问题相当令人困惑,但我对php和perl都是新手,我真的需要这个项

因此,我有5台云计算机在运行,我的第一台是作为apache服务器设置的。我的目标是让用户点击网页上的submit按钮,它将在我的第一台机器上运行并行ssh,并在其他云机器上启动脚本。我让网页运行,脚本运行,这是我试图从index.php启动并行ssh的尝试

因此,“master.txt”位于第一台保存其他云机器信息的云机器上。StrictHostKeyChecking用于忽略安全检查。perl命令将在所有云计算机上启动。我知道这个问题相当令人困惑,但我对php和perl都是新手,我真的需要这个项目的答案。很抱歉,这是一个大命令,但我不得不将它们分成几行,因为它不会显示在这里。

这是一个大命令。 请允许我提出这个建议,以便更好地理解。 在下面的代码中,我经常使用escapeshellarg来确保所有shell参数都被正确转义,并且不会受到攻击。这也取决于你的变量是否可信,但除非每个参数变量实际上是由多个参数或其他不太常见的东西组成的,否则就不会有什么坏处

<?php
$result = shell_exec(
    'parallel-ssh -h master.txt "-O StrictHostKeyChecking=no" ' . // SSH command
    '-t 5 ' . // 5 second timeout on each host
    '-l divx ' . // User
    '-i ' . // Inline mode used for troubleshooting.. Take this out once it works.
    '-P ' . // Print the output. This will only return it so it is stored in $result
    escapeshellarg(
        'perl /mnt/nas-storage/EncoderSetup/commTools/con.pl ' . // Executes a perl file
        escapeshellarg($input) . ' ' . // $input arg to perl command
        escapeshellarg($output) . ' ' . // $output arg to perl command
        escapeshellarg($intraperiod) . ' ' . // $intraperiod arg to perl command
        escapeshellarg($res) . ' ' . // $res arg to perl command
        escapeshellarg($qp) . ' ' . // $qp arg to perl command
        escapeshellarg($framerate) . ' ' . // $framerate arg to perl command
        escapeshellarg($startframe) . ' ' . // $startframe arg to perl command
        escapeshellarg($numgop) . ' ' . // $numgop arg to perl command
        escapeshellarg($enc) . ' ' . // $enc arg to perl command
        escapeshellarg($cfg) . ' ' . // $cfg arg to perl command
        escapeshellarg($sao) . ' ' . // $sao arg to perl command
        escapeshellarg($wafrosync) . ' ' . // $wafrosync arg to perl command
        escapeshellarg($amp) . ' ' . // $amp arg to perl command
        escapeshellarg($tmvp) . ' ' . // $tmvp arg to perl command
        escapeshellarg($transkp) . ' ' . // $transkp arg to perl command
        escapeshellarg($fasttranskp) . ' ' . // $fasttranskp arg to perl command
        escapeshellarg($goploc) // $goploc arg to perl command
    )
);
print $result;
然后,pssh可能正在为每个主机请求密码。我注意到您正在使用-A选项,该选项要求输入密码。使用php中的shell_exec无法做到这一点,因为脚本将永远挂起并等待密码。相反,您需要设置SSH密钥,以便您的第一台云服务器可以在无需密码的情况下SSH到其他云服务器。设置基于SSH公钥的身份验证实际上非常简单。但如果你以前从未做过,就不会。我相信有很多关于如何设置的帖子。程序基本上是:

  • 生成公钥和私钥(无密码短语)

    • 在第一台云服务器上键入以下命令:
      ssh-keygen
    • 当它询问您时,不要输入密码短语
  • 将id_rsa.pub文件复制到每个辅助云服务器上的~/.ssh/authorized_keys文件中

  • 确保.ssh文件夹在每个云服务器上都有700个权限

  • 确保.ssh/authorized_keys文件在每个云服务器上拥有600个权限

  • 如果一切按计划进行,您应该能够从主云服务器安全地在每个云服务器上执行命令,而无需密码。现在,您可以运行您的命令,它应该可以工作了。。。。或者至少向您提供输出,说明为什么没有这样做,以便您可以继续进行故障排除

    另一个问题是运行shell_exec的用户。如果您在主云服务器上运行web服务器,则必须确保当前用户(通常是apache)在apache主目录所在的.ssh文件夹中(通常是/var/www/)拥有id_rsa文件。因此,您应该将id_rsa文件放在/var/www/.ssh/文件夹中,并确保它属于apache。另外,确保它是chmod 600以保护它


    还有其他安全问题,如保护您的id_rsa文件。不要在您的服务器上运行任何不受信任的脚本,也不要与为自己的网站上载自己文件的用户一起使用任何虚拟主机。安全问题的出现是因为任何作为apache运行的脚本都可以轻松访问并破坏您的id_rsa文件。。。哎呀。任何有权访问此文件的人都可以轻松访问您的每个云服务器。。。因此,保护它不应掉以轻心。

    如果您通过libssh2或phpseclib连接到每台服务器,并在每台机器上运行这样的命令,您可能会有一个更轻松的时间?

    是的,我很困惑,这里的重点是什么?你想要达到什么?你得到的是什么?而我没有得到。如果我在shell_exec语句之后放一个print语句,它会打印它。所以,基本上,我认为它只看命令而忽略它。我认为亚马逊提供的编码器服务“亚马逊弹性代码转换器”只是创建它。以希望以#mkdir~/.sshSo的身份运行perl脚本的用户身份执行以下命令。辅助云计算机上没有.ssh文件夹,我创建了它。在第一台云计算机上,当我运行ssh-keygen时,它在我的主文件夹下创建了.ssh文件夹,因此我在/var/www中创建了另一个.ssh,并将id_-rsa文件复制到了上面。对吗?显然,它仍然没有向我展示任何东西。好吧,为了给你一个更详细的答案(以及针对你的情况的正确答案),我需要知道哪个用户正在执行并行ssh命令。将此添加到最后的php脚本中。。。在shell_exec和所有事情之后。。。。打印获取当前用户();
    [FAILURE] server.hostname Exited with error code 255