Làm thế nào để SFTP với PHP?


81

Tôi đã xem qua nhiều tập lệnh PHP cho các máy khách FTP web. Tôi cần triển khai ứng dụng khách SFTP dưới dạng ứng dụng web bằng PHP. PHP có hỗ trợ SFTP không? Tôi không thể tìm thấy bất kỳ mẫu nào. Bất cứ ai có thể giúp tôi với điều này?

Câu trả lời:


71

PHP có trình bao bọc luồng ssh2 (bị tắt theo mặc định), vì vậy bạn có thể sử dụng kết nối sftp với bất kỳ chức năng nào hỗ trợ trình bao bọc luồng bằng cách sử dụng ssh2.sftp://cho giao thức, ví dụ:

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

hoặc - khi cũng sử dụng phần mở rộng 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');

Xem http://php.net/manual/en/wrappers.ssh2.php

Ngoài ra, cũng có khá nhiều câu hỏi về chủ đề này:


file_get_contents và file_put_contents đều hoạt động tuyệt vời. chưa bao giờ biết rằng họ đã làm việc với sftp và nó dễ dàng hơn nhiều so với việc sử dụng những thứ sftp được tích hợp sẵn. Cảm ơn!
jbrahy

3
Ngay cả khi sử dụng file_get_contents (), bạn vẫn cần phần mở rộng ssh2 (afaik).
StanE

Gói debian / ubuntu: apt install libssh2-1-dev php-ssh2
Ajay Singh

39

Các chức năng ssh2 không tốt lắm. Khó sử dụng và khó cài đặt hơn, việc sử dụng chúng sẽ đảm bảo rằng mã của bạn không có tính di động. Đề xuất của tôi là sử dụng phpseclib, một triển khai PHP SFTP thuần túy .


chỉ hỗ trợ SFTP v3
Blacksonic

3
@indranama bạn có đánh dấu đây là câu trả lời chính xác để người dùng trong tương lai không phải đọc nhận xét để tìm ra nhận xét phù hợp nhất với bạn không?
Fi Horan

28

Tôi thấy rằng "phpseclib" sẽ giúp bạn điều này (SFTP và nhiều tính năng khác). http://phpseclib.sourceforge.net/

Để đưa tệp vào máy chủ, chỉ cần gọi (Ví dụ về mã từ 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
Bạn có thể cập nhật câu trả lời của mình cho phpseclib 2.0 không? Ví dụ hiện tại của bạn đã lỗi thời.
Martin Prikryl

2

Cài đặt Flysystem:

composer require league/flysystem-sftp

Sau đó:

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
....

Đọc:

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


-1

Tôi đã thực hiện bản sao chép toàn bộ và viết một lớp tạo ra một tệp hàng loạt và sau đó gọi sftpquasystem cuộc gọi. Không phải là cách tốt nhất (hoặc nhanh nhất) để làm điều đó nhưng nó hoạt động cho những gì tôi cần và nó không yêu cầu cài đặt thêm thư viện hoặc phần mở rộng trong PHP.

Có thể là cách để đi nếu bạn không muốn sử dụng các ssh2tiện ích mở rộng


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.