2016-02-03 5 views
6

У меня есть проект Laravel 4.2, размещенный на одном сервере (сервер A), и мне нужно иметь возможность загружать файлы из этого приложения, и файлы будут переданы на сервер Windows, который находится на той же локальной сети (сервер B).Laravel SSH на сервере Windows

Я установил OpenSSH на сервер Windows и запустил службу. Я могу подтвердить, что это работает, потому что я могу успешно подключиться в терминале на сервере A.

В проекте Laravel я создал соединение в файле app/config/remote.php.

Но когда я пытаюсь запустить команду в проекте Laravel на сервере , используя следующий код:

SSH::into('ServerB')->run(['IF EXIST folder (echo YES) ELSE (echo NO)'], function($line){ 
    echo $line.PHP_EOL; 
}); 

Я получаю следующее сообщение об ошибке:

unpack(): Type N: not enough input, need 4, have 1 

Я получая эту ошибку для каждой команды, которую я пытаюсь запустить на сервере B. Как ни странно, если я попытаюсь использовать тот же код, но укажу его на сервер Linux, код будет работать отлично. Это заставило бы меня поверить, что сервер SSH, вероятно, неправильно настроен на сервере B, но тот факт, что я могу подключиться через SSH к серверу B с сервера A в окне терминала смущает все дело!

Кто-нибудь знает значение ошибки, которую я получаю?

+0

На какой версии PHP находится ваш проект Laravel 4.2? – revo

+1

Я не очень хорошо знаю Laravel, но я нашел аналогичный отчет о проблеме phpeclib, который был исправлен в прошлом году: https://github.com/terrafrost/phpseclib/commit/684d6eed0e2fc3045c9169685ce135a14474abef – andrucz

+0

опубликовать свой журнал 'echo $ ssh-> getLog(); 'также проверьте свой хост и брандмауэр – Ghayel

ответ

2

Laravel 4.2's SSH - это Фасад, который разрешит Illuminate\Remote\RemoteManager. Его метод into() вернет экземпляр Illuminate\Remote\Connection, который затем использует экземпляр SecLibGateway, который инкапсулирует phpseclib библиотеки. SecLibGateway вернет экземпляр System_SSH_Agent phpeclib (см. SSH_Agent.php в каталоге vendor/phpseclib/phpseclib/phpseclib/System в установке Laravel 4.2). Внутри конструктора System_SSH_Agent в, в строке 248:

$this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr); 

Это открывает сокет-соединение для UNIX: //. OP сказал, что SSH работает на сервере Linux, но не на сервере Windows. Я считаю, что это может быть преступником. Есть несколько звонков в unpack() функции PHP, такие как в строке 274:

$length = current(unpack('N', fread($this->fsock, 4))); 

Он называет распаковка() с типом N с 4 номером требуемого входа. Как-то fsock недействителен и вызывает сообщение об ошибке.

1

Кажется, этот вид ошибки появляется, когда «предупреждение появляется, когда входные данные не правильно» cfr this post

Это может быть связано с установкой в ​​php.ini, то есть «magic_quotes_runtime работает путем добавления слеша контента читайте из внешних источников, таких как текстовые файлы, эффективно уничтожая двоичный вход, как и файл .mo, а также уничтожая настройки конфигурации, считанные из базы данных ... »cfr this post

5

Это может быть проблема с phpseclib. Проверьте, установлена ​​ли последняя версия, если возможно, обновите.

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