Wednesday, May 19, 2010

Bash en la vida cotidiana.

Para los que todos los dias tenemos que trabajar con bash en nuestros sistemas, ya sea como administradores de sistemas, desarrolladores, etc. sabemos lo importante que es para nosotros la linea de comandos, y que mejor si podemos aprender algunos trucos para agilizar ese trabajo, asi aqui les presento un par de ellos:

ctrl+r:
Bash registra cada uno de los comandos que ejecutamos en una bitacora, y esta nos permite regresar a ellos cuando los necesitamos u olvidamos los parametros de un determinado comando que tanto trabajo nos costo construir; una de las formas de hacer esto es mediante las teclas de flecha hacia arriba y abajo, lo cual nos lleva a los comandos ingresados con anterioridad y navegar a travez de ellos. Pero si necesitamos encontrar el comando con mayor rapidez, podemos hacer uso de la busqueda rapida, esta busca entre los comandos ingresados aquellos que inician con las letras que ingresamos luego de la combinacion de teclas ctrl+r, Bash comenzara una busqueda y nos mostrara aquellos comandos que coinciden con las letras que estamos ingresando; si el comando mostrado no es el que estamos buscado, podemos seguir presionando ctrl+r para ir al siguiente resultado de la busqueda y asi sucesivamente; una vez encontrado el comando deseado, damos enter para ejecutarlo inmediatamente o las teclas de flechas izquierda o derecha para editarlo, en caso que deseamos editar la linea antes de ejecutarla.

!! y !#
Este es otro par de combinacion de simbolos que permiten agilizar nuestras actividades en Bash, el primero !! nos permite ejecutar exactamente el comando ingresado anteriormente. En cuanto al segundo, este nos permite ejecutar el comando #, donde el numero especificado es el numero asignado por la secuencia del comando history.

Por ejemplo, si al ejecutar el comando history, vemos el siguiente resultado: (salida ha sido truncada)
44 history
45 cd Backup/
46 history
47 yum
48 #?

Al ejecutar !45 equivale a ejecutar nuevamente el comando: cd Backup/

Pregunta: que almacena Bash en la variable denominada $?

Si conoces otros trucos de la linea de comandos, compartelos.

Wednesday, May 12, 2010

Ayer Pascal, C, Python, ahora Ruby, manana Go?

Lejos ha quedado la epoca en que daba clases de Teoria de Lenguajes de Programacion alla por el 96-99 para la carrera de computacion en la UCA, donde hablabamos de los automatas finitos, analizadores lexicos/sintacticos, expresiones regulares, etc, atras ha quedado la epoca en que usabamos el compilador Turbo C/Pascal de Borland, o Modula-2 para quienes programaron en ese lenguaje, ahora los lenguajes son orientados a objetos, paradigma que comenzaba a despegar por aquellos anios en El Salvador, pocos eran los que intentaban descifrar de que se trataba, pero que ahora es un elemento indispensable en los nuevos y modernos lenguajes de programacion, asi como una herramienta indispensable para los programadores actualmente. Lisp se podria decir que era de los lenguajes mas avanzados a su epoca, utilizado primordialmente en sistemas de Inteligencia Artificial (al igual que Prolog), tenia problemas de eficiencia (no se si culpar a la recursividad por tal razon) asi como no era facil tratar de resolver cualquier problema de la vida real mediante formulas matematicas y recursividad; Pascal y Basic digamos que eran los lenguajes que nos motivaron a estudiar computacion, ensamblador fue el que nos hizo lograr entender como los circuitos digitales dentro de la computadora colaboran entre ellos en una sincronia de reloj, para calcular la serie de Fibonacci, buscar numeros primos o simplemente resolver una ecuacion de segundo grado. Finalmente C, era como la llave a todas nuestras respuestas, el problema era como usar la llave, siendo un lenguaje de alto-medio nivel, dispone de gran habilidad para desarrollar programas en casi cualquier rama, por eso se le denomina lenguaje de proposito general, como tambien estar lo suficientemente cerca del hardware para ser eficiente y descubrir los secretos del BIOS y cambiar el vector de interrupciones de la computadora (para los que haciamos programas residentes en memoria o TSR(Terminate and Stay Resident ).

Se acuerdan de los lenguajes de cuarta generacion, pues si no se acuerdan de ellos es por que nunca los conocieron o trabajaron en ellos, originalmente desarrollados con el fin de resolver un grupo en particular de problemas, (principalmente en el ambito de los negocios y reemplazar al omnipresente COBOL), tenemos a PowerBuilder, Natural, entre otros, que durante algun tiempo se creia eran la respuesta a los sistemas empresariales, cuando aparecio el Internet; HTML (aun que no un lenguaje de programacion), pero que gano popularidad con el advenimiento del Internet y las paginas web y el Dot Com; Java, JavaScript, PHP, Perl son otros de los grandes protagonistas de las nuevas generaciones de aplicaciones que poblarian la red en los anios venideros uniendo fuerzas con bases de datos como MySQL/PostgreSQL.

Actualmente, la lista de lenguajes de programacion es enorme y llena de todo tipo de lenguajes destinados a una gran gama de posibles probemas de la vida cotidiana o no tan cotidiana, en los ultimos 3 anios Python se ha ajustado muy bien en cubrir las necesidades que require mi trabajo de control de calidad de software, automatizando pruebas de software, pero actualmente la empresa donde trabajo, el lenguaje que mas utilizan es Ruby, de hecho una de las librerias que utlizamos para hacer pruebas esta en ese lenguaje, asi que aqui me tienen leyendo/aprendiendo un poco de Ruby en un rato que tengo libre en el trabajo, eso significa otro lenguaje a la bolsa, no esta nada mal, pero luego de Ruby que? Erlang? Go? Nimrod? Ioke?

Y ustedes en que lenguaje programan/crean scripts?

Saludos.

El archivo /etc/passwd

Los que trabajamos en sistemas Unix/Linux sabemos (espero) que este archivo contiene informacion sobre cada usuario que puede ingresar al sistema, el archivo tambien contiene, entre otros datos, la informacion necesaria para verificar la autenticidad del usuario, mediante la contrasenia, pero en algunos otros sistemas, esta informacion es transferida hacia otro archivo llamado /etc/shadow.

Este archivo puede ser leido por todos los usuarios, pero solamente el administrador o aquellos usuarios con permiso pueden editarlo.

El otro dia un amigo en el canal #linux.org.sv en IRC, preguntaba como podia hacer que un usuario al ingresar al sistema mediante ssh, solo pudiese tener acceso a una aplicacion en particular y si deseaba salirse de ella, al hacerlo, el sistema lo desconectaria inmediatamente; bueno la solucion estaba en el archivo /etc/passwd, si observamos bien en el archivo, el ultimo campo de cada linea corresponde al shell que atiende al usuario una vez este ingresa al sistema, pero que tal si en lugar de colocar el shell que atendera al usuario, colocamos el nombre y ubicacion de otro programa?, bueno este atendera al usuario mientras utilize el programa, pero una vez este termine de usarlo, el sistema lo desconecta automaticamente.

Veamos un ejemplo: Ojo, no intenten esto con su usuario, mi recomendacion es que creen un usuario de pruebas para hacerlo, pueden usar el siguiente comando en Linux, en el siguiente ejemplo usaremos el programa top, asi este usuario solo podra ver el resultado del comando top una vez ingrese al sistema:

$ sudo adduser -s /usr/bin/top testuser

Ahora asignemosle un password al usuario mediante:

$ sudo passwd testuser

Una vez el password ha sido asignado, observen la nueva linea en el archivo /etc/passwd y observen como la ultima columna en lugar de apuntar a un shell, apunta a /usr/bin/top; intentemos ingresar al sistema mediante este usuario, podemos usar el comando su:

$ su testuser

Una vez damos la contrasenia, en lugar de recibir un prompt ($) de un nuevo shell, vemos como el programa top inicia automaticamente, y cuando lo cancelamos mediante
la tecla "q", el usuario es automaticamente desconectado; para confirmarlo usamos el comando "whoami", debemos estar de regreso en nuestro usuario original y no el usuario de pruebas. Pueden confirmar esto tambien haciendo un 'tail -f' sobre el archivo /var/log/auth.log donde veran que el usuario sale al instante de cerrar top.

Que pasa si en lugar de /usr/bin/top cambian por /sbin/nologin?

Saludos.