使用PHP SSH2在远程位置创建zip文件

时间:2014-10-07 15:04:54

标签: php zip ssh2-exec

我正在处理文件管理器,我的用户应该可以从整个根目录下载.zip文件。 我使用了以下脚本:

$cmd = "";
    if(count($files) > 0) {
        foreach($files as $file) {
            $cmd .= " ". $file['name'];
        }
    }
    $cmd = "cd /home/product$this->_product$path && zip -r $filename.zip$cmd";
    if(ssh2_exec($this->_con, "cd /home/product1/include && zip -r include.zip gl_spawns.inc gl_common.inc")) {
        return $cmd;
    }       

无论如何,这个脚本运行正常,而且与这个问题没什么关系, 您可以在下面看到您在上面看到的脚本返回的cmd:

cd /home/product1/include && zip -r include.zip gl_spawns.inc gl_common.inc 

当我使用putty将此cmd输入到我的ssh屏幕时,它完美无缺。 但是当我在php中使用ssh2_exec运行这个cmd时,它只会创建一个zip文件的一部分,称为随机名称,并且没有扩展名,看起来因为某些原因取消了zip进程。 这种情况每次都会发生。

任何人都知道解决这个问题的方法吗?

感谢阅读。

4 个答案:

答案 0 :(得分:2)

phpseclib, a pure PHP SSH2 implementation你可能会有更好的运气。例如

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('website.com');
$ssh->login('user', 'pass');

//$ssh->enablePTY();
$ssh->exec('cd /home/product1/include && zip -r include.zip gl_spawns.inc gl_common.inc');

如果这不起作用,请尝试评论$ssh->enablePTY()部分。

我提到这个的原因是,在ssh2-exec没有的情况下,phpseclib对我有效。

祝你好运!

答案 1 :(得分:0)

我找到了一个解决方案,似乎ssh2_exec并不能很好地处理乘法命令,这就是ssh2_shell的用法,我将脚本的一部分转换为以下代码:

    $cmds[0] = "cd /home/product$this->_product$path;"; 
    $cmds[1] = "zip -r $filename.zip$cmd;"; 

    $out = ''; 
    $shell=ssh2_shell($this->_con); 

    for($i=0; $i<count($cmds); $i++) { 
        fwrite($shell, $cmds[$i] . PHP_EOL); 
        sleep(1); 
        while($buffer = fgets($shell)) { 
            flush(); 
            $out .= $buffer; 
        } 
    }   

它很棒!

答案 2 :(得分:0)

你可以这样做:

$ssh->exec("
  cd home/path/anotherpath/
  zip -rv archive.zip ./*
");

请注意换行符。

或者这样:

$ssh->exec("
  cd home/path/anotherpath/; zip -rv archive.zip ./*
");

答案 3 :(得分:0)

使用ssh2和phpseclib都没有做到这一点,解决了我的问题是在无声模式下调用zip命令:zip -uqr container.zip folder所以没有任何输出