我正在用PHP编写一个简单的SFTP客户端,因为我们需要通过n个远程服务器以编程方式检索文件.我正在使用PECL SSH2扩展.
不过,我遇到了一个障碍.php.net上的文档表明你可以这样做:
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');
但是,我有一个尝试类似的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); }
我收到以下错误:
PHP Warning: opendir(): Unable to open ssh2.sftp://Resource id #5/outgoing on remote host
这非常有意义,因为当您将资源转换为字符串时会发生这种情况.文档错了吗?我尝试用主机,用户名和主机替换资源,但这也不起作用.我知道路径是正确的,因为我可以从命令行运行SFTP,它工作正常.
有没有其他人尝试过使用SFTP的SSH2扩展?我错过了一些明显的东西吗?
更新:
我在内部的另一台机器上安装了sftp,它运行得很好.所以,我试图连接到的服务器必须有一些不起作用.
连接到SFTP服务器并且需要连接到根文件夹(例如,用于读取文件夹的内容)时,如果仅使用"/"作为路径,则仍会出现错误.
我找到的解决方案是使用路径"/./",这是一个引用根文件夹的有效路径.当您登录的用户只能访问其自己的根文件夹且没有可用的完整路径时,这非常有用.
因此,当尝试读取根文件夹的内容时,服务器的请求应该是这样的:
$rd = "ssh2.sftp://{$this->sftp}/./";
对于php版本> 5.6.27使用intval()
$sftpConnection = ssh2_connect($host); $sftp = ssh2_sftp($sftpConnection); $fp = fopen("ssh2.sftp://" . intval($sftp) . $remoteFile, "r");
https://bugs.php.net/bug.php?id=73597
我有类似的问题.我假设你正在做类似的事情:
$dir = "ssh2.sftp://{$sftp}{$remote_dir}"; $handle = opendir($dir);
$remote_dir
从根开始的完整路径何时open_dir
起作用.如果$remote_dir
只是'/'或'',那么我会像你那样得到'无法打开'错误.
在我的情况下,似乎ssh连接在根文件夹而不是像ftp那样的'home'目录.你提到它在不同的服务器上工作,所以我想知道它是否只是一个配置问题.
PHPSECLIB:http://phpseclib.sourceforge.net/是让PHP在PHP中工作的最简单方法(即使在Windows上),而不安装任何扩展等.SSH的东西完全在PHP类中实现.
你使用是这样的:
login('username', 'password')) { exit('Login Failed'); } echo $sftp->pwd(); ?>