Как решить ошибку "Псевдотерминал не будет выделен"

Как решить ошибку "Псевдотерминал не будет выделен"

30.05.2024
Автор: HostZealot Team
2 мин.
368

При использовании протокола Secure Shell (SSH) для доступа к удаленному компьютеру может возникнуть ошибка "Псевдотерминал не будет выделен, так как stdin не является терминалом".

Псевдотерминал - это заменитель физического терминала, сохраняющий всю его функциональность. Когда мы пытаемся подключиться к устройству через SSH, первое, что оно сделает, это попытается подключить его к терминалу. Но что, если мы хотим подключиться к удаленному устройству без терминала?

Например, мы хотим перенаправить команду стандартного ввода (stpin) на другую команду. Такой сценарий может быть связан с проблемами типа "Псевдотерминал не будет выделен...".

В этой статье мы рассмотрим, почему возникает эта ошибка и как ее исправить.

Причины ошибки

Исходя из нашего опыта, существует несколько возможных причин ошибки "Псевдотерминал не будет выделен, потому что stdin не является терминалом". Здесь мы перечислим некоторые из них.

  • Выполнение интерактивной команды на удаленном устройстве без терминала, например:
$ ssh user@host 'vim file.txt'Copy
  • Запуск команды, требующую привилегий sudo, на удаленном устройстве без терминала, например:
$ ssh user@host 'sudo apt update'Copy
  • Выполнение команды перенаправления stdin из файла или другой команды на удаленной машине:
$ ssh user@host 'cat file.txt' < input.txtCopy
  • Выполнение команды SSH из скрипта.

Решения для устранения ошибки

Несмотря на то что существует множество потенциальных причин возникновения ошибки, есть и несколько способов ее устранения. Мы рассмотрим три: принудительное выделение псевдо-TTY, деактивация выделения псевдо-TTY и спецификация оболочки.

Применение псевдо-TTY для распределения ресурсов

Чтобы устранить ошибку с помощью принудительного выделения псевдо-TTY, нам нужно использовать опцию -t для ssh. Она заставляет ssh выделять pty, даже если stdin не является терминалом.

Этот метод особенно полезен, если вы хотите выполнять команды с привилегиями sudo на удаленной машине. Следующая команда позволяет получить удаленный доступ к серверу и интерактивно отредактировать файл с помощью текстового редактора Vim:

$ ssh -t user@host 'vim file.txt'Copy

Затем вы можете обновить список пакетов (на Ubuntu OS) с помощью команды sudo и привилегий администратора, которые она предоставляет на удаленном сервере:

$ ssh -t user@host 'sudo apt update'Copy

В этих двух примерах опция -t заставляет выделить терминал. Однако опция -t не является универсальным решением; в некоторых случаях мы должны использовать двойную опцию -t, или -tt. Опция -tt упрощает выделение tty без локального tty. Такая команда полезна для выполнения перенаправления stdin на удаленной машине:

$ ssh -tt user@host 'cat file.txt' < input.txtCopy

Опция -t заставляет выделять псевдо-TTY и через нее разрешает ошибку.

Деактивация выделения псевдо-TTY

Мы также можем использовать опцию -T в SSH, чтобы деактивировать выделение псевдо-TTY в целом. Опция -T заставляет ssh не выполнять никакого выделения удаленной машины. Поэтому для команд, которым не нужен терминал, эта опция будет полезна:

$ ssh -T user@host 'ls -l'Copy

Здесь команда Is -I немедленно завершает выделение.

Спецификация оболочки

Чтобы устранить ошибку "Псевдотерминал не будет выделен, потому что stdin не является терминалом", мы также можем указать оболочку на удаленной машине. Настройки SSH по умолчанию включают использование оболочки удаленного пользователя для выполнения команд. Однако некоторые оболочки не совместимы с перенаправлением stdin, что может привести к возникновению ошибок, подобных нашей.

Чтобы избежать этого, мы можем указать оболочку:

$ ssh user@host '/bin/bash -c "cat file.txt < input.txt"'Copy

Эта команда нацеливает оболочку Bash на соединение содержимого файлов file.txt и input.txt.

Подведем итоги

В этом руководстве мы рассмотрели три метода решения ошибки "Псевдотерминал не будет выделен, потому что stdin не является терминалом", такие как выделение псевдо-TTY, отключение выделения псевдо-TTY и спецификация оболочки.

Использование этих методов поможет вам выполнять команды, не сталкиваясь больше с проблемами, связанными с выделением терминала.

# Как сделать Поделиться:
Статьи по Теме