Перейти к содержимому

ftp_exec()

Понимание функции PHP ftp_exec()

В этом руководстве объясняется историческая функция ftp_exec(), причины её удаления и способы безопасного выполнения удалённых команд в современном PHP.

Что такое ftp_exec()?

Функция ftp_exec() была встроенной функцией PHP, позволявшей выполнять команды на удалённом FTP-сервере. Ранее она принимала два параметра:

  1. ftp_stream: Идентификатор соединения, возвращаемый функцией ftp_connect().
  2. command: Команда, которую вы хотите выполнить на FTP-сервере.

Функция возвращала логическое значение. Если выполнение команды было успешным, она возвращала true. В противном случае — false.

Важно: ftp_exec() опиралась на поддержку FTP-сервером команды SITE EXECUTE. Из-за серьёзных рисков для безопасности эта функция по умолчанию отключена на большинстве современных FTP-серверов (например, vsftpd и ProFTPD). Более важно то, что ftp_exec() была помечена как устаревшая в PHP 5.3.0 и удалена в PHP 7.0.0, что делает её полностью недоступной в современных версиях PHP.

Синтаксис ftp_exec()

Исторический синтаксис функции ftp_exec() выглядел следующим образом:

Синтаксис ftp_exec()

php
bool ftp_exec ( resource $ftp_stream , string $command )

(Примечание: Исторически эта функция принимала идентификатор соединения типа resource. Класс FTP\Connection с ООП-подходом был введён в PHP 8.0, уже после удаления ftp_exec().)

Безопасное выполнение удалённых команд

Поскольку ftp_exec() удалена, а FTP не поддерживает безопасное выполнение команд, вместо неё следует использовать библиотеки на основе SSH. Расширение ssh2 или phpseclib являются стандартными решениями для современного PHP.

Использование с расширением ssh2

php
<?php

// Set up an SSH connection
$conn = ssh2_connect('ftp.example.com', 22);
if (!$conn) {
    die("Could not connect to server.");
}

// Login with SSH credentials
if (!ssh2_auth_password($conn, 'username', 'password')) {
    die("SSH login failed.");
}

// Execute a command
$stream = ssh2_exec($conn, 'ls -al');
if ($stream === false) {
    die("Failed to execute command.");
}

// Read output
$output = stream_get_contents($stream);

// Close the connection
ssh2_disconnect($conn);

В этом примере мы устанавливаем SSH-соединение с помощью функции ssh2_connect(). Затем выполняем аутентификацию с помощью ssh2_auth_password(). Наконец, выполняем команду с помощью ssh2_exec() и закрываем соединение с помощью ssh2_disconnect().

Обработка ошибок при современном удалённом выполнении

Важно правильно обрабатывать ошибки при выполнении удалённых команд. Если функция возвращает false, это означает, что команду не удалось выполнить по какой-либо причине. Вот пример обработки ошибок:

Обработка ошибок в ssh2_exec()

php
<?php

$stream = ssh2_exec($conn, 'ls -al');
if ($stream === false) {
    echo "Failed to execute the command.\n";
} else {
    echo "Command executed successfully.\n";
}

В этом примере мы проверяем возвращаемое значение функции ssh2_exec(). Если оно равно false, выводим сообщение об ошибке; в противном случае — сообщение об успехе.

Заключение

Функция ftp_exec() была помечена как устаревшая в PHP 5.3.0 и удалена в PHP 7.0.0 из-за уязвимостей безопасности и отсутствия безопасного выполнения команд через FTP. Для выполнения удалённых команд в современном PHP всегда используйте решения на основе SSH, такие как расширение ssh2 или phpseclib.

Практика

Какова цель команды FTP exec в PHP?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.