Restauración e Estabilización de TTYs Non Interactivas en GNU/Linux
Exemplo
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.
| 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
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 é:
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)
-
Suspender a Shell (na nova shell): Premer
^Z(Ctrl+Z). -
Axustar e Recuperar (na shell orixinal):
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.
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.
-
Obter as dimensións do terminal local (o terminal dende onde se conecta, p. ex., a través de SSH).
-
Aplicar as dimensións no shell remoto:
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.