2016-02-03 181 views
6

我有一個服務器上託管的Laravel 4.2項目(服務器A),我需要能夠從此應用程序上傳文件,並將文件傳輸到Windows服務器上相同的本地網絡(服務器B)。在Windows服務器上的Laravel SSH

我在Windows服務器上安裝了OpenSSH並啓動了服務。我可以確認這是工作的,因爲我可以在服務器上的終端成功連接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服務器可能在服務器上設置不正確,但是我可以通過SSH連接到服務器B從服務器A在終端窗口的事實混淆了整個事情!

有沒有人知道我收到的錯誤的含義?

+0

您的Laravel 4.2項目託管在哪個PHP版本上? – revo

+1

我不知道Laravel非常好,但是我發現了一個類似的phpeclib問題報告,它在去年得到了修復:https://github.com/terrafrost/phpseclib/commit/684d6eed0e2fc3045c9169685ce135a14474abef – andrucz

+0

發佈您的日誌'echo $ ssh-> getLog();'也檢查你的主機和防火牆 – Ghayel

回答

2

Laravel 4.2的SSH是Facade,將解析爲Illuminate\Remote\RemoteManager。它的into()方法將返回Illuminate\Remote\Connection實例,然後使用SecLibGateway實例封裝phpseclib庫。 SecLibGateway將返回實例phpseclib的System_SSH_Agent(請參閱Laravel 4.2安裝中的vendor/phpseclib/phpseclib/phpseclib/System目錄中的SSH_Agent.php)。在System_SSH_Agent的構造函數中,在第248行:

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

它打開套接字連接到unix://。 OP說SSH可以在Linux服務器上運行,但不能在Windows服務器上運行。我相信這可能是罪魁禍首。有例如在管線274幾個電話PHP的unpack()功能:()與4號所需的輸入型N-

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

它調用解包。不知何故fsock是無效的,並導致錯誤信息發生。

1

看來當cfr this post

這可能是「時輸入的數據是不正確的警告出現」由於在php.ini中設置這種錯誤的出現,即「magic_quotes_runtime的工作原理是在內容添加反斜槓從文本文件等外部源讀取,有效銷燬二進制輸入,如.mo文件,並破壞從數據庫讀取的配置設置...「cfr this post

5

這可能是phpseclib的問題。檢查是否安裝了最新版本,如果可能,更新。