0

我正在开发一个文件管理器,我的用户应该能够从他们的整个根目录下载一个 .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

4 回答 4

2

使用phpseclib,一个纯 PHP SSH2 实现,您可能会有更好的运气。例如。

<?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()部分。

我提到这一点的原因是 phpseclib 在 ssh2-exec 没有的情况下为我工作。

祝你好运!

于 2014-10-07T17:58:10.573 回答
1

使用 ssh2 和 phpseclib 都没有成功,解决我的问题是在静默模式下调用 zip 命令:zip -uqr container.zip folder所以没有任何输出

于 2015-11-21T02:01:34.337 回答
0

你可以这样做:

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

注意换行符。

或者这样:

$ssh->exec("
  cd home/path/anotherpath/; zip -rv archive.zip ./*
");
于 2015-02-13T20:20:05.477 回答
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; 
        } 
    }   

而且效果很好!

于 2014-10-07T20:49:39.287 回答