无法让SFTP在PHP中运行

Chr*_*anz 17 php ssh sftp wrapper

我正在用PHP编写一个简单的SFTP客户端,因为我们需要通过n个远程服务器以编程方式检索文件.我正在使用PECL SSH2扩展.

不过,我遇到了一个障碍.php.net上的文档表明你可以这样做:

$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');
Run Code Online (Sandbox Code Playgroud)

但是,我有一个尝试类似的ls方法

public function ls($dir)
{
    $rd = "ssh2.sftp://{$this->sftp}/$dir";
    $handle = opendir($rd);
    if (!is_resource($handle)) {
        throw new SFTPException("Could not open directory.");
    }

    while (false !== ($file = readdir($handle))) {
        if (substr($file, 0, 1) != '.'){
            print $file . "\n";
        }
    }
    closedir($handle);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

PHP Warning:  opendir(): Unable to open ssh2.sftp://Resource id #5/outgoing on remote host
Run Code Online (Sandbox Code Playgroud)

这非常有意义,因为当您将资源转换为字符串时会发生这种情况.文档错了吗?我尝试用主机,用户名和主机替换资源,但这也不起作用.我知道路径是正确的,因为我可以从命令行运行SFTP,它工作正常.

有没有其他人尝试过使用SFTP的SSH2扩展?我错过了一些明显的东西吗?

更新:

我在内部的另一台机器上安装了sftp,它运行得很好.所以,我试图连接到的服务器必须有一些不起作用.

Lui*_*pez 43

连接到SFTP服务器并且需要连接到根文件夹(例如,用于读取文件夹的内容)时,如果仅使用"/"作为路径,则仍会出现错误.

我找到的解决方案是使用路径"/./",这是一个引用根文件夹的有效路径.当您登录的用户只能访问其自己的根文件夹且没有可用的完整路径时,这非常有用.

因此,当尝试读取根文件夹的内容时,服务器的请求应该是这样的:

$rd = "ssh2.sftp://{$this->sftp}/./";
Run Code Online (Sandbox Code Playgroud)

  • 你是受欢迎的@BradenAnderson,我在这里找到了很多答案,我认为我提供的答案是公平的 (3认同)
  • 这是正确的答案.从PHP 5.2和5.4之间的某个时间引入了一个错误,它破坏了对根目录的访问.感谢您提供解决方法! (2认同)
  • 我在https://bugs.php.net/bug.php?id=64169上添加了一个指向您答案的链接. (2认同)

Cal*_*aga 18

对于php版本> 5.6.27使用intval()

$sftpConnection = ssh2_connect($host);
$sftp = ssh2_sftp($sftpConnection);
$fp = fopen("ssh2.sftp://" . intval($sftp) . $remoteFile, "r");
Run Code Online (Sandbox Code Playgroud)

https://bugs.php.net/bug.php?id=73597

  • 这是正确的答案!谢谢. (2认同)

saf*_*foo 7

我有类似的问题.我假设你正在做类似的事情:

    $dir = "ssh2.sftp://{$sftp}{$remote_dir}"; 
    $handle = opendir($dir);
Run Code Online (Sandbox Code Playgroud)

$remote_dir从根开始的完整路径何时open_dir起作用.如果$remote_dir只是'/'或'',那么我会像你那样得到'无法打开'错误.

在我的情况下,似乎ssh连接在根文件夹而不是像ftp那样的'home'目录.你提到它在不同的服务器上工作,所以我想知道它是否只是一个配置问题.


Max*_*Max 7

PHPSECLIB:http://phpseclib.sourceforge.net/是让PHP在PHP中工作的最简单方法(即使在Windows上),而不安装任何扩展等.SSH的东西完全在PHP类中实现.

你使用是这样的:

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

echo $sftp->pwd();
?>
Run Code Online (Sandbox Code Playgroud)