Ir ao contido

Restauración e Estabilización de TTYs Non Interactivas en GNU/Linux

Exemplo

script /dev/null -c bash
^Z
stty -a | grep columns #Saída exemplo: speed 38400 baud; rows 47; columns 103; line = 0; 
stty raw echo;fg
reset
xterm
export TERM=xterm
export SHELL=bash
stty rows NUMBER1 columns NUMBER2 #Execución exemplo: stty rows 47 columns 103
exit
reset

Introdución

En moitas situacións de administración de sistemas, auditoría de seguridade ou execución de comandos en contornas limitadas (como shells inxectadas ou remotas), o usuario atópase cunha shell non interactiva (TTY). Estes shells son básicos, carecendo de funcionalidades esenciais como:

  • Historial de comandos.
  • Edición de liña (movemento do cursor, borrado).
  • Autocompletado coa tecla Tab.
  • Funcionamento correcto de combinacións de teclas (Ctrl+C, Ctrl+Z).
  • Compatibilidade con programas baseados en ncurses (vi, nano, less).

Esta documentación técnica describe os métodos máis comúns para elevar un shell non interactivo a unha TTY completamente funcional.

Método I: Enxeñería de TTY mediante script e Control de Traballos

Esta técnica é independente de linguaxes de scripting e utiliza comandos nativos de GNU/Linux para forzar a creación e a reconfiguración dun pseudo-terminal (PTY).

1. Creación do Pseudo-Terminal

O comando script executa un shell (aquí bash) e rexistra a sesión, o que obriga ao sistema a asignar un novo PTY ao proceso.

script /dev/null -c bash
Elemento Función
script Executa o shell especificado forzando a asignación dun PTY.
/dev/null Desbota o ficheiro de rexistro (transcrición).
-c bash Executa o comando bash dentro do contexto de script.

2. Control de Traballos e Reconfiguración

O novo shell debe ser suspendido e reconfigurado para herdar as propiedades de entrada/saída correctas.

Comando Función
^Z (Ctrl+Z) Suspende o proceso script (e a súa shell interna), enviándoo a segundo plano (SIGTSTP).
stty raw -echo Axusta a TTY orixinal: raw (entrada de caracteres brutos) e -echo (desactiva a duplicación de caracteres).
fg Trae o traballo suspendido de volta á fronte, aplicando as novas configuracións de TTY.
reset Restaura o estado da TTY. Limpa calquera configuración estraña e establece as capacidades do terminal.

Método II: Uso da Libraría pty de Python (Recomendado)

Se Python está dispoñible, este é o método máis popular e fiable para forzar un PTY, xa que a librería pty está deseñada especificamente para a interacción de terminais.

1. Invocación do Pseudo-Terminal

python -c 'import pty; pty.spawn("/bin/bash")'

O comando utiliza pty.spawn() para substituír o proceso actual por un shell /bin/bash nun novo pseudo-terminal.

Método III: Uso de Perl

Perl é outra linguaxe de scripting a miúdo instalada por defecto nos sistemas Unix/Linux. Pódese usar de forma sinxela para executar un novo shell.

1. Invocación do Shell

O uso máis sinxelo de Perl para iniciar un novo shell é:

perl -e 'exec "/bin/bash";'

Este comando inicia un novo proceso de bash, pero require a estabilización posterior para obter a funcionalidade completa de TTY.

Método IV: Outras Ferramentas Avanzadas

Ferramenta Comando Vantaxes
socat socat file:\tty`,raw,echo=0 exec:"bash -i"| Proporciona unha TTY funcional e estable, a miúdo nun só paso, aínda quesocatnon sempre está instalado. | | **rlwrap** |rlwrap bash| Require a instalación derlwrap`. Mellora a edición de liñas e o historial de comandos (función Readline), mesmo cando o terminal subxacente é deficiente.

Pasos Comúns para a Estabilización Final

Independentemente do método elixido (script, Python, Perl, etc.), o proceso final de estabilización sempre é necesario para obter o 100% da funcionalidade (como a tecla Tab e o control de frechas).

Estes pasos deben realizarse despois de executar o comando de invocación (script, Python ou Perl, etc) e requiren a secuencia de control de traballos:

1. Control de Traballos (^Z e fg)

  1. Suspender a Shell (na nova shell): Premer ^Z (Ctrl+Z).

  2. Axustar e Recuperar (na shell orixinal):

    stty raw -echo; fg
    

2. Configurar o Tipo de Terminal

Dentro do shell agora funcional (despois do fg), establécese a variable de ambiente TERM para garantir a compatibilidade coas aplicacións de pantalla completa.

export TERM=xterm

3. Axustar Dimensións da TTY (Opcional, pero recomendado)

Para evitar problemas de formato con vi, nano ou cando se usa Tab, é recomendable establecer as dimensións correctas.

  1. Obter as dimensións do terminal local (o terminal dende onde se conecta, p. ex., a través de SSH).

    stty -a | grep columns #Saída exemplo: speed 38400 baud; rows 47; columns 103; line = 0; 
    
  2. Aplicar as dimensións no shell remoto:

    stty rows <FILAS> columns <COLUMNAS> #Execución exemplo: stty rows 47 columns 103
    

Estes métodos, combinados coa estabilización final, garanten unha experiencia de shell totalmente interactiva.

Apéndice: Restauración da TTY Local (Post-Sesión)

Despois de usar a secuencia stty raw -echo; fg e pechar a shell remota (p. ex., mediante exit), a TTY local dende a que se iniciou a conexión pode quedar coas súas configuracións de terminal mesturadas.

Isto maniféstase como:

  • Ausencia de eco (non se ve o que se escribe).
  • Comportamento errático das teclas de control.

O problema é que os axustes raw -echo foron aplicados á consola de control, non só á remota.

Solucións para Restaurar a Consola Local

A solución máis eficaz é resetear a configuración do terminal local aos seus valores predefinidos.

Comando Función Instrución de uso
reset Restaura o estado da TTY completamente, limpando e reinicializando a configuración. Escribir reset (aínda que non se vexa) e premer Intro.
stty sane Restaura a TTY a un estado "sensato" ou utilizable, corrixindo o eco e o control de liña. Escribir stty sane (aínda que non se vexa) e premer Intro.
stty echo Soluciona especificamente o problema de eco (non se mostra o texto). Escribir stty echo e premer Intro.

Recomendación

O comando reset é o método máis seguro e rápido para solucionar case todos os problemas de visualización e funcionalidade da TTY local.