Як усунути помилку "Псевдо-термінал не буде виділено"
20:11, 30.05.2024
Під час використання протоколу 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) за допомогою команди 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
Ми також можемо скористатися опцією SSH -T, щоб вимкнути розподіл псевдо-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 та специфікація оболонки.
Використання цих методів допоможе вам виконувати команди, не стикаючись з проблемами, пов'язаними з виділенням терміналу.