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:
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:
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 .
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);
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:
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 sftp
quasystem
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 ssh2
tiện ích mở rộng