如何使用PHP进行SFTP?

2j4z5cfb  于 2023-01-16  发布在  PHP
关注(0)|答案(6)|浏览(175)

我遇到了许多用于Web FTP客户端的PHP脚本。我需要在PHP中实现一个SFTP客户端作为Web应用程序。PHP支持SFTP吗?我找不到任何示例。有人能帮我吗?

7ajki6be

7ajki6be1#

PHP有ssh 2流 Package 器(默认情况下禁用),因此您可以通过使用ssh2.sftp://作为协议,将sftp连接用于任何支持流 Package 器的函数,例如

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

或-同时使用ssh2 extension

$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
在一个侧面说明,也有相当一堆关于这个主题的问题已经:

5w9g7ksd

5w9g7ksd2#

ssh2函数不是很好,很难使用,也很难安装,使用它们会保证你的代码没有可移植性,我的建议是使用phpseclib, a pure PHP SFTP implementation

ar7v8xwq

ar7v8xwq3#

我发现“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);
gg0vcinb

gg0vcinb4#

安装Flysystem v1:

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/

升级到v2:

https://flysystem.thephpleague.com/v2/docs/advanced/upgrade-to-2.0.0/

安装

composer require league/flysystem-sftp:^2.0

然后:

//$filesystem->listFiles($path); // get file lists
$allFiles = $filesystem->listContents($path)
->filter(fn (StorageAttributes $attributes) => $attributes->isFile());

$filesystem->read($path_to_file); // grab file
//$filesystem->put($path); // upload file
$filesystem->write($path);
wvt8vs2t

wvt8vs2t5#

在搞砸了PECL ssh 2之后,我决定看看phpseclib 3,它是开箱即用的。服务器上没有安装。我用composer安装了它,并把代码放进去。它有很多有用的东西,而且是免费的。下面是步骤:
1.在你的PHP应用文件夹中运行这个composer安装程序。我使用了VS代码,并打开了一个终端窗口(需要先在你的机器上安装Composer):
编写器需要phpseclib/phpseclib:~3.0
1.使用下面的基本示例:https://phpseclib.com/docs/sftp
使用phpseclib3\Net\SFTP;
$sftp =新的SFTP(“本地主机”);
$sftp-〉登录('用户名','密码');
$sftp-〉put('文件名.远程','文件名.本地',SFTP::源本地文件);
其他有用链接:GitHub:https://github.com/phpseclib/phpseclib和网址:https://phpseclib.com/

wwtsj6pe

wwtsj6pe6#

我执行了一个完全的拷贝,写了一个类,创建一个批处理文件,然后通过system调用sftp。不是最好的(或最快的)方法,但它能满足我的需要,并且不需要在PHP中安装任何额外的库或扩展。
如果您不想使用ssh2扩展,则可以使用

相关问题