Я пытаюсь скопировать файл между двумя удаленными серверами через PHP, используя PHPSecLib.
Ключи SSH существуют между domain.tld и domain2.tld, и локально выполнение этого SCP из domain.tld работает нормально.
Урезанная версия моего кода:
echo "Copying file... ";
$ssh = new Net_SSH2('domain.tld');
$ssh->enableQuietMode();
$ssh->login('user','pass');
$ssh->exec("scp /home/file.tar.gz [email protected]:/home/file.tar.gz");
if($ssh->getExitStatus())
exit("Failed at line: ".__LINE__);
echo "Done!\n";
В приведенном выше примере сценарий завершится через 5 секунд, повторяя «Готово!» в конце, однако, копия не была завершена и продолжает работать еще около 2 минут.
К сожалению, я хочу удаленно делать что-то с файлом, который копируется таким образом, поэтому необходимо дождаться его завершения.
Я также исследовал использование PHPSecLib Net_SCP, к сожалению, это не может выполнить удаленное -> удаленное копирование, и мне нужно избегать использования локального сервера в качестве посредника для процесса копирования (из-за ограничений по расстоянию / пропускной способности).
Я попытался переписать вышеупомянутое, используя $ ssh-> read () и $ ssh-> write (), однако с ограниченным пониманием того, как эти процедуры должны работать, я не добился успеха.
Кто-нибудь может пролить свет на этот вопрос для меня?
Ответил на проблему сам.
Оказывается, что Net_SSH2 автоматически истечет время ожидания exec, если STDOUT не получен в пределах значения по умолчанию.
Ответ должен был позвонить $ssh->setTimeout(60000)
(или какое-то другое столь же нелепое число) перед заявлением exec.
Вы используете аутентификацию с открытым ключом? Если вы используете аутентификацию по паролю, вам потребуется интерактивная подсказка. Или вы можете использовать атрибут sourcefile.
Я попробовал это только сейчас, используя открытый ключ аутентификации, и он работал просто отлично.