Создайте zip-файл в удаленном месте, используя PHP SSH2

Я работаю над файловым менеджером, и мои пользователи должны иметь возможность загружать 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

Когда я ввожу этот cmd в мой экран ssh, используя putty, он работает отлично.
Но когда я запускаю этот cmd с ssh2_exec в php, он создает только часть zip-файла, которая называется случайным именем и не имеет расширения, похоже, что процесс zip по какой-то причине отменен.
Это происходит каждый раз.

Кто-нибудь знает способ решить эту проблему?

Спасибо за прочтение.

0

Решение

Возможно, вам повезет больше с 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 не работал.

Удачи!

2

Другие решения

Я нашел решение, кажется, что 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;
}
}

И это прекрасно работает!

0

Вы можете сделать это следующим образом:

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

Обратите внимание на разрывы строк.

Или так:

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

Ни с использованием ssh2, ни с помощью phpseclib не получилось, и моя проблема была решена путем вызова команды zip в режиме без вывода сообщений: zip -uqr container.zip folder так что не было никакого выхода

0
По вопросам рекламы [email protected]