Forum Programmation.web PHP+Bash afficher liste Tunnel SSH

Posté par  . Licence CC By‑SA.
Étiquettes :
2
20
jan.
2020

Bien le bonjour l'assemblée.

Double question/problématique en vue de corriger un bug dans une sonde. Dans cette feature la sonde est censé afficher la liste des tunnels SSH.

  1. Pourquoi le script suivant fonctionne-t-il avec php-cli mais pas avec php-fpm ? Peut-on corriger cela et si oui comment ?
<?php
echo listSSHTunnel();

function listSSHTunnel(){
    // work with cli, not with fpm
    return exec("ps -aux | grep '[s]sh.*:.*:' | grep -Eo ' [\.0-9a-Z]{1,}:[\.0-9a-Z]{1,}:[\.0-9a-Z]{1,} ' | sed 's# ##g' | sort | uniq  | sed ':a;N;$!ba;s#\\n#--#g'");
}
?>

Fonctionne (affiche par exemple 666:127.0.0.1:666) :

sudo -u www-data php -f ./test.php

Ne fonctionne pas (page blanche et erreur dans les logs indiquant que sed et grep n'ont rien reçu provenant de la commande de départ):

wget https://helloworld/test.php
  1. Seconde question : Comment récupérer le destinataire de chaque tunnel SSH ? (qu'il soit IP ou nom de domaine)
  • # exec

    Posté par  . Évalué à 3. Dernière modification le 20/01/20 à 17:31.

    Parce que ta configuration php-fpm interdit exec.
    C'est une bonne chose.

    • [^] # Re: exec

      Posté par  . Évalué à 1. Dernière modification le 20/01/20 à 17:45.

      Ca ne vient point de là, les autres fonctions n'ont pas de soucis. (mais aucune n'utilise ps -aux)

      • [^] # Re: exec

        Posté par  . Évalué à 4. Dernière modification le 20/01/20 à 19:17.

        Essaye de faire plusieurs exec, chacune avec une seule commande, pour voir celle qui ne passe.

        • [^] # Re: exec

          Posté par  . Évalué à 2. Dernière modification le 21/01/20 à 01:12.

          Sage conseil, c'était le second grep (à mon avis le \ qui n'est pas apprécié par l'interpreteur de php).
          Les deux problématiques sont résolues en convertissant la majeure partie en PHP, il ne me manque qu'une regex :
          Si quelqu'un aurait une regex plus solide pour capturer tout hostname (word, ipv4, ipv6) afin de remplacer [a-z0-9.]{1,} dans cette regex '/@[a-z0-9.]{1,}(:[0-9]{1,}){0,1}/i'

          Exemple de ligne (on cherche a capturer @8.8.8.8:666 ici, mais les ports peuvent ne pas être indiqué). Avec ou sans le @ (je n'arrive pas a l'utiliser comme "balise" sans le capturer mais ce n'est pas bloquant).

          usersys+ 4242 0.1 0.0 424242 4242 ? S Jan42 42:42 /usr/bin/ssh -q -N -o ServerAliveInterval 42 -o ServerAliveCountMax 42 -L 4242:hostname.Or.IPv4.Or.IPv6:4242 usersystem@8.8.8.8:666
          

          La regex actuelle n'est pas terrible mais fonctionne avec les hostnames.

          • [^] # Re: exec

            Posté par  . Évalué à 1.

            Si quelqu'un aurait une regex plus solide pour capturer tout hostname (word, ipv4, ipv6)

            Compatible avec php preg_match

  • # Question existentielle

    Posté par  . Évalué à 1.

    Je teste mon script en créant deux tunnels SSH depuis le même user. Si je tape la commande bash suivante, je les vois bien tout deux.

    ps -aux | grep "[s]sh.*:.*:"

    Mais si je teste la commande via PHP (via le script suivant), je n'en vois qu'un. Pourquoi ?

    <?php
    print_r(exec('ps -aux | grep "[s]sh.*:.*:"'));
    ?>
    • [^] # Re: Question existentielle

      Posté par  . Évalué à 2. Dernière modification le 21/01/20 à 18:54.

      Réponse => supprimer les new lines avant que la string n'arrive a PHP.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.