Я работаю над файловым менеджером, и мои пользователи должны иметь возможность загружать 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 по какой-то причине отменен.
Это происходит каждый раз.
Кто-нибудь знает способ решить эту проблему?
Спасибо за прочтение.
Возможно, вам повезет больше с 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 не работал.
Удачи!
Я нашел решение, кажется, что 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;
}
}
И это прекрасно работает!
Вы можете сделать это следующим образом:
$ssh->exec("cd home/path/anotherpath/
zip -rv archive.zip ./*
");
Обратите внимание на разрывы строк.
Или так:
$ssh->exec("cd home/path/anotherpath/; zip -rv archive.zip ./*
");
Ни с использованием ssh2, ни с помощью phpseclib не получилось, и моя проблема была решена путем вызова команды zip в режиме без вывода сообщений: zip -uqr container.zip folder
так что не было никакого выхода