SSH множественная сессия -> “stdin: не является терминалом”

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

У меня есть Linux-VPS, я использую его в качестве GIT- и HTTP-сервера.

HTTP: Apache

Git-сервер: git-http-backend через vhost

Когда я вхожу через SSH, все в порядке.
Но если я открываю второе SSH-соединение, я получаю следующую ошибку:

stdin: не является терминалом

Я использую ssh много лет и никогда не видел такой ошибки. Я искал решения больше 1,5 часов…

Пока я это писал, ошибка стала еще более странной — теперь ошибка появляется на каждом соединении!

Я не нашел ни одного решения, которое помогло бы мне.

Я использую:

  • Windows
  • Secure Shell Client (довольно устаревший, но гораздо приятнее, чем putty)

По причинам, которые я не понимаю (но объясню позже), ваша оболочка не настроена на интерактивный режим; просто выполните на удаленном сервере

  bash -i 

это сделает оболочку интерактивной, и вы будете в порядке. На этом этапе вам возможно придется выполнить ваш файл .bashrc, потому что стандартные файлы часто содержат следующие строки, расположенные в самом верху файла:

 case $- in
          *i*) ;;
           *) return;;
 esac

Это проверяет, присутствует ли среди флагов оболочки ($-) буква i, означающая интерактивный; если ее нет, выполняется пропуск загрузки файла. Следовательно, необходимо выполнить

 source ~/.bashrc

что вернет вам стандартную среду. Я разительно не рекомендую вам автоматически выполнять bash -i, например, внутри вашего файла .bashrc: выполнение автоматического скрипта, который устанавливает оболочку в интерактивный режим, является оксюмороном и эквивалентно тому, чтобы наставить заряженный пистолет на свой висок.

Что касается того, почему возникает это сообщение об ошибке, я могу только догадываться:

  1. ваш ISP разрешает небольшое количество одновременных PTY, выделяемых каждому пользователю; это, например, политика GitHub (он не разрешает PTY), но не вижу особой пользы в разрешении небольшого, но не нулевого количества. Но, возможно, кто-то умнее меня сможет пролить свет на это…

  2. вы пытаетесь сделать ssh из обратной оболочки, что является известной проблемой для тестировщиков на проникновение. Существуют способы обойти это.

  3. это связано с либо устаревшей версией Secure Shell Client, которую вы используете, либо с Windows, но в любом случае я могу немного помочь.

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

Ошибка "stdin: is not a tty" при подключении по SSH: Причины и Решения

При работе с Linux-серверами через SSH пользователи могут столкнуться с сообщением об ошибке "stdin: is not a tty". Данная проблема, как правило, вызывает недоумение, особенно у опытных пользователей, которые ранее не сталкивались с подобным. Рассмотрим причины возникновения этой ошибки и методы ее устранения.

Причины возникновения ошибки

  1. Отсутствие интерактивной оболочки: Ошибка возникает, когда запускаемая сессия SSH не находит выделенный терминал (TTY). Это может произойти по нескольким причинам:

    • Открытие соединения с использованием конфигурации, которая не создает интерактивный терминал.
    • Использование устаревших SSH-клиентов, которые могут некорректно обрабатывать параметры сессии.
  2. Проблемы с ~/.bashrc или ~/.bash_profile: Если в конфигурационных файлах оболочки присутствуют условия, проверяющие, является ли оболочка интерактивной, и если они не позволяют выполнять определенные команды или настройки, это может также привести к ошибке. Ваша оболочка не загрузится должным образом, если она не получила соответствующие настройки среды.

  3. Ограничения со стороны провайдера: Некоторые хостинг-провайдеры могут ограничивать количество одновременно открытых псевдотерминалов (PTY) для пользователя. Например, подобные ограничения присутствуют у некоторых облачных сервисов.

  4. Использование обратного SSH: Если вы подключаетесь через обратное SSH-соединение, это также может стать причиной проблем, так как такие соединения часто не выделяют TTY.

Решения проблемы

  1. Запуск интерактивной оболочки: Если вы столкнулись с этой ошибкой, попробуйте вручную запустить интерактивную оболочку, выполнив команду bash -i на удаленном сервере после подключения. Это временное решение, но оно поможет вам проверить, является ли проблема с TTY:

    bash -i
  2. Проверка конфигурационных файлов: Убедитесь, что в ваших файлах ~/.bashrc и ~/.bash_profile нет условий, которые предотвращают выполнение команд в неинтерактивных сессиях. Для этого проверьте наличие следующего фрагмента кода:

    case $- in
       *i*) ;;
       *) return;;
    esac

    Если он есть, рассмотрите возможность его изменения, чтобы ваша конфигурация загружалась и в неинтерактивных сессиях. Однако будьте осторожны, не изменяйте его без необходимости.

  3. Обновление SSH-клиента: Поскольку вы используете устаревший клиент Secure Shell, рассмотрите возможность перехода на более современные SSH-клиенты, такие как PuTTY или встроенный SSH-клиент в Windows (вы можете использовать Windows Terminal или PowerShell).

  4. Проверка ограничений провайдера: Если вы подозреваете, что проблема может заключаться в ограничениях вашего провайдера, свяжитесь с их службой поддержки, чтобы прояснить условия использования и ограничения на подключение.

Заключение

Ошибка "stdin: is not a tty" может быть следствием нескольких факторов. Понимание основ этой проблемы и применение предложенных решений поможет избежать неполадок в будущем. Если проблемы продолжают возникать, рекомендуется обратить внимание на используемые вами инструменты и настройки окружения, чтобы не только устранить текущие неполадки, но и избежать их повторного появления в будущем.

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

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