PHP tmux et screen ne se comportent pas correctement (pas de lancement, pas de nouvelle session, pas de nouvelle fenêtre)

J’ai des problèmes avec tmux / screen en php.
Lorsque je tente de lancer une session écran, rien ne se passe.
Lorsque j’essaie de lancer une session tmux, cela ne fonctionne que si je donne l’access à www-data shell et même si aucune fenêtre n’est ajoutée 🙁

Ce que j’essaie de réaliser:
Je veux coder une interface Web pour certains processus que je lance sur une machine virtuelle.
Pour cela j’ai écrit des scripts (en bash depuis que je suis sur une machine Linux debian).
Ces scripts doivent faire certaines choses:
– lancer une nouvelle fenêtre tmux (et la session si elle n’existe pas encore)
– voir si une fenêtre tmux est active / active
– stop processus (qui ferme automatiquement la fenêtre)
Et exécutés manuellement (dans un terminal), ces scripts se comportent comme souhaité.

Maintenant, l’interface Web lancera ces scripts (ils seront donc exécutés sur la fonction exec en php).

Comme ils sont exécutés sur PHP, ils sont exécutés en tant qu’utilisateur www-data, donc je ne peux pas accéder aux sessions tmux créées par www-data.

Donc, j’ai quelques recommandations lors du démarrage de la fenêtre / session:

  • J’ai une session nommée

    tmux new-session -s $ SessionName

  • Il doit être démarré depuis son lancement depuis php

    tmux new-session -d -s $ SessionName

  • Je veux pouvoir accéder à la session en tant que superutilisateur -> je dois définir un emplacement de socket

    tmux -S $ SocketLocationPath new-session -d -s $ SessionName

Donc, ma commande ressemble à ceci à la fin:

tmux -S /tmp/pairedsession.socket new-session -d -s "ProcessGroup1" 

Problèmes avec cette commande:

  • sans access au shell, cette commande ne parvient pas à se connecter au serveur (ce qui est bizarre puisque la nouvelle session devrait normalement démarrer le serveur)

  • avec access shell (ce que je n’aime pas pour des raisons de sécurité) mais la session est créée exactement comme je le voulais

Mais il y a encore quelques problèmes:

Comme je l’ai indiqué avant que je veuille créer des fenêtres pour gérer les processus
La commande ressemble à ceci:

 tmux -S $SocketLocationPath new-window -t "$SessionName" -n "$WindowName" "$cmd" 

Cela fonctionne mais uniquement pour les processus globaux (comme htop) ou les processus du répertoire php (comme les autres scripts)
Ce que je veux faire cependant, c’est d’exécuter un processus dans son propre répertoire de travail, qui n’est pas nécessairement dans un répertoire php ->

Ce que j’ai essayé

  • append 2> & 1 à chaque commande pour le débogage -> aucune aide
  • créer les sessions sans le SocketLocation
  • basculé de l’écran au tmux puisqu’il a une syntaxe plus facile
  • a donné access à www-data au shell

    sudo chsh -s / bin / sh www-data

  • utiliser les fonctions shell_exec, passthrough et exec dans php

  • en utilisant l’écran avec l’option -dmS

Solutions possibles

  • donner access à www-data shell ( Security Risk? ) ou peut-être restreindre l’access à tmux mais comment?
  • désactiver les parameters phps pour exécuter uniquement les fichiers dans les répertoires php ( risque de sécurité? )
  • ajoutez-moi une option tmux inconnue qui fonctionne sans shell: D
  • changer un paramètre php pour n’autoriser que certains répertoires ou est-ce que cela en vaut la peine?

  • faire quelque chose de complètement différent ???

Une autre chose étrange: lors du lancement des sessions tmux sur php, le terminal n’a aucun utilisateur et aucun emplacement
Normalement, il ressemble à user @ machinename $ …
Avec php, ça ressemble à $ … rien de plus

J’espère que quelqu’un peut m’aider, parce que je n’aime pas ces solutions de rechange désordonnées: /

Merci d’avance – superfuzzy

Après quelques difficultés, avec l’aide de googleguy @ freenode # php, je suis finalement parvenu à le réduire.

Il s’avère que PHP 7.1 (dans mon cas) n’a aucun problème de ce type.

Je réussis à exécuter cette séquence:

 shell_exec("tmux new-session -s session_name -d"); shell_exec("tmux send -t session_name gedit ENTER"); 

Poke moi ça ne marche pas avec toi