@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()


подскажите пожалуйста что я не так делаю
  • Вопрос задан
  • 258 просмотров
Решения вопроса 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% бесполезный ответ.
Важна ведь не полезность ответа, а чтобы он понравился модераторам этого богоспасаемого ресурса.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
28 апр. 2024, в 00:54
10000 руб./за проект
28 апр. 2024, в 00:53
70000 руб./за проект
27 апр. 2024, в 21:24
150000 руб./за проект