2016-02-03 12 views
6

Mam projekt Laravel 4.2 hostowany na jednym serwerze (Serwer A) i muszę mieć możliwość przesyłania plików z tej aplikacji, a pliki powinny być przesyłane do serwera Windows, który znajduje się na serwerze. ta sama sieć lokalna (serwer B).Laravel SSH na Windows Server

Zainstalowałem OpenSSH na serwerze Windows i uruchomiłem usługę. Mogę potwierdzić, że to działa, ponieważ mogę pomyślnie połączyć się z terminalem na serwerze A.

W projekcie Laravel utworzyłem połączenie w pliku app/config/remote.php.

Ale gdy próbuję uruchomić polecenie w projekcie laravel na serwerze za pomocą następującego kodu:

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

pojawia się następujący błąd:

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

jestem Odbieranie tego błędu dla każdego polecenia, które próbuję uruchomić na serwerze B. O dziwo, jeśli spróbuję użyć tego samego kodu, ale wskażę go serwerowi Linux, kod działa dobrze. Mogłoby to prowadzić do przekonania, że ​​serwer SSH jest prawdopodobnie nieprawidłowo skonfigurowany na serwerze B, ale fakt, że mogę połączyć się przez SSH z serwerem B z serwera A w oknie terminala myli całą sprawę!

Czy ktoś wie, jaki jest błąd, który otrzymuję?

+0

Na jakiej wersji PHP hostowany jest Twój projekt Laravel 4.2? – revo

+1

Nie znam Laravel bardzo dobrze, ale znalazłem podobny problem dotyczący phpeclib, który został naprawiony w zeszłym roku: https://github.com/terrafrost/phpseclib/commit/684d6eed0e2fc3045c9169685ce135a14474abef – andrucz

+0

opublikuj swój dziennik 'echo $ ssh-> getLog(); 'sprawdź także swojego hosta i zaporę ogniową – Ghayel

Odpowiedz

2

SSH dla Laravel 4.2 to fasada, która zostanie rozwiązana na Illuminate\Remote\RemoteManager. Jego metoda into() zwróci instancję Illuminate\Remote\Connection, która następnie użyje instancji SecLibGateway, która zawiera bibliotekę . SecLibGateway zwróci instancję phpseclib's System_SSH_Agent (zobacz SSH_Agent.php w katalogu vendor/phpseclib/phpseclib/phpseclib/System w instalacji Laravel 4.2). Wewnątrz konstruktora System_SSH_Agent, w linii 248:

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

Otwiera połączenie z gniazdem unix: //. OP powiedział, że SSH działa na serwerze Linux, ale nie na serwerze Windows. Wierzę, że to może być winowajcą. Istnieje kilka połączeń do unpack() funkcji PHP, takie jak na linii 274:

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

To zwraca rozpakować() z typu N z wymaganym 4 numer wejścia. W jakiś sposób fsock nie jest prawidłowy i powoduje pojawienie się komunikatu o błędzie.

1

Wydaje tego rodzaju błędów pojawia się, gdy „ostrzeżenie pojawia się, gdy dane wejściowe nie jest poprawna” cfr this post

Może to być spowodowane ustawienia w php.ini, czyli „magic_quotes_runtime działa poprzez dodanie backslashy w treści odczytywane z zewnętrznych źródeł, takich jak pliki tekstowe, skutecznie niszcząc dane wejściowe binarne, takie jak plik .mo, a także niszcząc ustawienia konfiguracji odczytane z bazy danych ... "cfr this post

5

To prawdopodobnie będzie problem z phpseclib. Sprawdź, czy masz zainstalowaną najnowszą wersję, zaktualizuj, jeśli to możliwe.

Powiązane problemy