Подтвердить что ты не робот

PHP tmux и screen не работают корректно (без запуска, без нового сеанса, без новых окон)

У меня возникают проблемы с tmux/screen в php.
Когда я пытаюсь запустить сеанс экрана, ничего не происходит.
Когда я пытаюсь запустить сеанс tmux, он работает только в том случае, если я предоставляю доступ к оболочке www-data, и даже тогда никаких окон не добавляется:(

То, что я пытаюсь достичь:
Я хочу закодировать webinterface для некоторых процессов, которые я запускаю на виртуальной машине.
Для этого я написал несколько сценариев (в bash, так как я на Linux-машине debian).
Эти скрипты должны делать некоторые вещи:
 - запустите новое окно tmux (и сеанс, если он еще не существует)
 - посмотреть, работает ли окно tmux/активно
 - остановить процесс (который автоматически закрывает окно)
И выполнив вручную (в терминале), эти скрипты ведут себя как нужно.

Теперь веб-интерфейс должен запустить эти скрипты (чтобы они выполнялись над функцией exec в php).

Поскольку они запускаются через php, они запускаются как пользовательские www-данные, поэтому я не могу получить доступ к сеансам tmux, созданным www-data.

Итак, у меня есть несколько рекомендаций при запуске Window/session:

  • У меня есть именованный сеанс

    tmux new-session -s $SessionName

  • Его нужно запустить отдельно от его начала с php

    tmux new-session -d -s $SessionName

  • Я хочу иметь доступ к сеансу как суперпользователю → Мне нужно определить socketlocation

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

Итак, моя команда выглядит так:

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

Проблемы с этой командой:

  • без доступа к оболочке эта команда возвращает не подключиться к серверу (что странно, поскольку новый сеанс обычно должен запускаться на сервере)

  • с доступом к оболочке (что мне не нравится по соображениям безопасности), однако сеанс создается точно так, как я хотел

Но есть еще некоторые проблемы:

Как я уже говорил, я хочу создать несколько окон для обработки процессов
Команда выглядит следующим образом:

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

Это работает, но только для глобальных процессов (например, htop) или процессов в каталоге php (например, других скриптов)
Что я хочу сделать, это выполнить процесс в своем рабочем каталоге, который не обязательно находится в каталоге php → КАК МОЖНО ИЗМЕНИТЬ, ЧТО

Что я пробовал

  • добавление 2 > & 1 к каждой команде для отладки → без помощи
  • создание сеансов без SocketLocation
  • переключается с экрана на tmux, поскольку имеет упрощенный синтаксис
  • предоставил доступ к оболочке www-data​​p >

    sudo chsh -s/bin/sh www-data​​p >

  • с использованием функций shell_exec, passthrough и exec в php

  • используя экран с опцией -dmS

Возможные решения

  • предоставить доступ к оболочке www-data (Риск безопасности?) или, возможно, ограничить доступ к tmux, но как?
  • отключить настройку php только для запуска файлов в каталогах php (Риск безопасности?)
  • добавить к мне неизвестный параметр tmux, который работает без оболочки: D
  • измените некоторые настройки php, чтобы разрешить только определенные каталоги или это даже стоит того?

  • сделать что-то совершенно другое.

Еще одна странная вещь: при запуске сеансов tmux поверх php у терминала нет пользователя и нет места
Обычно это выглядит как user @machinename $...
С php это просто выглядит как $... ничего более

Я надеюсь, что кто-то может мне помочь, потому что мне просто не нравятся эти грязные обходные пути:/

Спасибо заранее - суперфузия

4b9b3361

Ответ 1

После некоторых попыток, с помощью googleguy @freenode # php, я, наконец, побил это.

Оказывается, PHP 7.1 (в моем случае) вообще не имеет такой проблемы.

Мне удастся выполнить эту последовательность:

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

Подумайте, что это не сработает с вами.