我正在处理文件管理器,我的用户应该可以从整个根目录下载.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进程。 这种情况每次都会发生。
任何人都知道解决这个问题的方法吗?
感谢阅读。
答案 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
所以没有任何输出