bash — PHP tmux и экран ведут себя некорректно (без запуска, без новой сессии, без новых окон)

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

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

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

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

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

  • У меня есть названная сессия

    tmux new-session -s $ SessionName

  • Его нужно запускать отдельно, так как он запускается с php

    tmux new-session -d -s $ SessionName

  • Я хочу иметь доступ к сеансу как суперпользователь -> я должен определить расположение сокетов

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

В итоге моя команда выглядит так:

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

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

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

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

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

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

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

Это работает, но только для глобальных процессов (например, htop) или процессов в каталоге php (как и другие скрипты)
Что я хочу сделать, так это выполнить процесс в своем собственном рабочем каталоге, который не обязательно находится в каталоге php -> Как я могу изменить это

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

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

    sudo chsh -s / bin / sh www-data

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

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

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

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

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

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

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

заранее спасибо
— супер пушистый

10

Решение

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

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

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

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

Ткни мне это не работает с тобой

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]