如何使用PHP进行SFTP?


81

我遇到了许多用于Web FTP客户端的PHP脚本。我需要将SFTP客户端实现为PHP中的Web应用程序。PHP是否支持SFTP?我找不到任何样品。谁能帮我这个?

Answers:


71

PHP具有ssh2流包装器(默认情况下处于禁用状态),因此您可以将sftp连接与任何支持流包装器的函数一起使用ssh2.sftp://(例如,用于协议),例如

file_get_contents('ssh2.sftp://user:pass@example.com:22/path/to/filename');

或-当同时使用ssh2扩展名时

$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

参见http://php.net/manual/en/wrappers.ssh2.php

附带说明一下,关于此主题也已经有很多问题:


file_get_contents和file_put_contents都很棒。从来都不知道他们使用过sftp,这比使用内置sftp的东西容易得多。谢谢!
jbrahy 2015年

3
即使使用file_get_contents(),您仍然需要ssh2扩展名(afaik)。
StanE

debian / ubuntu软件包:apt install libssh2-1-dev php-ssh2
Ajay Singh


28

我发现“ phpseclib”应该可以帮助您(SFTP和许多其他功能)。http://phpseclib.sourceforge.net/

要将文件放入服务器,只需调用(来自http://phpseclib.sourceforge.net/sftp/examples.html#put的代码示例)

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

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

// puts a three-byte file named filename.remote on the SFTP server
$sftp->put('filename.remote', 'xxx');
// puts an x-byte file named filename.remote on the SFTP server,
// where x is the size of filename.local
$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);


1
您可以更新对phpseclib 2.0的答案吗?您当前的示例已过时。
Martin Prikryl

2

安装Flysystem:

composer require league/flysystem-sftp

然后:

use League\Flysystem\Filesystem;
use League\Flysystem\Sftp\SftpAdapter;

$filesystem = new Filesystem(new SftpAdapter([
    'host' => 'example.com',
    'port' => 22,
    'username' => 'username',
    'password' => 'password',
    'privateKey' => 'path/to/or/contents/of/privatekey',
    'root' => '/path/to/root',
    'timeout' => 10,
]));
$filesystem->listFiles($path); // get file lists
$filesystem->read($path_to_file); // grab file
$filesystem->put($path); // upload file
....

读:

https://flysystem.thephpleague.com/v1/docs/


-1

我执行了一个完整的保护工作,并编写了一个创建批处理文件的类,然后sftp通过调用进行system调用。这不是最好(或最快)的方法,但是它可以满足我的需要,不需要在PHP中安装任何额外的库或扩展。

如果您不想使用ssh2扩展程序,可能会成为一种方式


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.