W3docs

ftp_exec()

Découvrez pourquoi ftp_exec() a été supprimée de PHP et comment exécuter des commandes distantes de façon sécurisée avec ssh2 ou phpseclib.

La fonction PHP ftp_exec()

ftp_exec() était une fonction PHP intégrée qui demandait à un serveur FTP distant d'exécuter une commande shell en votre nom. Elle a été dépréciée dans PHP 5.3.0 et supprimée dans PHP 7.0.0, et n'est donc pas disponible dans les versions modernes de PHP. Cette page explique ce qu'elle faisait, pourquoi elle a disparu et — plus utile — comment exécuter des commandes à distance de façon sécurisée aujourd'hui.

Si vous avez seulement besoin de gérer des fichiers via FTP (téléversement, téléchargement, listage, renommage), vous n'avez pas besoin d'exécution de commandes. Consultez la vue d'ensemble PHP FTP et des fonctions comme ftp_connect() et ftp_raw().

Ce que faisait ftp_exec()

La fonction prenait deux paramètres et renvoyait un boolean :

ParamètreTypeDescription
$ftp_streamresourceLa connexion retournée par ftp_connect().
$commandstringLa commande à exécuter sur le serveur FTP.

Elle renvoyait true si le serveur acceptait et exécutait la commande, et false en cas d'échec. En coulisses, elle envoyait la commande FTP SITE EXEC, qui ne fonctionne que si le serveur active explicitement cette fonctionnalité.

Syntaxe historique

bool ftp_exec(resource $ftp_stream, string $command)

La signature utilisait un identifiant de connexion de type resource. La classe orientée objet FTP\Connection a été ajoutée dans PHP 8.0 — bien après la suppression de ftp_exec() — donc les deux n'ont jamais coexisté.

Pourquoi elle a été supprimée

Deux problèmes rendaient ftp_exec() inutilisable en pratique :

  • Elle n'était presque jamais disponible. SITE EXEC permet à un client FTP d'exécuter des commandes shell arbitraires sur le serveur. C'est un risque d'exécution de code à distance typique, aussi les serveurs courants tels que vsftpd et ProFTPD la livrent désactivée par défaut, et la plupart des hébergeurs ne l'ont jamais activée.
  • FTP lui-même est non sécurisé. Le FTP simple envoie les identifiants et les données en clair. Ajouter l'exécution de commandes par-dessus un protocole non chiffré va exactement dans la mauvaise direction. (Si vous devez utiliser FTP pour des fichiers, préférez ftp_ssl_connect() pour le FTPS.)

Parce que la fonctionnalité était à la fois dangereuse et pratiquement inutilisée, PHP l'a dépréciée dans la version 5.3.0 et supprimée entièrement dans la version 7.0.0.

Avertissement

Appeler ftp_exec() dans PHP 7.0 ou version ultérieure génère une Error: Call to undefined function ftp_exec(). Il n'existe pas de remplacement direct au sein de l'extension FTP — l'exécution de commandes à distance appartient à SSH.

Exécution sécurisée de commandes à distance aujourd'hui

Pour exécuter une commande sur une machine distante depuis PHP, utilisez SSH, pas FTP. Deux options standard existent :

  • L'extension ssh2 — une extension PECL native encapsulant libssh2.
  • phpseclib — une bibliothèque PHP pure ne nécessitant aucune extension, ce qui la rend idéale pour l'hébergement mutualisé.

Option 1 : l'extension ssh2

<?php

// 1. Open an SSH connection (default SSH port is 22)
$conn = ssh2_connect('example.com', 22);
if (!$conn) {
    die("Could not connect to server.\n");
}

// 2. Authenticate
if (!ssh2_auth_password($conn, 'username', 'password')) {
    die("SSH authentication failed.\n");
}

// 3. Run the command
$stream = ssh2_exec($conn, 'ls -al');
if ($stream === false) {
    die("Failed to execute command.\n");
}

// 4. Read its output
stream_set_blocking($stream, true);
$output = stream_get_contents($stream);

echo $output;

ssh2_connect() ouvre le canal chiffré, ssh2_auth_password() effectue la connexion et ssh2_exec() exécute la commande et retourne un flux. Passer le flux en mode bloquant avec stream_set_blocking() garantit que vous lisez l'intégralité de la sortie avant que le script ne continue — un piège classique qui donne sinon des résultats vides.

Option 2 : phpseclib (aucune extension requise)

<?php

require 'vendor/autoload.php';

use phpseclib3\Net\SSH2;

$ssh = new SSH2('example.com');
if (!$ssh->login('username', 'password')) {
    exit('SSH login failed');
}

echo $ssh->exec('ls -al');

Parce que phpseclib est entièrement écrite en PHP, elle fonctionne partout où PHP fonctionne — pas de compilation PECL, pas d'extension au niveau du serveur. Installez-la avec composer require phpseclib/phpseclib.

Gestion des erreurs

Vérifiez toujours la valeur de retour avant de lire la sortie. Avec l'extension ssh2, ssh2_exec() retourne false en cas d'échec :

<?php

$stream = ssh2_exec($conn, 'ls -al');

if ($stream === false) {
    echo "Failed to execute the command.\n";
} else {
    stream_set_blocking($stream, true);
    echo stream_get_contents($stream);
}

Pour de meilleures garanties de sécurité, préférez l'authentification par clé (ssh2_auth_pubkey_file()) aux mots de passe, et n'interpolez jamais des données non fiables directement dans une chaîne de commande — échappez les arguments avec escapeshellarg() pour éviter l'injection de commandes.

Points clés

  • ftp_exec() exécutait une commande sur un serveur FTP via SITE EXEC ; elle a été dépréciée dans PHP 5.3.0 et supprimée dans PHP 7.0.0.
  • Elle a été supprimée car SITE EXEC est un risque d'exécution de code à distance que la plupart des serveurs désactivent, et FTP est non chiffré.
  • Pour les commandes à distance aujourd'hui, utilisez SSH via l'extension ssh2 ou phpseclib — jamais FTP.
  • Pour les transferts de fichiers simples, l'extension FTP reste valable ; commencez par ftp_connect(), ftp_login() et la vue d'ensemble PHP FTP.

Pratique

Pratique
Quel est l'objectif de la commande FTP exec en PHP ?
Quel est l'objectif de la commande FTP exec en PHP ?
Was this page helpful?