2015-11-14 4 views
0

Я использую phpseclib для работы с SFTP. На данный момент я не могу войти в систему, и я пытаюсь выяснить, почему. В документации, он утверждает, я должен сделать что-то вроде этогоPHP Composer using define

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib'); 
include 'Net/SFTP.php'; 

define('NET_SFTP_LOGGING', NET_SFTP_LOG_COMPLEX); 

$sftp = new NET_SFTP('***'); 
if(!$sftp->login('***', '***')) { 
    print_r($sftp->getSFTPErrors()); 
} 

Итак, мне нужно определить тип входа в систему для того, чтобы распечатать SFTPErrors.

Я делаю вещи иначе, чем выше, потому что я использую композитор. Как обычно, я загружаю autoload.php. Вместо включения, я использую использование, например.

use phpseclib\Net\SFTP; 

Я затем перейти сделать что-то вроде следующего

define('NET_SFTP_LOGGING', NET_SFTP_LOG_COMPLEX); 

$sftp = new SFTP($config::SFTP_SERVER); 

if(!$sftp->login($config::SFTP_USER, $config::SFTP_PASSWORD)) { 
    print_r($sftp->getSFTPErrors()); 
    exit('Login Failed'); 
} 

Если я делаю это, однако, я получить выход

Notice: Use of undefined constant NET_SFTP_LOG_COMPLEX - assumed 'NET_SFTP_LOG_COMPLEX' in ... 
Array 
(
) 
Login Failed 

Так кажется, что с композитором, я не могу определить константа таким же образом, а распечатка ошибок создает пустой массив.

Итак, как я могу определить эту константу в проекте моего композитора?

Thanks

+0

Вы уверены, что вам не нужны кавычки вокруг обеих строк в определении? – user2182349

+0

В каждом примере, который я проверяю, нет котировок вокруг второго параметра –

+0

У вас есть установленный phpseclib? – user2182349

ответ

1

Несколько вещей.

Если вы используете версию PHP с именами (как видно из вашего use phpseclib\Net\SFTP;), вы используете ветвь 2.0. Документация на веб-сайте предназначена для ветви 1.0. Для филиала 2.0 вам нужно сделать, как предложил Феликс Сапарелли - SSH2::LOG_COMPLEX.

Тем не менее, протоколирование не покажет ошибки SFTP. Ведение журнала показывает вам сырые пакеты. Вот пример того, что производят журналы:

http://phpseclib.sourceforge.net/ssh/log.txt

Вы получаете эти журналы, делая $ssh->getLogs().

Для устранения ошибок вам не нужно включать что-либо - он помещает любые ошибки, которые он получает с сервера, в массив, который он возвращает вам. phpseclib делает это автоматически, и это поведение невозможно отключить.

Кроме того, $sftp->getSFTPErrors() отлично подходит для ошибок SFTP, но в процессе входа в систему вы можете получать ошибки SSH, а не ошибки SFTP. Вы получите SSH-ошибки, выполнив $sftp->getErrors(). Дело в том, что ... SFTP работает на более высоком уровне, чем SSH. SSH не удастся, если TCP/IP не сможет выполнить соединение, и SFTP не будет успешным, если SSH не сможет установить соединение. Таким образом, вы должны проверять все слои.

И, наконец, вполне возможно, что произошел сбой по причинам, по которым ошибки не будут возвращены. Возможно, серверу требуется сжатие, которое phpseclib не поддерживает. например.

http://www.frostjedi.com/phpbb3/viewtopic.php?p=221481#p221481

Я также не знаю, если вы получите сообщение об ошибке, если ключ или пароль вы использовали просто недействительны.

Действительно, может быть любое количество причин для невозможности подключения.Вы можете использовать selinux, который по умолчанию отключает исходящие соединения из PHP-скриптов, запущенных на порту 80, может возникнуть проблема с маршрутизацией и т. Д. (Все они влияют на fsockopen, но в целом существует много потенциальных причин для недостаточность).

В целом, я бы сказал, что вы на правильном пути с бревнами. Но сделайте $sftp->getLog() вместо $sftp->getSFTPErrors(), а затем включите журналы в свой пост.

+0

Благодарим вас за подробное объяснение. Добавление пространства имен, похоже, избавляется от ошибки :-) Однако я верю, что getErrors возвращает пустой массив. И тогда, если я сделаю getLog вместо этого, я вернусь bool (false). Есть ли какая-то конкретная причина, по которой я не могу получать ошибки или журналы? Я знаю, что мои учетные данные верны, потому что я могу войти в систему через Filezilla. Спасибо –

+0

Предполагая, что вы выполняете 'define ('NET_SSH2_LOGGING', SFTP :: LOG_COMPLEX)' (не 'NET_SFTP_LOGGING'), тогда это может быть проблемой при вызове fsockopen. В этот момент удаление @ до того, как оно может дать некоторое представление. – neubert

+0

К сожалению, у меня нет @, я попробовал посмотреть, был ли fsockopen включен на сервере, и это было. Поэтому не слишком уверен, в чем проблема. –

Смежные вопросы