我正在使用Windows Server 2016,PHP 5.5.38和phpseclib
我已经使用phpseclib来从服务器上SFTP发送文件已有相当长的一段时间了,并且一直运行良好。然后上周它突然停止工作。我使用的是1.0.7版,但是在找不到问题的根源之后,我也尝试了最新的1.0.15版,这没有什么区别。
似乎SFTP失败,因为它找不到应该发送的文件。我从$ sftp-> getSFTPErrors()得到的错误是“ NET_SFTP_STATUS_NO_SUCH_FILE”。
我已经确认该文件确实存在,并且显然由于我从$ sftp得到错误,因此该对象已创建,因此我认为它一定是文件本身的权限问题。
但是,我已经确认我的脚本能够创建文件以及存储在其中的文件夹,因此很明显,我的用户至少具有那么多权限。而且我什至可以使用PHP的file_exists函数来确认文件是否存在,并返回true。但是,当我从SFTP对象使用file_exists函数时,它将失败。
另一个有趣的事情是,我似乎无法使用PHP确定文件所有者,但是我不确定是否相关。我相信站点用户是Windows用户“ Users”,但我想确认这确实是试图访问文件的用户。我一直无法确认。
我已经简化了代码以尝试缩小问题的范围,但是现在我很困惑。这就是我的位置。
include("common/common.php");
//<!--*******************************************************************************************-->
//<!--*** Build path and create folder if not exists
//<!--*** This works
//<!--*******************************************************************************************-->
$rootpath = dirname($_SERVER['PATH_TRANSLATED']);
$fullpath = $rootpath."/companies/1453/eft";
if(!checkPath($fullpath)){
if(!mkdir($fullpath)){
$error = array("Unable to create eft path: ".$fullpath,"errormessage");
echo $error;
}
}
//<!--*******************************************************************************************-->
//<!--*** Build file name and create file
//<!--*** This also works
//<!--*******************************************************************************************-->
$currenttime = date('Hi');
$filename = "blah".$currenttime.".txt";
$filewithpath = $fullpath."/".$filename;
if (!$handle = fopen($filewithpath, 'w')) {
$error = array("Cannot open file (".$filewithpath.")","errormessage");
echo "<br>".$error;
}else{
echo "<br>file open success";
}
//<!--*******************************************************************************************-->
//<!--*** Get file owner
//<!--*** I wanted to get the file owner so I could confirm security permissions to help me debug this problem
//<!--*** This does not work for some reason
//<!--*******************************************************************************************-->
if(fileowner($filewithpath)){
echo "<br>file owner: ".fileowner($filewithpath);
}else{
echo "<br>can not get file owner";
}
//<!--*******************************************************************************************-->
//<!--*** Use PHP to confirm that file exists
//<!--*** This works, so I know the file exists
//<!--*******************************************************************************************-->
if(file_exists($filewithpath)){
echo "<br>PHP file exists";
}else{
echo "<br>PHP file does not exist";
}
//<!--*******************************************************************************************-->
//<!--*** Create new SFTP Object
//<!--*** This works.
//<!--*******************************************************************************************-->
include("common/PHP SFTP 1.0.15/Net/SFTP.php");
$ftp_host = 'ftp.eftcanada.com';
if($sftp = new Net_SFTP($ftp_host)){
echo "<br>SFTP Objected Created";
}else{
echo "<br>SFTP Objected Not Created";
}
//<!--*******************************************************************************************-->
//<!--*** Use FTP Object to confirm that file exists
//<!--*** This fails even though I know the file exists
//<!--*******************************************************************************************-->
if ($sftp->file_exists($filewithpath)){
echo "<br>FTP File Exists";
}else{
echo "<br>FTP File Does Not Exist";
}
因此,基本上,我可以创建文件并使用PHP函数查找它,但是SFTP对象找不到或发送它。从字面上看,这一天有效,而第二天无效。
我不知道在一天的工作与第二天的工作之间没有任何变化。没有安装Windows Server更新,也没有更改与SFTP有关的任何代码。
我还检查了所有文件夹,子文件夹和文件的安全权限,并且“用户”用户具有所有必要的权限(修改,读取,列表,写入,执行)。
我还能做什么来调试此问题?