SET 39 Call For Papers

¿Eres un hacker? Si deseas pasar a formar parte de la historia del hacking hispano, colabora con la próxima edición de SET 39 enviándonos un artículo. No esperes más, esta es tu oportunidad de demostrar lo que sabes. Ayúdanos a construir una revista de hackers para hackers. SET Staff

SET 16

109233 visitas

Linux shell: Control total

      5473

Autor: Paseante
-[ 0x05 ]--------------------------------------------------------------------
-[ LINUX SHELL: CONTROL TOTAL ]----------------------------------------------
-[ by Paseante ]------------------------------------------------------SET-16-



Durante estos ultimos meses en nuestro pais se ha producido el "boom" Linux,
que se ha "atrevido" a hacerle sombra al omnipresente Windows.
Se nos ha pedido por parte de muchos lectores que escribiesemos sobre el tema
y aunque existen multitud de sitios en la red con buenisima informacion en
castellano (Slug, Proyecto LuCas..) y revistas que dedican mucha atencion al
tema (PC Actual, Linux Actual..) asi como ezines que lo tratan (Linux Focus,
Byterz...) no vamos a dejar de escuchar la voz de los lectores y aqui teneis
un humilde articulo sobre Linux.

A quien se dirige?

Se dirige a los que creo pedian el articulo, es decir a quienes acaban de 
instalar Linux y todavia no se desenvuelven con confianza en el, pretendemos 
transmitir una idea de la potencia que se esconde tras esa interfaz austera.
No se dirige a quienes todavia estan pensando si instalar Linux o como
hacerlo, ni a aquellos que llevan ya un tiempo con Linux y se manejan en el
sistema.
Ambos grupos pueden buscar informacion adecuada a sus inquietudes en las
fuentes rese¤adas al comienzo.

Cuando uno escribe un articulo introductorio puede optar por dar una vision
general o centrarse en un explicar un tema, yo he optado por la segunda
opcion, no queria explicar que es ls o para que se utiliza man, doy por
descontado que ya lo sabeis y sino hay multitud de articulos de
"Introduccion al Unix" y similares, asi como otros sitios donde aprenderlo.
En su lugar voy a explicar unas cuantas opciones y caracteristicas del shell
que pueden ser desconocidas para aquellos que provienen del DOS, veremos
como aprovecharnos de las capacidades de edicion de linea y de historia del
shell Bash. Comencemos:

M    = Tecla Meta
Esc  = Escape
Ctrl = Control
Bs   = Retroceso
Supr = Suprimir
_    = Posicion del cursor

[mulder@x-files mulder]$ _

Eso de arriba es el indicador de ordenes :-D, solo tenemos que escribir lo
que queramos y el shell tratara de darle un sentido, podemos movernos a
traves de la linea que estemos escribiendo con los cursores, las teclas de
Inicio y Fin, podemos borrar con Bs y Supr.
Hasta aqui parece que todo lo que necesitamos esta listo, sin embargo quien
no se acuerda de la inmensa ayuda que ofrecia doskey en el dos, podiamos
definir macros, tener acceso a la historia de comandos introducidos...
En Linux tambien existe una historia de comandos y quiza incluso podamos
movernos por ella con las flechas de Arriba/Abajo de los cursores como lo
haciamos en el DOS con Doskey. Pero a veces hace falta algo mas y existen
unas cuantas combinaciones de teclas que nos ahorraran tiempo.
Empecemos a practicar, escribiendo esta frase.

[mulder@x-files mulder]$ Ezine SET_

La edicion de linea en Bash usa Readline, que se basa en dos teclas
especiales, la tecla "Meta" y la tecla "Control", si no tienes tecla Meta usa
Esc como sustituto, lo que tienes que saber es que M-t significa por tanto
"Pulsa Escape y t" pero OJO, al contrario de lo que sucede habitualmente y de
lo que haremos con Control esta secuencia es exactamente asi:

M-t: Pulsa Escape, Suelta Escape, Pulsa T, suelta T.
Ctrl-T es el tipico "Pulsa Control y mientras lo pulsas presiona t"

Entendido? 

[mulder@x-files mulder]$ Ezine SET_

Pues pulsa ahora M-t y si no has cambiado las teclas por defecto de Readline
y son iguales a las mias tu indicador mostrara esto:

[mulder@x-files mulder]$ SET Ezine_

En efecto, M-t (Meta-t o Escape-T si no tienes tecla Meta) "transpone" las
palabras de manera que si te has equivocado en el orden no tienes que borrar
nada ni cortar ni pegar, solo pulsar dos teclas. Empieza a gustarte?

[mulder@x-files mulder]$ SET _Ezine

Ahora pulsa M-u y veras algo como

[mulder@x-files mulder]$ SET EZINE_

La combinacion de teclas convierte en mayusculas la palabra que hay tras el
cursor y lo avanza hasta el final de la misma. Y si U es de Upcase que hara
M-l? :-)

 (observa que hemos retrocedido el cursor manualmente, lo haremos en los
  siguiente ejemplos hasta que veamos como usar Readline para hacerlo)

[mulder@x-files mulder]$ SET _EZINE

M-l

[mulder@x-files mulder]$ SET _ezine

Efectivamente, M-l convierte en minusculas la palabra y si a¤adimos que M-c
"capitaliza" la palabra (convierte la primera letra en mayuscula) podemos
hacer M-c a la linea anterior y tenemos

[mulder@x-files mulder]$ SET Ezine

Como veis hemos estado jugando con mayusculas y minusculas, cambiando el
orden de las palabras y todo sin mas que pulsar un par de teclas cada vez
pero aun podemos dar un toque alternativo a nuestro escritos :-> o corregir
errores comunes usando Ctrl-T (aqui si que significa pulsar Control y t a la
vez)

[mulder@x-files mulder]$ Me gusta mucho Saqeuadores

Vaya, parece que hay un peque¤o error, podemos ir atras borrar una letra y
escribir la otra en su lugar o ir atras, situar el cursor sobre la u y
pulsar Ctrl-t


[mulder@x-files mulder]$ Me gusta mucho Saqueadores

Automagicamente los dos caracteres intercambian su posicion y el error queda
resuelto.
Pero hasta ahora seguimos moviendonos por la linea con los cursores que
aunque son comodos no ofrecen toda la potencia deseada sobre todo en lineas
largas.

[mulder@x-files mulder]$ _Me gusta mucho Saqueadores y leo todo lo que
                          que escriben en su ezine.

Si, para ir al final de la linea tenemos la tecla Fin pero Ctrl-e hace lo
mismo y para volver al inicio tenemos Inicio y tambien Control-a, nunca se
sabe.
Pero y si queremos ir la palabra Saqueadores?. Pues o cursor o tres
pulsaciones de M-f que sirve para adelantar (forward) una palabra, mientras
que M-b sirve para llevar el cursor una palabra hacia atras.
Practicad un poco.

Ahora que tendremos la pantalla llena de lineas en las que nos entrenamos con
nuestra recien adquirida habilidad que nos empieza a hacernos sentir como
autenticos "killers" en la linea de comandos (ya sabes que bien quedaras en
las reuniones sociales cuando cambies textos a velocidad de vertigo sin usar
mas de dos teclas? :-D) es hora de borrarla pero claro nosotros como maestros
de Readline no usamos el comando clear sino que tenemos nuestras teclas (como
no!) que son Ctrl-l. Pulsadlo.  



Asesinato y Resurreccion: El Yanki se va a casa.
@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@-@

Como titulo es llamativo pero es que la terminologia americana me ha sugerido
esta "traduccion libre", se trata de eliminar texto de la linea de comandos
que posteriormente podremos insertar de nuevo en la misma u otra linea.
No es lo mismo que history ya que esto afecta a texto que borraremos antes de
pulsar enter.


[mulder@x-files mulder]$ No me gusta nada este articulo, es malisimo_

Si escribimos algo tan tonto :->, podemos deshacer la evidencia con Ctrl-U

[mulder@x-files mulder]$ _

Ctrl-u elimina el texto desde la posicion del cursor hasta el inicio de linea
mientras que Ctrl-k lo hace desde la posicion del cursor hasta el final de
linea.

[mulder@x-files mulder]$ No me gusta nada este _articulo, es malisimo

Ctrl-k mediante

[mulder@x-files mulder]$ No me gusta nada este_

Ctrl-u mediante

[mulder@x-files mulder]$ _

Hubiesemos hecho lo mismo yendo al final o principio de linea (ctrl-e, ctrl-a)
y eligiendo entonces ctrl-u o ctrl-k.
Pero que ha pasado con el texto?. Tranquilos aunque no hayamos pulsado enter
y no haya pasado a la "historia" sigue ahi, en algun lugar de nuestro
potentisimo shell una combinacion de letras se apresta a devolvernos el texto
eliminado. Pulsemos Ctrl-y (yank)

[mulder@x-files mulder]$ No me gusta nada este articulo, es malisimo

Aqui vuelve a estar, tambien podemos probar la combinacion Ctrl-? que va
deshaciendo cambios, pero ahora arreglemos la linea. Con M-d podemos borrar
desde la posicion del cursor hasta el final de la siguiente palabra y con M-Bs
desde la posicion del cursor hasta el inicio de la anterior palabra.
Con alguna combinacion dejamos la linea desde esta posicion.

[mulder@x-files mulder]$ _No me gusta nada este articulo, es malisimo

A esta otra:

[mulder@x-files mulder]$ Me GUSTA este articulo

Como lo hemos hecho?
M-d para eliminar No,
Ctrl-C para Capitalizar Me,
M-u para poner en mayusculas gusta,
M-d para eliminar nada,
M-f un par de veces para avanzar hasta la coma y
Ctrl-u para eliminar desde la posicion del cursor hasta el final.
Suena facil? Ya sabeis, Linux Rules!!.

En serio aunque estoy seguro de que alguno piensa que mas vale teclearlo todo
desde el principio es cuestion de confianza y practica, que creeis que es mas
rapido, un par de M-f o 10 avances de cursor?. A la hora de borrar es mejor
eliminar "gastroenteritis" a base de 15 Supr o Bs o pulsar una vez M-d?
Y si estais pensando que a la hora de avanzar 20 palabras (por ejemplo) M-f
tampoco es muy rapido....os equivocais porque para eso se pueden pasar 
argumentos numericos a las combinaciones, veamos este ejemplo:

[mulder@x-files mulder]$ _Hola, soy Edu, Feliz Navidad, me han echado del  
colegio por pelmazo y ahora tengo el dia libre para salir en TV. Alegraos.

Suponed que esto es una linea en la que nos queremos mover hasta "tengo",
pulsamos M-1 4, M-f y listo.

[mulder@x-files mulder]$ Hola, soy Edu, Feliz Navidad, me han echado del  
colegio por pelmazo y ahora _tengo el dia libre para salir en TV. Alegraos.

La mayor parte de combinaciones admiten estos argumentos, cuando pulsais Meta
seguido de un numero el shell muestra (arg: xx) donde xx es el numero que
tecleais, tras ello seguis con la combinacion a la que se da el argumento,
por ejemplo para borrar las siguientes seis palabras la combinacion directa
es: M-6 M-d  No podreis negar que es "algo" mas rapido que la manera "normal".

Meta - 6 es el valor del argumento que se pasa a la siguiente combinacion
Meta- d elimina desde el cursor hasta el final de la palabra, con el valor 6
eliminara desde el cursor hasta el final de la sexta palabra siguiente.

Cojamos la linea anterior:

[mulder@x-files mulder]$ Hola, soy Edu, Feliz Navidad, me han echado del  
colegio por pelmazo y ahora _tengo el dia libre para salir en TV. Alegraos.

Y tecleemos M-6 M-d

[mulder@x-files mulder]$ Hola, soy Edu, Feliz Navidad, me han echado del  
colegio por pelmazo y ahora _en TV. Alegraos.

Hemos eliminado "tengo el dia libre para salir" con cuatro pulsaciones.
Alguien da mas? :-)

Como antes la mejor manera de avanzar es la practica y el principal
beneficiado sera vuestra productividad en el shell, aparte de que quizas os
ganeis algo de credito cuando vuestros amiguetes os vean "controlar" la linea
de comandos. ;-)

Como vemos Linux, en este caso el shell, nos muestra una vez mas su enorme
potencia y por supuesto si dice Linux dice personalizable asi que si no te
gustan estas combinaciones de teclas no tienes mas que crear en tu directorio
un archivo llamado .inputrc con las secuencias que desees en la forma:

                 Secuencia de teclas: Funcion

Para lo cual puedes consultar las funciones disponibles con "man readline"
tambien puedes directamente usar un teclado que domines, por ejemplo puedes 
hacer "set editing-mode: vi" para usar combinaciones de teclas del vi, pero
no voy a entrar mucho en eso porque ya seria profundizar mucho y este es un
articulo para los que acaban de entrar en este mundillo Linuxero.
De todos modos los que esten familiarizados con Emacs ya se habran dado
cuenta de que teclado se usa. Y para los que no lo esten les habra venido bien
todo esto para entrar con confianza al mundo-Emacs.

Una de las caracteristicas mas agradables de Readline es el
"Command completion" quien no esta harto de querer cambiar de directorio y
teclear rutas larguisimas o ir a editar un archivo con un nombre de 25
caracteres?. La tecla Tab (El tabulador, le¤e) viene en nuestra ayuda.

[mulder@x-files mulder]$ cd /usr/local/mimegadirectoriodelcopon

Pues nada en lugar de eso porque no teclear "cd /usr/local/mi" y pulsar Tab?
Al hacerlo Readline busca todas las posibles coincidencias y las muestra en
pantalla (todos los directorios /usr/local que empiecen por mi) pero si solo
hay una la escribe directamente en la linea de ordenes ahorrandonos el
esfuerzo.Esto es igualmente valido para nombres de archivos, para comandos...

Supongamos que tenemos un archivo con el nombre "Leticia-Sabater-apesta" y
vamos a editarlo con vi, pues nada:

[mulder@x-files mulder]$ vi Let <TAB>
y la linea cambia a:
[mulder@x-files mulder]$ vi Leticia-Sabater-apesta

A menos que haya otro archivo en el directorio que empiece por Let en cuyo
caso nos mostrara las coincidencias.

Ya vemos, igualito que el Dos y Windows. Eh?. Por cierto, alguien se acuerda
del raton?



La Historia al rescate
@-@-@-@-@-@-@-@-@-@-@

Todo lo que hemos visto esta muy bien pero una vez que hayamos introducido
unos cuantos comandos nos agradaria poder recuperarlos, verdad?. Pues para
eso tenemos la historia.

Readline nos ofrece un par de comandos utiles (aparte de Ctrl-n y Ctrl-p que
avanzan y retroceden por la historia como las teclas del cursor) como son:

Ctrl-r: Efectua una busqueda "hacia atras" de la cadena que especifiquemos
        tras pulsar la combinacion.

M-Ctrl-y:  Inserta en la linea actual el primer argumento de la anterior

Ejemplitos:

[mulder@x-files mulder]$ (Pulsamos Ctrl-r)
(reverse-i-search)`': 

El indicador ha cambiado y espera que introduzcamos la cadena de busqueda, es
posible efectuar mas tipos de busqueda en la historia pero os dejo que lo
vayais descubriendo.

[mulder@x-files mulder]$ cp /usr/local/set/actual/set_log.txt ~

Si ahora queremos hacer un chown del fichero anterior (por ejemplo) ni
siquiera necesitamos usar el tabulador, simplemente

[mulder@x-files mulder]$ chown -v falken (Pulsar M-Ctrl-y)

Y se inserta en nuestra linea el argumento que dimos al comando anterior con
lo cual ya podemos transferir la propiedad del archivo a Falken. :-)
Tambien es posible insertar no el primer argumento sino cualquier
palabra de la anterior linea de comandos pero no os tomara mucho esfuerzo
descubrir como hacerlo.

El comando interno del shell "bind" muestra las asignaciones de teclas con
bind -v y la lista de funciones con bind -l
Otro comando que nos sera util ya que no siempre recordaremos las
combinaciones es el que nos permitira preguntar por las teclas que activan
una funcion:

bind -q "funcion". Por ejemplo:

[mulder@x-files mulder]$ bind -q clear-screen

clear-screen can be invoked via "\C-l".

Por lo cual si alguno de los ejemplos que he dado no funcionan podeis usar
este comando para ver que teclas (si hay alguna puesto que no todas las
funciones estan activadas por defecto) debeis usar en vuestro terminal.


Y lo que nos ofrece Bash para aprovecharnos de los comandos introducidos son
cosas que debeis recordar como:

history: Que muestra, numerados, todos los comandos que 'recuerda'.
!n: Donde n es el numero de linea en la que esta el comando
!!: Inserta el ultimo comando
!-n: Se refiere al comando introducido hace n lineas
!cadena: Busca el comando mas reciente que contiene "cadena"
^cadena1^cadena2: Repite el ultimo comando pero sustituyendo "cadena1" por
                  "cadena2"

La variable HISTSIZE controla el numero de comandos a recordar


Si ahora queremos saber a que teclas esta asociada yank ("pegar") podemos
usar las capacidades de historia y teclear algo como:

[mulder@x-files mulder]$ ^clear-screen^yank^

yank can be invoked via "\C-y"

Que hemos hecho?. Pues si os volveis a leer los poquitos comandos de historia
(eso de !, !! y demas) vereis que lo que hemos hecho es dar la orden al shell
de que repita el ultimo comando pero sustituyendo la palabra clear-screen por
la palabra yank, con lo cual el shell ha ejecutado esto:

[mulder@x-files mulder]$ bind -q yank

En este caso casi hemos tardado mas haciendolo :-) pero en ocasiones sera mas
que util esta capacidad del shell de intercambiar al vuelo los argumentos de
comandos ya introducidos.
Al igual que en Readline hay muchas mas cosas acerca de la Historia de las que
es conveniente no hablar en un articulo de introduccion pero que vosotros 
podeis ir investigando por vuestra cuenta. Un poco de practica

[mulder@x-files mulder]$ history
   ......................
   16  dir
   17  cd ..
   18  dir
   19  ls news
   20  vi xdm-error.log 
   21  dir
   22  vi xferlog 
   23  dir
   24  vi secure 
   25  vi secure 
   26  dir
   27  vi sendmail.st 
   28  netstat -an
   29  vi /etc/inetd.conf

Aqui unos cuantos comandos de la historia, aqui unos amigos. Y ahora que ya
os conoceis, veamos que se puede hacer:

[mulder@x-files mulder]$ (Ctrl-r)
(reverse-i-search)`st':
[mulder@x-files mulder]$ netstat -an

Con la busqueda en la historia hemos ido directamente al ultimo comando
introducido que contiene la cadena "st". El mismo efecto tendrian:

[Notarse que una busqueda de 'ne' hubiese traido vi/etc/i_ne_td.conf :-) ]

[mulder@x-files mulder]$ !28

Recupera la linea n§ 28 de la historia

[mulder@x-files mulder]$ !-3

Recupera el comando introducido 3 lineas atras.

[mulder@x-files mulder]$ ^inetd^httpd^

Edita el archivo httpd.conf, al usar la sustitucion de cadenas en el ultimo
comando lo que estamos pasando al shell en realidad es:

[mulder@x-files mulder]$ vi /etc/httpd.conf

[El ultimo comando era vi /etc/inetd.conf]

Las capacidades de busqueda seran utiles cuando haga bastante tiempo que
hayais introducido el comando (de manera que moverse con los cursores sea
muy pesado) o si quereis comprobar si habeis ejecutado un comando concreto.

Por ultimo una caracteristica curiosa del shell y que sera tambien util es
la "expansion de llaves", supongamos que tenemos que crear varios
subdirectorios tipo SET12, SET13, SET14, SET15, SET16 dentro de
/usr/local/set/ezines/

[mulder@x-files mulder]$ mkdir /usr/local/set/ezines/set1{2,3,4,5,6}

Ya tenemos nuestros directorios creados, los valores entre llaves se
"expanden" y nuestros directorios estan ya en su lugar con un solo comando.

Como aprendereis es factible redefinir y crear macros, puede parecer perfecto
pero prevengo, porque podria pasar por persistis en personalizar, pues
posiblemente perdereis productividad pasando a otro puesto.
(se me han acabado las P's!!)
En otro ordenador estareis mas tiempo intentando recordar como se hacia algo
que haciendolo (es muy incomodo acostumbrarse a teclear una secuencia y
encontrarse que solo funciona en tu casa y claro no te vas a llevar un
diskette con el archivo a todas partes)
Si trabajais en muchos ordenadores diferentes es mejor utilizar el estandar
y no complicarse la vida recordando donde y cuando funcionan "vuestras"
teclas.


Otras combinaciones de teclas que ya conocereis tambien hacen cosas, como:

Ctrl-z  = Suspende una tarea
Ctrl-c  = Interrumpe la tarea
Ctrl-d  = No me acuerdo ahora mismo, luego lo pruebas }:->
Ctrl-x-v = Lo mismo que bash -version (Pulsadas en secuencia!)
Ctrl-l  = Como vimos "limpiaba" la pantalla
Ctrl-s  = Bloquea el desplazamiento de la pantalla
Ctrl-q  = Reanuda el desplazamiento de la pantalla
Alt+dcha / Alt+izqda = Desplazamiento por las terminales virtuales
Ctrl-Alt-Fn = Cambio a otra terminal desde la terminal grafica
Alt-F7  = Cambio a la terminal grafica (si hay algun servidor en ejecucion).
M-Ctrl-e = Expansion visual de los alias en la linea de ordenes.

Aqui lo dejamos, tras este "prime for beginners" espero que os haya picado
la curiosidad, si usais Linux para "bucear" algo mas en sus secretos y si
no lo usais para que os planteeis seriamente el hacerlo. Lo peor que os 
puede pasar es que aprendais algo.

No espereis que ahora intente convenceros de lo malo que es Windows y lo
malvada que es Microsoft frente a las bondades Linux, vosotros mismos lo
decidireis pero para decidir hay que conocer.
Usad Windows. Usad Linux. Comparad. Escoged el que querais o quedaros con
ambos. No hagais caso a 'gurus', 'iluminados' y demas gente que intentara
convenceros de que sois tontos si no usais X (sea BeOS, OpenDos, NetBSD,
Windows NT, MacOs...).
Tampoco hagais caso a la propaganda de hasta donde quereis llegar hoy?,
nosotros no "llegamos", nosotros siempre estamos en camino. Por encima de
todo:

Tomad vuestras decisiones, es vuestra vida.
Disfrutad.


Eso es todo amigos.

Paseante.