Опция systemd-run --pty может быть комбинирована с --user [email protected]?

Вопрос или проблема

Страница руководства для systemd-run не упоминает о том, что параметр --pty несовместим с параметрами --user или --machine. Но когда я пытаюсь использовать их вместе в простой команде, например:

sudo systemd-run --user [email protected] --pty /bin/bash

то я получаю такую ошибку:

Failed to get machine PTY: No machine '[email protected]' known

Должно ли это работать? Мне не ясно, связано ли это с проблемой конфигурации, ошибкой в systemd или моими ошибочными ожиданиями.

(Редакция: Я забыл упомянуть, что я могу использовать systemd-run вполне нормально с --user и [email protected] в общем случае. Я получаю ошибку только когда пытаюсь использовать --pty.)


Дополнительные детали:

  • Я могу успешно получить интерактивную оболочку как этот пользователь через machinectl shell, но, к сожалению, это не моя настоящая цель. На самом деле я пытаюсь запустить оболочку в контейнере rootless podman. Вышеприведенная команда — это просто минимальный способ продемонстрировать/воспроизвести проблему, с которой я сталкиваюсь.

  • Я вроде бы могу добиться того, что мне нужно, используя --pipe вместо --pty. Но я получаю странности и ошибки от bash, которые, я уверен, вызваны отсутствием TTY.

  • Я использую systemd-252-46.el9_5.2.x86_64, что является последней доступной версией в моем контексте. Хотя этот конкретный выпуск всего на несколько месяцев старше (ноябрь 2024), я вижу, что оригинальный выпуск v252 был в октябре 2022. Так что возможно, это ошибка в systemd, которая была исправлена давно, но я не смог найти никаких доказательств такого исправления при поиске в проблемах на GitHub systemd.

Ответ или решение

Вопрос о совместимости опции --pty с --user [email protected] в команде systemd-run поднимает несколько важных технических аспектов, которые необходимо рассмотреть, чтобы прояснить ситуацию. Для начала, разберёмся в теории вопроса.

Теория:

systemd-run предоставляет возможность запускать команды внутри системных служб и юнитов, создаваемых «на лету». Опция --pty, согласно документации, позволяет подключить псевдо-терминал к процессу, инициированному systemd-run. Это позволяет командному процессу вести себя так, как если бы он был запущен в интерактивной терминальной сессии, обеспечивая определенную функциональность, связанную с интерактивным вводом/выводом.

Опция --user [email protected], в свою очередь, предполагает выполнение команды в контексте удаленного пользователя или машины, что часто связано с использованием механизма Machined для управления контейнерами и виртуальными машинами. Данная опция обеспечивает запуск процессов от лица этого пользователя, но не добавляет им функциональность, связанную с управлением псевдо-терминалами.

На первый взгляд, упоминаний о несовместимости --pty с --user в официальной документации systemd не содержится, что теоретически дает предпосылки для их комбинированного использования. Однако на практике использование этих опций вместе может привести к конфликтам, что и отражается в сообщении об ошибке.

Пример:

Вы приводите пример команды:

sudo systemd-run --user [email protected] --pty /bin/bash

В этом случае ожидается создание сессии bash от имени указанного пользователя с псевдо-терминалом. Однако ошибка "Failed to get machine PTY: No machine ‘[email protected]’ known" указывает на то, что команда systemd-run ожидает существования определенной машины, которой, по-видимому, не может найти.

Это может быть связано с тем, что опция --machine, подразумевающая использовавние Machined, перекрывает контекст, ожидаемый для работы с псевдо-терминалами.

Применение:

Теперь давайте рассмотрим, как можно решить или обойти эту проблему:

  1. Проверка конфигурации Machined: Убедитесь, что ваша система распознаёт указанного вами пользователя и машину. Используйте команду machinectl list для просмотра доступных машин и убедитесь, что нужная машина активирована.

  2. Разделите ответственность: Если задача заключается именно в запуске shell в контейнере без root-привилегий (например, с использованием Podman), имеет смысл проверить документацию Podman, возможно, вам потребуется иной способ доступа к псевдо-терминалу внутри контейнера.

  3. Обратная связь к community: Хотя версия systemd, которую вы используете, свежая, полезно оставлять обратную связь разработчикам через GitHub или mailing list, чтобы они обратили внимание на казус взаимодействия --pty и --user. Это может выявить различные подходы к решению или привести в дополнительной фиксации в системе.

  4. Замена --pty на --pipe: Хотя это и не полностью удовлетворяет требованиям, но как временная мера можно использовать --pipe для передачи потоков ввода/вывода, компенсируя отсутствие псевдо-терминала дополнительными скриптами для корректного перенаправления ввода/вывода через script или expect.

Подводя итоги, использование --pty и --user в сочетании с systemd-run теоретически возможно, но требует дополнительных настроек и понимания работы с Machined. Подходите к решению с открытым умом, используя все доступные средства диагностики и обратной связи с сообществом, чтобы находить оптимальные решения для стоящих перед вами задач.

Оцените материал
Добавить комментарий

Капча загружается...