从php网页启动parallel-ssh

时间:2013-07-18 04:02:57

标签: php perl shell

所以我有5台云计算机正在运行,而我的第一台云计算机已经设置为apache服务器。我的目标是让用户点击网页上的提交按钮,它将在我的第一台机器上运行parallel-ssh并在其他云计算机上启动脚本。我运行了网页,脚本正在运行,这是我尝试从index.php启动parallel-ssh

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

2 个答案:

答案 0 :(得分:1)

如果您通过libssh2或phpseclib连接到每台服务器并在每台机器上运行命令,那么你可以更轻松一点吗?

答案 1 :(得分:0)

这是一个很大的命令。 我可能会建议这样做,以便更好地理解它。 在下面的代码中,我经常使用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;

这对你有用,但有些事情需要考虑。 首先,执行它并打印出$ result以查看实际输出是什么。如果你得到像

这样的东西
[FAILURE] server.hostname Exited with error code 255

然后pssh可能要求为每个主机提供密码。我注意到您正在使用-A选项,要求输入密码。你不能用php中的shell_exec做到这一点,因为那时脚本会挂起并永远等待密码。相反,您需要设置SSH密钥,以便您的第一个云服务器可以在没有密码的情况下进入其他云服务器。实际上,设置基于SSH公钥的身份验证非常简单。但如果你以前从未做过,那就不行了。我确信有很多关于如何设置它的帖子。程序基本上是:

  1. 生成公钥和私钥(无密码)。

    • 在第一个云服务器上输入此命令:ssh-keygen
    • 请求时不要输入密码
  2. 将id_rsa.pub文件复制到每个辅助云服务器上的〜/ .ssh / authorized_keys文件

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

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

  5. 如果一切按计划进行,您应该能够安全地在没有密码的情况下从主云服务器上的每个云服务器上执行命令。现在,你可以运行你的命令,它应该工作....或至少给你输出为什么它没有,所以你可以继续进行故障排除。

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

    还有其他安全问题,例如保护您的id_rsa文件。不要在服务器上运行任何不受信任的脚本,也不要使用任何虚拟主机,用户可以为自己的网站上传自己的文件。安全问题发挥作用,因为任何作为apache运行的脚本都可以轻松访问,并危及您的id_rsa文件... yikes。任何有权访问此文件的人都可以轻松访问您的每个云服务器......因此不应轻易保护它。