Header image alt text

Carlos Zayas Guggiari

Analista de sistemas, docente y entusiasta de las tecnologías de la información

Mi propio buscador de archivos

Posted by carlos on 23/02/2012
Posted in Programacion  | Tagged With: , , , | No Comments yet, please leave one

Cansado de lidiar con las complejidades y deficiencias de otros programas de la misma categoría, me propuse escribir mi propio programa buscador de archivos, armado de Python y Gedit, mi lenguaje de programación y editor de texto favoritos, respectivamente.

Mi propósito era simple: contar con una utilidad de línea de comando que genere una lista de los archivos que contengan en su nombre o trayectoria una secuencia de caracteres suministrada como parámetro.

El resultado se llama hay, y se puede descargar haciendo click al mismo nombre, o mejor aún, instalarlo directamente desde la línea de comando siguiendo las instrucciones detalladas a continuación:

mkdir hay
cd hay
wget http://www.zayas.org/carlos/wp-content/uploads/2012/02/hay.zip
unzip hay.zip
sudo cp hay.py /usr/bin/hay
sudo chmod +x /usr/bin/hay

Cabe aclarar que el programa hay requiere de un sistema operativo tipo UNIX con Python instalado, como por ejemplo cualquier distro moderna de GNU/Linux, entre ellas Fedora o Ubuntu.

Una vez realizada la instalación, el uso de hay es trivial:

Ejemplo de uso de 'hay'

De manera predeterminada, la búsqueda se realiza dentro de la carpeta personal del usuario que ejecuta el programa. Si se desea apuntar a otra dirección, basta con indicarlo en un segundo parámetro.

Listado completo del programa:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# Hay - Version 0.1 - 23/02/2012
# Carlos Zayas Guggiari (carlos@carloszayas.com)
# python --version : Python 2.7.2+
# -----------------------------------------------------------------------------
import os, sys, string, fnmatch
# -----------------------------------------------------------------------------
def hay(patron, raiz=os.curdir):
    'Devuelve todos los archivos que coinciden con el patron suministrado.'
    #--------------------------------------------------------------------------
    # Se inserta una expresion regular en el patron para tratar las letras
    #--------------------------------------------------------------------------
    cadena = ''
    for caracter in patron:
        if caracter in string.letters:
            cadena += '['+caracter.upper()+caracter.lower()+']'
        else:
            cadena += caracter
    patron = '*'+cadena+'*'
    #--------------------------------------------------------------------------
    # Se "cede" (yield) cada archivo que cumple con el patron
    #--------------------------------------------------------------------------
    for camino, carpetas, archivos in os.walk(os.path.abspath(raiz)):
        for archivo in fnmatch.filter(archivos, patron):
            yield os.path.join(camino, archivo)
# -----------------------------------------------------------------------------
def main():
    'Funcion principal.'
    args = sys.argv
    prog = args.pop(0).split('/')[-1]
    raiz = os.path.expanduser('~')
    if args:
        patron = args.pop(0)
        if args: raiz = args.pop(0)
        lista = hay(patron,raiz)
        for item in lista: print item
    else:
        print 'Sintaxis:',prog,'patron de busqueda [ubicacion inicial]'
# -----------------------------------------------------------------------------
# Si no se importa como modulo, se ejecuta la funcion principal
# -----------------------------------------------------------------------------
if __name__ == '__main__': main()

Cambio rápido de directorio

Posted by carlos on 23/11/2011
Posted in Programacion  | Tagged With: , , | No Comments yet, please leave one

Los intérpretes modernos de línea de comando ofrecen diversas características que facilitan la vida del usuario, como por ejemplo el autocompletado y el historial de comandos, pero navegar por el sistema de archivos sigue siendo una tarea un poco tediosa.

La siguiente función para Bash permite cambiar el directorio actual indicando sólo una parte de la trayectoria completa. Por ejemplo, si ejecutamos:

La función toma en cuenta únicamente a las carpetas ubicadas dentro de nuestra carpeta personal, y tiene más utilidad si elegimos como parámetro una parte de la trayectoria que no se repita en otro lugar de ese sector del sistema de archivos.

Para probar la función, basta con hacer triple clic sobre la línea de abajo, copiar el texto así seleccionado y pegarlo en una ventana de nuestro intérprete de línea de comando. Para adoptarla permanentemente, basta con guardarla al final del archivo ~/.bashrc

function a() { if [ "$1" != "" ]; then for i in $(locate -i $1 | grep $HOME); do if [ -d "$i" ]; then cd $i; break; fi; done; fi } # fast cd

A continuación se presenta el listado de la misma función, pero indentada convenientemente para una mejor comprensión de su funcionamiento:

function a()
    {
    if [ "$1" != "" ]; then
        for i in $(locate -i $1 | grep $HOME); do
            if [ -d "$i" ]; then
                cd $i
                break
            fi
        done
    fi
    }

Si preferimos que la función ignore las carpetas ocultas, basta con modificar la cuarta línea:

        for i in $(locate -i $1 | grep $HOME | grep -v /[.]); do

Esta función hace uso del comando locate, componente del paquete GNU findutils, junto con dos grep consecutivos que filtran el resultado de la búsqueda.

Cómo definir alias en bash

Posted by carlos on 17/11/2011
Posted in Programacion  | Tagged With: , , | No Comments yet, please leave one

En informática, un alias es simplemente una cadena de caracteres que representa a otra. Un alias permite ahorrar tiempo al teclear una línea de comando que usamos frecuentemente, y suele ser una alternativa más práctica que definir una función o escribir un script.

Los intérpretes de líneas de comando, por lo general, suelen ofrecer al usuario una manera de definir un conjunto de alias. En bash, esa manera es el comando alias:

alias install='sudo apt-get -y install'

Para obtener una lista de los alias definidos, ejecutamos el mismo comando sin parámetros:

alias

Para hacer que la definición de un alias sea permanente, es necesario incluirla en uno de los archivos de configuración que se encuentran en nuestra carpeta personal, por ejemplo el .bash_profile (que se ejecuta al iniciar sesión) o el .bashrc (que se ejecuta cada vez que abrimos una nueva consola bash). Pero es probable que nuestra distribución GNU/Linux ya venga con un conjunto predefinido de alias en el archivo .bash_aliases (que suele ser ejecutado desde .bashrc).

Sea cual fuere el caso, si modificamos uno de los archivos mencionados y queremos que los cambios se apliquen en la sesión actual, debemos usar el comando source. Por ejemplo, si elegimos el archivo .bashrc:

source ~/.bashrc

Mi archivo .bash_aliases tiene el siguiente contenido:

alias install='sudo apt-get -y install'
alias search='apt-cache search'
alias show='apt-cache show'
alias purge='sudo apt-get purge'
alias update='sudo apt-get update'
alias upgrade='sudo apt-get upgrade'
alias uu='update && upgrade'
alias edit='mcedit -S darkfar'
alias py='bpython'
alias mc='mc -S darkfar'

Si uno de nuestros alias tiene el mismo nombre que un comando, puede ocurrir que ocasionalmente queramos ignorar el alias y usar el comando original. Para ello, simplemente anteponemos la barra invertida (\) al nombre del alias, como ilustra el ejemplo:

\mc

Si queremos eliminar un alias, podemos usar el comando unalias:

unalias mc

Y si queremos eliminar todos los alias, le agregamos el parámetro -a:

unalias -a

Estas eliminaciones sólo se aplican en la sesión actual de bash. En las sesiones posteriores, se volverán a cargar los alias definidos en los archivos de configuración.

Dicen que la realidad supera a la ficción, pero si esa ficción la escribe William Shakespeare, es difícil superarla.

Cuando los europeos identificaban los días por la fiesta del santo, el 25 de octubre se conocía como el día de San Crispín y San Crispiniano, hermanos mártires cristianos, patronos de los zapateros.

En el día de San Crispín del año del Señor de 1415 los Reyes de Inglaterra y Francia y sus ejércitos libraron una batalla en terreno francés cerca del castillo de Azincourt. Shakespeare la recreó en su obra “Enrique V”.

En la víspera de la batalla de Azincourt, el Rey Enrique V de Inglaterra dirigió a sus menguadas y agotadas tropas (cinco mil arqueros y otros tantos peones) una arenga que el genio de Shakespeare ha hecho célebre.

Kenneth Branagh como Enrique V

El famoso actor de origen irlandés Kenneth Branagh personificando a Enrique V en la película del mismo nombre, basada en la obra de Shakespeare.

Los ingleses se ven perdidos ante los franceses, y su Rey intenta animarles con unas palabras maravillosas, apelando a la camaradería y a la pervivencia de su valor.

GLOUCESTER: ¿Dónde está el Rey?

BEDFORD: El propio Rey ha cabalgado para ver su batalla.

WESTMORELAND: De soldados, ellos tienen por lo menos sesenta mil.

EXETER: Eso es cinco a uno. Además, están todos frescos.

SALISBURY: Es una proporción terrible.

WESTMORELAND: ¡Ojalá tuviéramos aquí ahora aunque fuera diez mil de aquellos hombres que en Inglaterra están hoy ociosos!

REY ENRIQUE V: ¿Quién pide eso? ¿Mi primo Westmoreland? No, mi buen primo. Si hemos de morir, ya somos bastantes para causar una pérdida a nuestro país; y si hemos de vivir, cuantos menos hombres seamos, ¡mayor será nuestra porción de honor!

¡Dios lo quiera! Te lo ruego, no desees un solo hombre más. Por Júpiter, no codicio el oro, ni me importa quién se alimente a mi costa; no me angustia si los hombres visten mis ropas; esos asuntos externos no ocupan mis deseos.

Pero si es pecado codiciar el honor, soy la más pecadora de las almas vivientes. No, créeme, primo, no desees un solo hombre de Inglaterra. ¡Paz de Dios! no perdería un honor tan grande como el que un solo hombre creo que me arrebataría por lo que más deseo.

¡Oh, no pidas uno solo más! Proclama, en cambio, Westmoreland, por mi ejército, que el que no tenga estómago para esta pelea, que parta; se redactará su pasaporte y se pondrán coronas para el viático en su bolsa. No quisiéramos morir en compañía de un hombre que teme morir en nuestra compañía.

Este día es la fiesta de Crispiniano. El que sobreviva a este día y vuelva sano a casa, se pondrá de puntillas cuando se nombre este día, y se enorgullecerá ante el nombre de Crispiniano.

El que sobreviva a este día, y llegue a una edad avanzada, agasajará a sus vecinos en la víspera de la fiesta, y dirá: “Mañana es San Crispiniano”. Entonces se alzará la manga y mostrará sus cicatrices y dirá, “Esta heridas las recibí el día de Crispín”.

Los viejos olvidan. Y todo se olvidará, ¡pero él recordará con ventaja qué hazañas realizó en ese día! Entonces recordará nuestros nombres, familares en sus labios como palabras cotidianas: Harry el Rey, Bedford y Exeter, Warwick y Talbot, Salisbury y Gloucester, se recordarán como si fuera ayer entre sus jarras rebosantes.

El buen hombre contará esta historia a su hijo, y nunca pasará Crispín Crispiniano, desde este día hasta el fin del mundo, sin que nosotros seamos recordados con él. Nosotros pocos, nosotros felizmente pocos. Nosotros, una banda de hermanos, porque el que hoy derrame su sangre conmigo será mi hermano. Por vil que sea, este día ennoblecerá su condición.

Y los caballeros que están ahora en la cama en Inglaterra se considerarán malditos por no haber estado aquí. ¡Y sentirán su virilidad disminuída cuando hable alguno que haya luchado con nosotros el día de San Crispín!

SALISBURY: ¡Mi señor soberano, prepárate de prisa! Los franceses están bravamente en orden de batalla, y marcharán sin dilación alguna sobre nosotros.

REY ENRIQUE V: ¡Todo está dispuesto si nuestro espíritu lo está!

WESTMORELAND: ¡Que perezca aquel cuyo espíritu retroceda ahora!

REY ENRIQUE V: ¿Ya no quieres más ayuda de Inglaterra, primo?

WESTMORELAND: ¡Quisiera Dios, mi señor, que tú y yo solos, sin más ayuda, pudiésemos librar esta real batalla!

REY ENRIQUE V: ¡Conocéis vuestros puestos! ¡Que Dios esté con todos vosotros!

Al día siguiente, la banda de hermanos de Enrique V aplastó al ejército francés en Azincourt de una manera absoluta, gracias a sus arqueros y la mala estrategia francesa. Mediante el Tratado de Troyes de 1420, Carlos VI de Francia aceptó conceder al Rey inglés la mano de su hija Catalina y, como dote, los ducados de Normandía y Anjou.

Azincourt fue la batalla más importante de la terrible Guerra de los Cien Años (1337-1453) que sembró por más de un siglo desolación y muerte por media Europa. Esta batalla también fue la primera victoria de la infantería sobre la caballería, y la primera de un ejército vasallo popular sobre uno de la nobleza.

El que sigue es un ejemplo del uso del módulo datetime para el manejo de la fecha y la hora actuales del sistema. Puede usarse como un módulo, o para imprimir la fecha y la hora en un formato amigable para el usuario.

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

'''
fechas.py - Genera un diccionario con datos utiles sobre fecha y hora actuales.
'''

import datetime

diasemana = {'MONDAY':'Lunes','TUESDAY':'Martes','WEDNESDAY':'Miercoles',
             'THURSDAY':'Jueves','FRIDAY':'Viernes','SATURDAY':'Sabado',
             'SUNDAY':'Domingo'}

mes = {'JANUARY':'Enero','FEBRUARY':'Febrero','MARCH':'Marzo',
       'APRIL':'Abril','MAY':'Mayo','JUNE':'Junio',
       'JULY':'Julio','AUGUST':'Agosto','SEPTEMBER':'Setiembre',
       'OCTOBER':'Octubre','NOVEMBER':'Noviembre','DECEMBER':'Diciembre'}

def fechas():
    '''
    Devuelve un diccionario con las siguientes claves:
    fecha : Fecha actual en formato 'datetime.date'
    fechora : Fecha y hora actuales en formato 'datetime.date'
    hora : Hora actual en formato 'str'
    dia : Dia de la semana segun diccionario en formato 'str'
    mes : Mes actual segun diccionario en formato 'str'
    '''
    dic = {}
    dic['fecha'] = datetime.date.today()
    dic['fechora'] = datetime.datetime.today()
    dic['hora'] = dic['fechora'].time().__str__().split('.')[0]
    dic['dia'] = diasemana[dic['fecha'].strftime('%A').upper()]
    dic['mes'] = mes[dic['fecha'].strftime('%B').upper()]
    return dic

def main():
    '''
    Imprime la fecha y hora actuales usando el diccionario de fechas()
    '''
    d = fechas()
    print 'Son las %s del %s %s de %s de %s' % \
          (d['hora'],d['dia'],d['fecha'].day,d['mes'],d['fecha'].year)

if __name__ == '__main__': main()

Introducción a la Estructura de los Lenguajes

Posted by carlos on 09/09/2010
Posted in Tutoriales  | 2 Comments

Lo que sigue es un resumen de algunos de los conceptos fundamentales relacionados con la asignatura “Estructura de los Lenguajes” que enseño en la Facultad Politécnica de la Universidad Nacional de Asunción. Este post va dedicado a mis alumnos.

Lenguaje de programación

Un lenguaje, en su sentido natural, es un método humano, no instintivo, que sirve para comunicar ideas, emociones y deseos mediante un sistema de símbolos producidos voluntariamente.

Un lenguaje, en su sentido formal, es aquel que tiene una gramática que consta de un vocabulario de símbolos, reglas sintácticas (combinaciones) y reglas semánticas (significado).

El lenguaje, en general, es entonces un conjunto de objetos (vocabulario) capaces de ser combinados de acuerdo a ciertas reglas (gramática) con el fin de comunicarse con un receptor.

Un lenguaje de programación es un subconjunto de los lenguajes formales que le permite al ser humano comunicarse con una computadora (receptor) para indicarle a ésta qué es lo que debe hacer.

Se puede considerar a un lenguaje de programación como una capa de abstracción que le protege al ser humano (programador) de las complejidades o particularidades de la computadora. Esa capa le presenta al programador una máquina virtual que le resulta mucho más fácil de comprender que la máquina real.

Lenguaje de máquina

El lenguaje de máquina es un sistema de instrucciones que pueden ser ejecutadas directamente por una unidad central de procesamiento (microprocesador). Se lo considera un lenguaje de programación primitivo e incómodo, por estar basado directamente en la lógica digital y por no haber un único lenguaje de máquina, sino que cada arquitectura de hardware cuenta con el suyo.

El código máquina a veces se denomina código nativo, por haber partes que dependen de una plataforma de hardware en particular. No debe confundirse al código máquina con bytecode (código de bytes) ya que este último es un código intermedio que se ejecuta a través de un intérprete, no directamente por la CPU.

Para que un programa escrito en un lenguaje de programación “humano” (de alto nivel) pueda ser ejecutado, éste debe convertirse a código máquina mediante un programa traductor que funciona como intérprete (traduce y ejecuta cada instrucción) o compilador (traduce y guarda las instrucciones en código máquina en un archivo nuevo).

Código binario

El código binario es el sistema de representación de instrucciones y datos que utiliza un dispositivo electrónico. Se basa en el sistema de numeración binario (de dos dígitos, “0” y “1”) que representan los dos únicos niveles de tensión que usan los circuitos electrónicos.

La unidad básica de información del código binario es el bit (binary digit) que es una variable cuyo valor almacenado puede representar sólo a uno de dos posibles estados: encendido/apagado, verdadero/falso, sí/no, etc.

El código binario puede representar cualquier tipo de información, por ejemplo la letra minúscula “a” está representada por la cadena de bits “01100001” que tiene un valor decimal de 97.

Ensamblador

El término “ensamblador” puede referirse a un programa especial o a un lenguaje de programación (Assembly). El Assembly es un tipo de lenguaje de bajo nivel (cercano al hardware) que permite una representación un poco más abstracta de las instrucciones en código máquina.

El programa ensamblador es capaz de leer un archivo con instrucciones escritas en lenguaje Assembly (ensamblador) y traducirlas a código máquina, para posteriormente almacenarlas en un nuevo archivo, denominado objeto o ejecutable.

Los ensambladores fueron creados para facilitar la escritura de programas en código máquina, ya que hacerlo en código binario resulta muy complicado para el ser humano.

Arquitectura del conjunto de instrucciones

Del inglés “Instruction Set Architecture” (ISA) es una especificación que detalla las instrucciones que una CPU en particular puede interpretar y ejecutar.

ISA es la parte de la arquitectura de hardware relacionada con la programación, e incluye los tipos de datos, instrucciones, registros, modos de direccionamiento, arquitectura de memoria, interrupciones y manejo de excepciones.

Máquina virtual

Una máquina virtual es una implementación en software de una máquina real o física (hardware). Dicha máquina virtual debe poder ejecutar órdenes diseñadas para la máquina real.

Lo que comúnmente se entiende por máquina virtual es lo que en términos técnicos más específicos se conoce como máquina virtual de sistema, que permite compartir los recursos físicos (hardware) entre distintas máquinas virtuales, cada una de ellas funcionando sobre su propio sistema operativo.

Los lenguajes de programación pueden considerarse máquinas virtuales de un tipo especial, denominado máquina virtual de proceso o de aplicación, debido a que funcionan sobre un sistema operativo y soportan un único proceso.

Un lenguaje de programación provee al programador de un entorno de desarrollo independiente de la plataforma (hardware + sistema operativo) lo que al menos en teoría permite que un mismo programa funcione en cualquiera de ellas.

Paradigmas de la programación

La palabra “paradigma” proviene del griego y significa algo así como “demostración de un modelo”. Un paradigma de programación es un conjunto de métodos sistemáticos aplicables en el diseño de programas, basados en un modelo de definición y operación de la información.

Los paradigmas de programación se diferencian entre sí por los conceptos, abstracciones y pasos que usan para representar los elementos de un programa.

Los paradigmas de programación más comunes son:

  • Imperativo: Basado en una secuencia de comandos.
  • Declarativo: Expresa la lógica de la computación, sin describir su flujo de control.
  • Funcional: (Subparadigma de Declarativo) Basado en la evaluación de funciones matemáticas.
  • Estructurado: (Subparadigma de Imperativo) Dividir el programa en secciones independientes.
  • Orientado a objetos: (Subparadigma de Imperativo) Los datos incluyen los métodos que los usan.

Cómo instalar fuentes de Macintosh en Ubuntu

Posted by carlos on 09/06/2010
Posted in Trucos  | Tagged With: , | 1 Comment

En el contexto del tema que nos ocupa en este post, se les llama “fuentes” a los diferentes tipos de letra con los que contamos para nuestras tareas de procesamiento de textos.

En un post anterior, vimos cómo instalar fuentes de Windows Vista en Ubuntu. Hoy le toca el turno a las fuentes que vienen incluidas en el “otro” sistema operativo de corriente principal, el Mac OS X de Apple.

Abrimos una terminal, y empezamos a copiar y pegar las siguientes sentencias:

wget http://ubuntu-debs.googlecode.com/files/macfonts.tar.gz

tar zxvf macfonts.tar.gz

sudo mv macfonts /usr/share/fonts/

fc-cache -fv

¿Cómo administramos nuestras fuentes? Una opción rápida y sencilla es el Font Manager para GNOME, que analizamos en otro post.

Cómo restaurar la contraseña de root en Ubuntu

Posted by carlos on 04/03/2010
Posted in Trucos  | Tagged With: , | 3 Comments

Hasta ahora nunca me pasó a mí, pero sí a un par de colegas, por lo que decidí escribir un breve post detallando los pasos a seguir para recuperar el control de una instalación GNU/Linux basada en Ubuntu. Probablemente el procedimiento también funcione en otras distros. De ser así, me gustaría recibir comentarios al respecto.

Como todos los usuarios de Ubuntu saben, la cuenta root (administrador) viene bloqueada de fábrica. Sólo las cuentas del grupo admin pueden escalar privilegios y convertirse en root para realizar tareas administrativas, como por ejemplo editar archivos de configuración o instalar nuevo software.

Es común que el grupo admin tenga un único integrante, y sea la cuenta de usuario que se creó al instalar la distro en el equipo. Al intentar realizar una tarea administrativa, se nos pedirá la contraseña de esa cuenta. Si no la recordamos, no podremos escalar a root, y por ende perderemos el control del sistema operativo.

Para restaurar la contraseña del usuario admin, procederemos de la siguiente manera:

1. En el menú de arranque, apretar la tecla Esc.

2. Apretar e para editar.

3. Elegir la línea que empieza con kernel y apretar e nuevamente.

4. Escribir rw init=/bin/bash y apretar la tecla Enter.

5. Apretar b para arrancar. El sistema iniciará una consola root sin password.

6. Ejecutar el comando passwd usuario (reemplazar usuario por el nombre de nuestra cuenta).

7. Introducir la nueva contraseña y apretar Enter. Repetir dicha operación.

¡Listo! Reiniciemos el sistema con Ctrl+Alt+Supr.

Si no recordamos el nombre de usuario, lo podemos encontrar en el archivo /etc/passwd que podemos revisar con el comando cat o tail.

Instalación de un servidor SFTP

Posted by carlos on 05/02/2010
Posted in Tutoriales  | Tagged With: | 7 Comments

La sigla SFTP puede significar tanto Secure File Transfer Protocol (Protocolo Seguro de Transferencia de Archivos) como SSH File Transfer Protocol, ya que representa a un servicio de transferencia de archivos (FTP) que utiliza un canal de comunicación seguro proveído por el protocolo Secure Shell (SSH).

En servidores basados en Unix, como GNU/Linux, se suele instalar el servicio SSH (sshd) para así poder acceder remotamente tanto al sistema de archivos como a una consola de comandos. Esto último debería estar reservado exclusivamente a aquellas cuentas de usuario a las que se les permita escalar privilegios hasta administrador (root).

Para instalar un servidor SSH en una distribución Debian de GNU/Linux:

apt-get install openssh-server

El archivo de configuración es /etc/ssh/sshd_config y se puede modificar con nuestro editor preferido.

Al final de la línea que empieza con AllowUsers hay que agregar a los usuarios que podrán acceder al servicio.

Se deben agregar las siguientes líneas al archivo de configuración:

Subsystem sftp internal-sftp
Match group sftp
ChrootDirectory /chroot/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

Debemos crear un grupo llamado sftp (o como queramos) al que le asignaremos las cuentas de usuario que accederán exclusivamente al servicio SFTP y a las que queremos bloquear el acceso al servicio de consola remota de comandos:

addgroup sftp

adduser usuario sftp

La línea ChrootDirectory hace referencia a una carpeta base que crearemos en la raíz para alojar a las carpetas personales de los usuarios:

mkdir /chroot

La carpeta base puede llamarse como queramos, pero en el ejemplo se denomina chroot, haciendo referencia a la operación de cambio de raíz que permite “enjaular” a los usuarios, impidiéndoles acceder a carpetas ajenas a su carpeta personal.

Dentro de la carpeta base, debemos crear una subcarpeta por cada usuario del grupo sftp. Cada subcarpeta, a su vez, debe tener una estructura home/usuario, por ejemplo, para habilitar al usuario jperez hay que hacer lo siguiente:

adduser jperez sftp

mkdir -p /chroot/jperez/home/jperez

chown -R jperez.jperez /chroot/jperez/home/jperez

Esto es necesario porque la carpeta base (raíz) debe pertenecer a root. El acceso de escritura está permitido únicamente en la última carpeta de la trayectoria (jperez).

Para aplicar los cambios al servicio, debemos reiniciarlo:

/etc/init.d/ssh restart

Hecho ésto, ya podemos probar acceder a nuestro servidor SFTP:

sftp usuario@servidor

Donde usuario es el nombre de la cuenta de usuario (por ejemplo, jperez) y servidor es el nombre o dirección IP del equipo donde instalamos el servicio.

También podemos usar algún cliente SFTP gráfico como FileZilla y WinSCP (ambos libres y gratuitos). Incluso pueden servir el administrador de archivos o el navegador Web, usando como dirección la sintaxis:

sftp://usuario:clave@servidor

La experiencia con este último método varía de acuerdo al administrador de archivos y al navegador Web que utilicemos. En el caso de Unix con Gnome, podemos usar esta sintaxis en cualquier ventana Nautilus.

¡Felices Saturnales y un próspero Sol Invictus!

Posted by carlos on 24/12/2009
Posted in Historia  | 1 Comment

Las Saturnales (en latín Saturnalia) eran una importante festividad romana. Eran como Navidad y Carnaval al mismo tiempo, y el cristianismo de la antigüedad, después de mucho esfuerzo, logró sustituirla por las celebraciones que hoy conocemos.
Las fiestas Saturnales se celebraban del 19 al 25 de diciembre en honor a Saturno, Dios de la agricultura. A la luz de velas y antorchas, se celebraba el fin del período más oscuro del año y el nacimiento del nuevo período de luz, o nacimiento del Sol Invictus, coincidiendo con la entrada del Sol en el signo de Capricornio (solsticio de invierno). Eran siete días de bulliciosas diversiones, banquetes e intercambio de regalos.
En el siglo III, el Emperador romano Aureliano instituyó el culto al Sol Invictus (aureo = oro, brillante como el sol) basándose en el antiguo culto a Mitra, el dios sol persa, que se empezó a conocer en el Imperio Romano 60 años antes del nacimiento de Jesús.
Mitra nació de una virgen un 25 de diciembre. Podía curar enfermedades y revivir a los muertos. Mitra no murió, sino ascendió a los cielos en el equinoccio de primavera (pascuas) después de una cena de despedida con sus 12 discípulos (uno por cada signo del zodíaco).
En el siglo V, la Iglesia hizo coincidir con esas fechas las de nacimiento y muerte de Jesús, con el objetivo de acabar con las antiguas celebraciones. Gradualmente las costumbres paganas pasaron al Día de Año Nuevo, siendo asimiladas finalmente por la fiesta cristiana que hoy en día se conoce universalmente como el Día de Navidad.
No importa lo que diga la historia, ni lo que diga el propio Papa. Sea cual fuere tu motivo personal, lo que importa es la celebración. ¡Que disfrutes de las fiestas y que Mitra… digo, Dios te bendiga!
http://es.wikipedia.org/wiki/Saturnales
http://es.wikipedia.org/wiki/Sol_Invictus
http://es.wikipedia.org/wiki/Mitra_(mitología)

Las Saturnales (en latín, Saturnalia) eran, para los antiguos romanos, las festividades más importantes del año. Podrían describirse como Navidad y Carnaval al mismo tiempo, y el cristianismo de la antigüedad, después de mucho esfuerzo, logró sustituirlas por las celebraciones que hoy conocemos.

Las fiestas Saturnales se celebraban del 19 al 25 de diciembre en honor a Saturno, Dios de la agricultura. A la luz de velas y antorchas, se celebraba el fin del período más oscuro del año y el nacimiento del nuevo período de luz, o nacimiento del Sol Invictus, coincidiendo con la entrada del Sol en el signo de Capricornio (solsticio de invierno). Eran siete días de bulliciosas diversiones, banquetes e intercambio de regalos. Tal y como es costumbre hoy día, los romanos de ese entonces aprovechaban esas festividades para visitar a parientes y amigos.

saturnalia

En el siglo III, el Emperador romano Aureliano instituyó el culto al Sol Invictus (aureo = oro, brillante como el sol) basándose en el antiguo culto a Mitra, el dios sol persa, que se empezó a conocer en el Imperio Romano 60 años antes del nacimiento de Jesús.

Según la mitología persa, Mitra nació de una virgen un 25 de diciembre. Podía curar enfermedades y revivir a los muertos. Mitra no murió, sino ascendió a los cielos en el equinoccio de primavera (pascuas) después de una cena de despedida con sus 12 discípulos (uno por cada signo del zodíaco).

Recién hacia el siglo V, la Iglesia decidió celebrar el nacimiento de Jesús el 25 de diciembre, y así ir opacando las antiguas celebraciones. Gradualmente dichas costumbres (ahora consideradas paganas) pasaron al Día de Año Nuevo, siendo asimiladas finalmente por la fiesta cristiana que hoy en día se conoce universalmente con el nombre de Navidad.

No importa lo que diga la historia, ni lo que diga el propio Papa Benedicto XVI. Sea cual fuere tu motivo personal, lo que importa es la celebración. Mi deseo es que el sentido que los buenos cristianos le dan a la Navidad esté presente en nosotros todo el tiempo, no sólo una vez al año.

¡Que disfrutes de las fiestas, y que Mitra… digo, Dios te bendiga!