Вопрос или проблема
Я пытаюсь войти в Ubuntu desktop. Я получаю следующее сообщение об ошибке:
Заявка на выделение PTY не удалась
Что это значит и как подключиться к рабочему столу?
Вот вывод с -v
:
debug1: Чтение конфигурационных данных /home/evag/.ssh/config
debug1: /home/evag/.ssh/config строка 1: Применение параметров для *
debug1: Чтение конфигурационных данных /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config строка 19: Применение параметров для *
debug1: auto-mux: Попытка использования существующего мастера
debug1: mux_client_request_session: идентификатор мастер-сессии: 2
Заявка на выделение PTY не удалась
Учитывая вывод выше с включенной опцией подробного вывода, я думаю, что понимаю, откуда возникает проблема: у меня есть два компьютера, A и B. Я использую ControlMaster на A, чтобы поддерживать устойчивые соединения с B. A подключается к B безопасным способом, с command=/bin/false
, чтобы ограничить использование A на B (у него есть только возможности пересылки).
Тем не менее, я хочу подключиться к ssh с A на B, не используя эту идентификацию (-i), но проблема в том, что поскольку существует постоянное соединение, оно использует существующее соединение независимо от опции, которую я указываю в -i, поэтому я не могу выделить PTY.
Так что, учитывая, что существует уже установленный ControlMaster и защищенное соединение с A на B, как я могу получить другое соединение с A на B, но на этот раз с полными правами?
Я предполагаю, что вы указали ControlPath и ControlMaster в ~/.ssh/config? В этом случае ssh всегда будет проверять ControlPath при попытке доступа к этому серверу. Насколько я понимаю, это стандартный процесс, если ControlPath существует, даже если ControlMaster=no установлен (потому что он автоматически устанавливается в ‘no’, если ControlPath существует, чтобы не пытаться создать новый ControlMaster).
Вам нужно будет указать новый ControlPath:
ssh -o ControlPath=~/.ssh/%r@%h:%p-newsession server
Однако: я делаю то же самое, но не нужно указывать запускать ‘false’, я просто использую доступные параметры в SSH. Посмотрите страницу man для способа создать пересылающие соединения без запуска оболочки. Когда это делается правильно, PTY выделяется только по необходимости, даже через одно и то же контрольное соединение.
-f Запрашивает ssh уйти в фоновый режим непосредственно перед выполнением команды.
-N Не выполнять удаленную команду. Это полезно только для пересылки портов.
-T Отключить выделение псевдотерминала.
Таким образом, в моем случае (вместе с другими, не связанными опциями):
ssh -fNT server
где ~/.ssh/config уже указывает на ControlPath.
Ответ или решение
Ошибка "PTY allocation request failed" при попытке подключения по SSH с использованием ControlMaster возникает из-за того, что вы пытаетесь получить доступ к удаленной машине, где уже установлено ограничение на выделение псевдотерминалов (PTY). Это происходит, когда на сервере B у вас есть существующий контрольный сеанс, который ограничивает права доступа, например, с помощью опции command=/bin/false
.
Что это значит?
Когда вы используете SSH с ControlMaster, SSH пытается переиспользовать уже существующее соединение для установления нового сеанса. Если первое соединение использует настройки, которые не позволяют выделить псевдотерминал (как это сделано с command=/bin/false
), то при попытке нового логина вы получите сообщение об ошибке "PTY allocation request failed".
Как исправить проблему?
Для исправления ошибки вы можете использовать несколько различных подходов:
-
Создание нового ControlPath:
Чтобы обеспечить возможность установления нового соединения с полными правами, вам нужно указать другой путь для ControlPath, который будет отличаться от уже существующего. Например:ssh -o ControlPath=~/.ssh/%r@%h:%p-newsession username@server
Этот подход позволит создать новый сеанс, который не будет конфликтовать с уже существующим.
-
Использование опций для SSH:
Если ваша цель состоит в том, чтобы просто установить перенаправление портов или соединение без необходимости выделять псевдотерминал, вы можете использовать следующие опции SSH:-f
: Переводит SSH в фоновый режим перед выполнением команды.-N
: Не выполняет удаленную команду, что полезно для создания только перенаправления портов.-T
: Отключает выделение псевдотерминала.
Вы можете сформировать команду следующим образом:
ssh -fNT username@server
Убедитесь, что в вашем
~/.ssh/config
уже указан правильный ControlPath. -
Настройка вашего SSH-сервера:
Проверить конфигурацию вашего SSH-сервера на стороне B и убедиться, что у вас есть необходимые права для выделения псевдотерминала. Вы можете изменить настройки в файле/etc/ssh/sshd_config
, если это необходимо, после чего потребуется перезапустить SSH-сервер.
Заключение
Ошибка "PTY allocation request failed" может быть решена несколькими методами, в зависимости от ваших требований к соединению. Осуществление нового подключения через измененный ControlPath или использование специфических опций SSH может эффективно обойти ограничения без необходимости прекращения существующих сеансов. Всегда проверяйте ваши настройки SSH для обеспечения совместимости и правильной работы.