Як SFTP за допомогою PHP?


83

Я натрапив на багато PHP-сценаріїв для веб-клієнтів FTP. Мені потрібно реалізувати клієнт SFTP як веб-додаток у PHP. Чи підтримує PHP підтримку SFTP? Я не міг знайти жодних зразків. Хто-небудь може мені допомогти в цьому?

Відповіді:


72

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

3
Навіть при використанні file_get_contents () вам все одно потрібне розширення ssh2 (afaik).
StanE

пакети debian / ubuntu: apt install libssh2-1-dev php-ssh2
Ajay Singh

40

Функції ssh2 не дуже хороші. Важкий у використанні та складніший для встановлення, їх використання гарантуватиме, що ваш код має нульову портативність. Моєю рекомендацією було б використовувати phpseclib, чисту реалізацію PHP SFTP .


3
@indranama, чи не позначите ви це як правильну відповідь, щоб майбутнім користувачам не потрібно було читати коментарі, щоб знайти, що найкраще вам підходить?
Fi Horan

30

Я виявив, що "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? Ваш поточний приклад застарів.
Мартін

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розширення


відповідний потік, який мені допоміг: groups.google.com/forum/#!topic/comp.security.ssh/_55TdDdUTCw
Кваміс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.