2015-11-14 58 views
0

我正在使用phpseclib來做一些SFTP的東西。目前我無法登錄,我正試圖找出原因。在文檔,它指出我應該做這樣的事情PHP Composer使用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 

所以看來與作曲家,我不能確定以相同的方式使用常量,並且打印出錯誤將生成一個空數組。

那麼,如何在我的作曲家項目中定義這個常量?

謝謝

+0

你確定你不需要在定義的兩個字符串周圍引用引號嗎? – user2182349

+0

我檢查的每個示例都沒有引用第二個參數 –

+0

您確定已安裝phpseclib嗎? – user2182349

回答

1

一些事情。

如果您使用PHP的命名空間版本(如您的use phpseclib\Net\SFTP;所證明),那麼您使用的是2.0分支。該網站上的文檔是針對1.0分支的。對於2.0分支,您需要按照FélixSaparelli的建議 - SSH2::LOG_COMPLEX

也就是說,日誌記錄不會顯示SFTP錯誤。日誌記錄顯示了原始數據包。下面是日誌產生什麼樣的一個例子:

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

你做$ssh->getLogs()獲得這些日誌。

對於您不需要啓用任何內容的錯誤,它會將從服務器收到的任何錯誤放入數組中,並返回給您。 phpseclib會自動執行此操作,並且無法禁用此行爲。

此外,$sftp->getSFTPErrors()很適合SFTP錯誤,但在登錄過程中,您可能會收到SSH錯誤而不是SFTP錯誤。通過執行$sftp->getErrors()會導致SSH錯誤。事情是... SFTP在比SSH高的層上運行。如果TCP/IP無法建立連接,則SSH將不會成功,如果SSH無法建立連接,則SFTP將不會成功。所以你應該檢查所有的圖層。

最後,很可能失敗發生的原因是錯誤不會返回。也許服務器需要壓縮,而phpseclib不支持。例如。

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

我也不知道,如果你使用的密鑰或密碼只是無效你會得到一個錯誤。

真的,可能有任何原因導致無法連接。你可以使用selinux,默認情況下,它會禁止80端口上運行的PHP腳本的出站連接,可能存在路由問題等(所有這些都會影響fsockopen,但總的來說,有很多潛在的原因失敗)。

總的來說,我會說你的日誌正確。但做$sftp->getLog()而不是$sftp->getSFTPErrors(),然後在你的文章中包含日誌。

+0

謝謝你的詳細解釋。命名空間添加似乎擺脫了錯誤:-)雖然我的事情,getErrors返回一個空數組。然後,如果我做getLog而是返回布爾(false)是否有任何具體的原因,我可能不會收到錯誤或日誌?我知道我的憑據是正確的,因爲我可以通過Filezilla登錄。謝謝 –

+0

假設你正在執行define('NET_SSH2_LOGGING',SFTP :: LOG_COMPLEX)'(而不是'NET_SFTP_LOGGING'),那麼這可能是fsockopen調用的一個問題。在此之前刪除@可能會提供一些見解。 – neubert

+0

不幸的是,我沒有@我試圖看到,如果fsockopen在服務器上啓用,它是。所以不太確定問題可能是什麼。 –