Сбой операций PHP SSH2 при попытке загрузить файл на сервер


В настоящее время я борюсь с использованием встроенных библиотек SSH2 для PHP (версия 5.5). Я пытаюсь загрузить файл на сервер SFTP, как указано в заголовке, однако я продолжаю получать сообщение об ошибке "сбой потоковой операции".

После попытки отладки самого кода соединение работает, ресурсу sftp правильно присваивается идентификатор, однако при вызове fopen для записи файла непосредственно на удаленный сервер происходит сбой.

// open Live environment if we are not in dev
$connection = ssh2_connect($this->_settings['source_host'], 22);
$authSuccess = ssh2_auth_password($connection, $this-  >_settings['source_user'], $this->_settings['source_password']);
$sftp = ssh2_sftp($connection);

И, наконец, fopen() вызов:

if($operation == 'export') {
    $handle = fopen("ssh2.sftp://".$sftp."/remotecopy/IN/".$filename, $mode);
}

Я добавил отладочные сообщения в свой собственный код, чтобы проверить, правильно ли используются данные из массива _settings, и это так, однако я не могу объяснить ошибку потока.

Message:  fopen(): Unable to open ssh2.sftp://Resource id #173/PATH GOES HERE/filename.xxx on remote host

Message:  fopen(ssh2.sftp://Resource id #173/PATH GOES HERE/filename.xxx): failed to open stream: operation failed

В качестве примечания файл не существует на удаленном хосте, но, насколько мне известно, режим "w" в PHP fopen() должен создать файл, если он не существует.

Я не могу использовать другую библиотеку PHP, так как весь наш проект использует встроенные библиотеки ssh2, и ответственный сотрудник сказал мне не использовать это, как и везде, прекрасно работает.

Author: user3498133, 2015-03-08

2 answers

Я думаю, вам было бы легче, если бы вы использовали phpseclib, чистую реализацию PHP SFTP. например,

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

// puts a three-byte file named filename.remote on the SFTP server
$sftp->put('filename.remote', 'xxx');
// puts an x-byte file named filename.remote on the SFTP server,
// where x is the size of filename.local
$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);
?>

Одна из приятных вещей в phpseclib - это ведение журнала, поэтому, если это не сработает, вы можете сделать define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX); после включения Net/SFTP.php а затем сделайте echo $sftp->getLog() после того, как это произойдет. Это может дать некоторое представление о том, что происходит, если это все еще не работает.

 2
Author: drainyday, 2015-03-09 18:00:26

Ответ был прост, у меня был неправильно отформатированный путь на удаленном сервере. После проверки моих настроек он работает просто отлично.

Спасибо всем вам за советы и помощь.

 1
Author: user3498133, 2015-03-10 08:44:28