Вопрос или проблема
У меня есть 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: выполнение автоматического скрипта, который устанавливает оболочку в интерактивный режим, является оксюмороном и эквивалентно тому, чтобы наставить заряженный пистолет на свой висок.
Что касается того, почему возникает это сообщение об ошибке, я могу только догадываться:
-
ваш ISP разрешает небольшое количество одновременных PTY, выделяемых каждому пользователю; это, например, политика GitHub (он не разрешает PTY), но не вижу особой пользы в разрешении небольшого, но не нулевого количества. Но, возможно, кто-то умнее меня сможет пролить свет на это…
-
вы пытаетесь сделать ssh из обратной оболочки, что является известной проблемой для тестировщиков на проникновение. Существуют способы обойти это.
-
это связано с либо устаревшей версией Secure Shell Client, которую вы используете, либо с Windows, но в любом случае я могу немного помочь.
Ответ или решение
Ошибка "stdin: is not a tty" при подключении по SSH: Причины и Решения
При работе с Linux-серверами через SSH пользователи могут столкнуться с сообщением об ошибке "stdin: is not a tty". Данная проблема, как правило, вызывает недоумение, особенно у опытных пользователей, которые ранее не сталкивались с подобным. Рассмотрим причины возникновения этой ошибки и методы ее устранения.
Причины возникновения ошибки
-
Отсутствие интерактивной оболочки: Ошибка возникает, когда запускаемая сессия SSH не находит выделенный терминал (TTY). Это может произойти по нескольким причинам:
- Открытие соединения с использованием конфигурации, которая не создает интерактивный терминал.
- Использование устаревших SSH-клиентов, которые могут некорректно обрабатывать параметры сессии.
-
Проблемы с
~/.bashrc
или~/.bash_profile
: Если в конфигурационных файлах оболочки присутствуют условия, проверяющие, является ли оболочка интерактивной, и если они не позволяют выполнять определенные команды или настройки, это может также привести к ошибке. Ваша оболочка не загрузится должным образом, если она не получила соответствующие настройки среды. -
Ограничения со стороны провайдера: Некоторые хостинг-провайдеры могут ограничивать количество одновременно открытых псевдотерминалов (PTY) для пользователя. Например, подобные ограничения присутствуют у некоторых облачных сервисов.
-
Использование обратного SSH: Если вы подключаетесь через обратное SSH-соединение, это также может стать причиной проблем, так как такие соединения часто не выделяют TTY.
Решения проблемы
-
Запуск интерактивной оболочки: Если вы столкнулись с этой ошибкой, попробуйте вручную запустить интерактивную оболочку, выполнив команду
bash -i
на удаленном сервере после подключения. Это временное решение, но оно поможет вам проверить, является ли проблема с TTY:bash -i
-
Проверка конфигурационных файлов: Убедитесь, что в ваших файлах
~/.bashrc
и~/.bash_profile
нет условий, которые предотвращают выполнение команд в неинтерактивных сессиях. Для этого проверьте наличие следующего фрагмента кода:case $- in *i*) ;; *) return;; esac
Если он есть, рассмотрите возможность его изменения, чтобы ваша конфигурация загружалась и в неинтерактивных сессиях. Однако будьте осторожны, не изменяйте его без необходимости.
-
Обновление SSH-клиента: Поскольку вы используете устаревший клиент Secure Shell, рассмотрите возможность перехода на более современные SSH-клиенты, такие как PuTTY или встроенный SSH-клиент в Windows (вы можете использовать Windows Terminal или PowerShell).
-
Проверка ограничений провайдера: Если вы подозреваете, что проблема может заключаться в ограничениях вашего провайдера, свяжитесь с их службой поддержки, чтобы прояснить условия использования и ограничения на подключение.
Заключение
Ошибка "stdin: is not a tty" может быть следствием нескольких факторов. Понимание основ этой проблемы и применение предложенных решений поможет избежать неполадок в будущем. Если проблемы продолжают возникать, рекомендуется обратить внимание на используемые вами инструменты и настройки окружения, чтобы не только устранить текущие неполадки, но и избежать их повторного появления в будущем.