Outils pour utilisateurs

Outils du site


lumo:configurer_dokuwiki_nginx_pour_executer_un_script_bash

Configurer dokuwiki + nginx pour exécuter un script bash

retour


Configurer DokuWiki avec Nginx pour exécuter un script Bash n'est pas une opération standard, car DokuWiki est écrit en PHP et Nginx est un serveur web statique qui ne peut pas exécuter de scripts côté serveur par défaut (contrairement à Apache avec mod_cgi ou mod_fcgid).Pour réaliser cela, vous avez deux approches principales selon votre objectif :
Exécuter le script via PHP (Recommandé) : Créer un petit fichier PHP dans DokuWiki qui appelle le script Bash. C'est la méthode la plus sûre et la plus intégrée.
Utiliser Nginx comme proxy vers un service externe : Si le script doit tourner en arrière-plan ou être très lourd, il vaut mieux l'exposer via un petit serveur (ex: Python, Go, ou un service systemd) et y accéder via une URL proxyée par Nginx.

Voici comment procéder pour la méthode PHP (la plus courante pour DokuWiki) :
Étape 1 : Préparer le script Bash
Créez votre script (par exemple /usr/local/bin/myscript.sh) et assurez-vous qu'il est exécutable.
sudo nano /usr/local/bin/myscript.sh
Contenu exemple :
#!/bin/bash
echo "Script exécuté avec succès"
# Ajoutez vos commandes ici
Rendez-le exécutable :
sudo chmod +x /usr/local/bin/myscript.sh
Important : Vérifiez que l'utilisateur qui exécute PHP (souvent www-data ou nginx) a les permissions d'exécuter ce script. Vous pouvez utiliser sudo avec un fichier sudoers spécifique si nécessaire, mais attention aux risques de sécurité.
Étape 2 : Créer un plugin ou un fichier PHP dans DokuWiki
La méthode la plus propre est de créer un petit plugin ou simplement un fichier PHP dans le répertoire lib/exe/ de DokuWiki (bien que ce dernier soit moins recommandé pour la maintenance, c'est rapide pour un test).
Créons un fichier lib/exe/runscript.php :
<?php
// lib/exe/runscript.php

// Sécurité : Vérifier que l'utilisateur est connecté et a les droits admin (optionnel mais recommandé)
if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] !== 'votre_admin') {
    header('WWW-Authenticate: Basic realm="Restricted Area"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Accès refusé';
    exit;
}

// Chemin absolu vers le script
$script_path = '/usr/local/bin/myscript.sh';

// Vérifier que le fichier existe
if (!file_exists($script_path)) {
    die("Erreur : Le script n'existe pas.");
}

// Exécution sécurisée
// On désactive l'ouverture de flux pour éviter les injections
$cmd = escapeshellcmd($script_path);
$output = shell_exec($cmd . ' 2>&1'); // 2>&1 pour capturer les erreurs aussi

header('Content-Type: text/plain');
echo "Résultat de l'exécution :\n";
echo $output;
?>
Note : escapeshellcmd est crucial pour éviter l'injection de commandes.
Étape 3 : Configurer Nginx
Nginx doit être configuré pour traiter les fichiers .php via PHP-FPM. Si vous avez déjà DokuWiki fonctionnel, cette partie est probablement déjà faite. Cependant, assurez-vous que le bloc location pour DokuWiki inclut le traitement PHP.
Dans votre fichier de configuration Nginx (ex: /etc/nginx/sites-available/dokuwiki) :
server {
    listen 80;
    server_name wiki.votre-domaine.com;
    root /var/www/dokuwiki; # Chemin vers votre installation DokuWiki

    index index.php;

    location / {
        try_files $uri $uri/ @dokuwiki;
    }

    location @dokuwiki {
        rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last;
        rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last;
        rewrite ^/_export/(.*) /lib/exe/export.php?do=$1 last;
        rewrite ^/(.*) /index.php?do=$1 last;
    }

    # Traitement PHP pour tous les fichiers .php, y compris runscript.php
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock; # Adaptez le socket à votre version PHP
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        
        # Sécurité : Empêcher l'exécution de PHP dans les dossiers upload
        location ~* ^/lib/plugins/.+\.php$ {
            deny all;
        }
    }

    # Désactiver l'accès direct aux fichiers sensibles
    location ~ /\.ht {
        deny all;
    }
}
Redémarrez Nginx et PHP-FPM :
sudo systemctl restart php8.1-fpm
sudo systemctl reload nginx
Étape 4 : Tester
Accédez à https://wiki.votre-domaine.com/lib/exe/runscript.php. Si la configuration HTTP Basic Auth est active, entrez vos identifiants.
Alternatives et Considérations de Sécurité


Permissions sudo : Si le script nécessite des droits root, ne donnez pas les droits root au compte www-data. Créez une règle dans /etc/sudoers (via visudo) permettant à www-data d'exécuter uniquement ce script sans mot de passe :
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/myscript.sh

Et modifiez le PHP pour : $cmd = 'sudo ' . escapeshellarg($script_path);


Plugin DokuWiki : Pour une meilleure intégration, il est préférable de créer un vrai plugin DokuWiki (dans lib/plugins/myscript/) plutôt que de toucher directement à lib/exe/. Cela permet d'utiliser les permissions natives de DokuWiki (acl_check()) pour vérifier les droits de l'utilisateur avant d'exécuter le script.


Sécurité : Ne jamais exécuter de scripts Bash non sécurisés via le web sans authentification forte et validation stricte des entrées. Un script mal configuré peut permettre l'exécution de commandes arbitraires sur votre serveur.


Si vous aviez une intention différente (par exemple, exécuter le script lors du chargement d'une page ou via un cron), précisez-le, car la configuration Nginx serait alors différente (ou inutile pour le déclenchement).
lumo/configurer_dokuwiki_nginx_pour_executer_un_script_bash.txt · Dernière modification : de estro

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki