我正在使用phpseclib做一些SFTP的东西。目前我无法登录,我正在试图找出原因。在文档中,它声明我应该做这样的事情
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。我没有使用include,而是使用例如
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 :(得分: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()
,然后在帖子中包含日志。