Cómo solucionar el error "No se asignará el pseudoterminal"
20:51, 30.05.2024
Mientras se utiliza el protocolo Secure Shell (SSH) para acceder a un ordenador remoto, puede aparecer un error descrito como "No se asignará la pseudo-terminal porque stdin no es una terminal".
El pseudo-terminal es un sustituto de un terminal físico que mantiene toda la funcionalidad de este último. Cuando intentamos conectarnos al dispositivo a través de SSH, lo primero que va a hacer es intentar conectarlo a una terminal. Pero, ¿qué pasa si queremos conectarnos a un dispositivo remoto sin un terminal?
Por ejemplo, queremos redirigir el comando de la entrada estándar (stpin) a otro comando. Tal escenario puede estar asociado con problemas como "Pseudo-terminal no será asignada...".
En este artículo, veremos por qué se produce el error y cómo solucionarlo.
Causas del error
Basándonos en nuestra experiencia, hay algunas causas posibles para el error "Pseudo-terminal will not be allocated because stdin is not a terminal". A continuación, vamos a enumerar algunas de ellas.
- Ejecutar un comando interactivo en un dispositivo remoto sin terminal, por ejemplo:
$ ssh usuario@host 'vim archivo.txt'Copy
- Intentar ejecutar un comando que requiere privilegios sudo sin un terminal en un dispositivo remoto, por ejemplo
$ ssh usuario@host 'sudo apt update'Copiar
- Intentar ejecutar un comando de redirección stdin desde un archivo u otro comando en el equipo remoto:
$ ssh usuario@host 'cat archivo.txt' < entrada.txtCopiar
- Ejecutando un comando SSH desde un script.
Soluciones para el error
Aunque hay muchas causas potenciales del error, también hay varias formas de solucionarlo. Vamos a revisar tres: aplicación de la asignación pseudo-TTY, desactivación de la asignación pseudo-TTY y especificación del shell.
Aplicación de la asignación Pseudo-TTY
Para eliminar el error mediante la aplicación de la asignación pseudo-TTY necesitamos utilizar la opción -t para ssh. Obliga a ssh a asignar una pty incluso si stdin no es un terminal.
Este método es especialmente útil si desea ejecutar comandos con privilegios sudo en la máquina remota. El siguiente comando le permite acceder remotamente a un servidor y editar interactivamente un archivo a través del editor de texto Vim:
$ ssh -t user@host 'vim file.txt'Copy
A continuación, puede actualizar la lista de paquetes (en el sistema operativo Ubuntu) a través del comando sudo y los privilegios de administrador que proporciona en el servidor remoto:
$ ssh -t usuario@host 'sudo apt update'Copy
En estos dos ejemplos, lo que hace la opción -t es forzar la asignación de un terminal. Sin embargo, la opción -t no es una solución única; en algunos casos, tenemos que utilizar doble -t, o -tt. La opción -tt agiliza la asignación de tty sin una tty local. Este comando es útil para ejecutar la redirección stdin en la máquina remota:
$ ssh -tt usuario@host 'cat fichero.txt' < entrada.txtCopia
La opción -t fuerza la asignación pseudo-TTY y a través de ella se resuelve un error.
Desactivación de la asignación Pseudo-TTY
También podemos utilizar la opción -T de SSH para desactivar la asignación pseudo-TTY en general. La opción -T fuerza a ssh a no realizar ninguna asignación de la máquina remota. Por lo tanto, para comandos que no necesitan un terminal, esta opción será útil:
$ ssh -T usuario@host 'ls -l'Copy
Aquí, el comando Is -I termina la asignación inmediatamente.
Especificación de la carcasa
Para eliminar el error "Pseudo-terminal will not be allocated because stdin is not a terminal" también podemos hacer una especificación del shell en la máquina remota. La configuración SSH por defecto incluye el uso del shell de inicio de sesión del usuario remoto para ejecutar comandos. Sin embargo, algunos shells no son compatibles con la redirección stdin, lo que puede provocar errores como el nuestro.
Para evitarlo, podemos especificar el shell:
$ ssh usuario@host '/bin/bash -c "cat archivo.txt < entrada.txt"'Copy
Este comando se dirige al shell Bash para enlazar los contenidos de archivo.txt y entrada.txt.
Resumen
En esta guía, nos hemos centrado en los tres métodos para resolver el error "No se asignará la pseudo-terminal porque stdin no es una terminal", como la asignación de pseudo-TTY, la desactivación de la asignación de pseudo-TTY y la especificación del shell.
El uso de estos métodos le ayudará a ejecutar comandos sin enfrentarse a más problemas relacionados con la asignación de terminales.