Сбой операций 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, и ответственный человек сказал мне не использовать ее, поскольку она отлично работает везде.


person user3498133    schedule 08.03.2015    source источник
comment
Возможно ли, что fopen отключен на вашем сервере?   -  person Michael Doye    schedule 08.03.2015
comment
Возможно, я не знаю. Кажется, он включен после проверки.   -  person user3498133    schedule 08.03.2015


Ответы (2)


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

<?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() после того момента, когда произойдет сбой. Это может дать некоторое представление о том, что происходит, если он все еще не работает.

person drainyday    schedule 09.03.2015

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

Всем спасибо за подсказки и помощь.

person user3498133    schedule 10.03.2015