带有phpseclib的SFTP突然开始失败

时间:2019-05-07 02:58:31

标签: php sftp phpseclib windows-server-2016

我正在使用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有关的任何代码。

我还检查了所有文件夹,子文件夹和文件的安全权限,并且“用户”用户具有所有必要的权限(修改,读取,列表,写入,执行)。

我还能做什么来调试此问题?

0 个答案:

没有答案