Вопрос или проблема
Страница руководства для 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, перекрывает контекст, ожидаемый для работы с псевдо-терминалами.
Применение:
Теперь давайте рассмотрим, как можно решить или обойти эту проблему:
-
Проверка конфигурации Machined: Убедитесь, что ваша система распознаёт указанного вами пользователя и машину. Используйте команду
machinectl list
для просмотра доступных машин и убедитесь, что нужная машина активирована. -
Разделите ответственность: Если задача заключается именно в запуске shell в контейнере без root-привилегий (например, с использованием Podman), имеет смысл проверить документацию Podman, возможно, вам потребуется иной способ доступа к псевдо-терминалу внутри контейнера.
-
Обратная связь к community: Хотя версия systemd, которую вы используете, свежая, полезно оставлять обратную связь разработчикам через GitHub или mailing list, чтобы они обратили внимание на казус взаимодействия
--pty
и--user
. Это может выявить различные подходы к решению или привести в дополнительной фиксации в системе. -
Замена
--pty
на--pipe
: Хотя это и не полностью удовлетворяет требованиям, но как временная мера можно использовать--pipe
для передачи потоков ввода/вывода, компенсируя отсутствие псевдо-терминала дополнительными скриптами для корректного перенаправления ввода/вывода черезscript
илиexpect
.
Подводя итоги, использование --pty
и --user
в сочетании с systemd-run
теоретически возможно, но требует дополнительных настроек и понимания работы с Machined. Подходите к решению с открытым умом, используя все доступные средства диагностики и обратной связи с сообществом, чтобы находить оптимальные решения для стоящих перед вами задач.