@hydra_cc

Как загрузить файл по sftp в php?

никак не получается загрузить файл на удаленную машину с использованием библиотеки phpseclib

вот код который я использую:
<?php
require_once '../vendor/autoload.php'; // Путь к autoloader'у библиотеки phpseclib

use phpseclib\Net\SFTP; // Используем класс SFTP

$remoteHost = '192.168.146.129';
$remoteUsername = 'PC';
$remotePassword = 'root';
$remoteUploadDirectory = 'C:\\Users\\PC\\Desktop\\'; // Путь к директории на удаленном сервере, куда будем загружать файл

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['uploadedFile'])) {
    $uploadedFile = $_FILES['uploadedFile'];

    if ($uploadedFile['error'] === UPLOAD_ERR_OK) {
        $remoteUploadPath = $remoteUploadDirectory . basename($uploadedFile['name']);

        $sftp = new SFTP($remoteHost);
        if (!$sftp->login($remoteUsername, $remotePassword)) {
            die('SFTP Login Failed');
        }
        
        if (!$sftp->is_dir($remoteUploadDirectory)) {
            if (!$sftp->mkdir($remoteUploadDirectory, -1, true)) {
                die('Failed to create remote directory: ' . $sftp->getLastSFTPError());
            }
        }
        
        if ($sftp->put($remoteUploadPath, $uploadedFile['tmp_name'], SFTP::SOURCE_LOCAL_FILE)) {
            echo "Файл успешно загружен на удаленный сервер.";
        } else {
            echo "Ошибка при загрузке файла на удаленный сервер.";
        }
    } else {
        echo "Ошибка: " . $uploadedFile['error'];
    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>Загрузка файла на удаленный сервер</title>
</head>
<body>
    <h2>Загрузите файл на удаленный сервер:</h2>
    <form method="POST" enctype="multipart/form-data">
        <input type="file" name="uploadedFile">
        <button type="submit">Загрузить</button>
    </form>
</body>
</html>


с загрузкой файлов на kali linux не было никаких проблем, а тут скрипт просто не может найти директорию
проверял через командную строку, все работает, написал скрипт на питоне, тоже все хорошо, а с php проблемы какие-то

вот код на питоне:

import paramiko
 
def create_sftp_client(host, port, username, password):
    transport = paramiko.Transport((host, port))
    transport.connect(username=username, password=password)
 
    sftp_client = paramiko.SFTPClient.from_transport(transport)
 
    return sftp_client

def upload_file_to_server(sftp_client, local_file, remote_file):
    sftp_client.put(local_file, remote_file)

def main():
    sftp_client = create_sftp_client("192.168.146.129", 22, "PC", "root")
    upload_file_to_server(sftp_client, "C:\\Users\\PC\\Desktop\\test.txt", "C:\\Users\\PC\\Desktop\\test.txt")

if __name__ == "__main__":
    main()


подскажите пожалуйста что я не так делаю
  • Вопрос задан
  • 331 просмотр
Решения вопроса 1
@hydra_cc Автор вопроса
ошибка заключалась в том, что нужно было указывать путь следующим образом:

$remoteUploadDirectory = '/C:/Users/PC/Desktop/tmp/'; - правильный путь
$remoteUploadDirectory = 'C:/Users/PC/Desktop/tmp/'; - не правильный путь

увидел это при повторной попытке загрузить файл через командную строку

64e4e84a63e18408477587.png
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Мне нетрудно скопировать пример из документации
<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);

И получить на 100% корректный и на 100% бесполезный ответ.
Важна ведь не полезность ответа, а чтобы он понравился модераторам этого богоспасаемого ресурса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы