lunes, 9 de diciembre de 2013

Expresiones regulares

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

El de las expresiones regulares es uno de los capítulos más farragosos de los sistemas GNU/Linux pero que más atención merece, y dominarlas supone extender muy mucho las prestaciones de la consola de comandos. Vendrían a ser como una versión avanzada de los caracteres comodín y unas posibilidades exponencialmente mayores.


No tiene mayor secreto que aprenderlas y, luego, practicar para averiguar hasta qué punto podemos usarlas en búsquedas, sustituciones de texto o scripts. Las dividiremos en metacaracteres, anclas y multiplicadores.


Metacaracteres

Son conjuntos de caracteres dentro de una expresión regular y con un significado o función específicos
. : equivale a cualquier carácter.
( ) : sirve para agrupar patrones (subexpresiones o grupos).
[ ] : equivale a un carácter cualquiera de los contenidos entre corchetes.
[ - ] : equivale a un rango de caracteres.
[^ ] : excluye los caracteres que figuran entre corchetes.
{ } : introduce patrones de repetición. 
| : permite elegir entre dos expresiones.
// : delimita una expresión regular. 
\ : equivale a cualquier carácter excepto fin de línea.
\w: equivale a cualquier carácter alfanumérico y carácter _.
\W: equivale a cualquier carácter no alfanumérico.
\d: equivale a cualquier dígito.
\D: equivale a cualquier carácter no dígito.
\S: equivale a cualquier carácter menos espacio en blanco.
i: modificador para no distinguir entre mayúsculas y minúsculas.
!: excluye el carácter siguiente. 
Veamos algunos ejemplos:
[a-z]: equivale a un rango de letras minúsculas entre la a y la z.
[0-9]: equivale a un rango de dígitos entre 0 y 9.
[A-Za-z]: equivale a una letra cualquiera, ya sea mayúscula o minúscula. 
[A-Z][a-z]: equivale a una letra mayúscula seguida de una minúscula. 
[^c]: excluye el carácter c, cualquier letra que no sea la c.
[^aeiou]: excluye las vocales, es decir, equivale a cualquier consonante.
[a|b]: equivale a la letra a o a la letra b.
\w: equivale a [a-zA-Z0-9_].
\W: equivale a [^a-zA-Z0-9_].
/hola/i: representa "hola" sin distinguir mayúsculas y minúsculas.
\d: equivale a [0-9].
[!a-c]: equivale letra minúscula que no es ni a ni b ni c.
Anclas
Se refieren a la posición de la cadena.
^: comienzo de línea.
$: final de línea.
\b: principio o final de palabra.
\B: posición que no es ni al comienzo ni al final de la palabra.
<>: equivale a una palabra. 
Multiplicadores
Aluden a cuantas veces aparece en la cadena.
*: repite entre cero y más veces el carácter o subexpresión previos.
+repite entre uno y más veces el carácter o subexpresión previos.
?: repite entre cero y una vez el carácter o subexpresión previos.
{n}repite "n" veces el carácter o subexpresión previos. 
{n,m}repite entre "n" y "m" veces el carácter o subexpresión previos. 
{n,}repite al menos "n" veces el carácter o subexpresión previos. 
Sigamos con los ejemplos de anclas y multiplicadores:
^[aeiou]: una vocal al comienzo de una línea.
[aeiou]$: una vocal al final de una línea.
hola$: "hola" al final de una línea.
^$: línea vacía.
\balon: "balon" al principio o final de línea.
hola*: "hol", "hola", "holaa".
[a-z]*: una palabra en minúsculas.
^Una vez*arbol$: una línea que comienza con "una vez" y termina con "arbol".
^Una vez*[Aa]rbol$: una línea que comienza con "una vez" y termina con "Arbol" o "arbol".
hola+: "hola", "holaa", "holaaa", etc.
a{4}: "aaaa".
a{2,4}: "aa", "aaa", "aaaa".
a{2,}: "aa", "aaa", "aaaa", etc.
Lo se, un post como este valdría para ahuyentar a cualquier novato que quisiera entrar en el mundo de GNU/Linux. Quizá las expresiones regulares no sean necesarias para administrar una red doméstica o de una pequeña PYME, pero a niveles más avanzados son muy utilizadas y hacerse con ellas es fundamental. Recomiendo usar Google para encontrar construcciones más complejas y sus correspondientes explicaciones. Les dejo con un vídeo tutorial donde les explican un uso se le puede dar a las expresiones regulares.


sábado, 7 de diciembre de 2013

Filtrar datos y archivos

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

En ocasiones será necesario recurrir a comandos que nos ayuden a localizar archivos binarios (ejecutables), paquetes, simples ficheros de trabajo o determinados contenidos dentro de ellos. Hoy vamos a hablar de algunas órdenes que nos ayudarán en la tarea de filtrar los resultados deseados ya sea en la búsqueda de ficheros o de sus datos.

grep
Conviene aprender bien como opera este comando ya que nos resultará muy útil para encontrar cadenas de texto dentro de ficheros, lo cual conviene cuando son extensos. Es básicamente un filtro que concreta la búsqueda en función del argumento que le acompañe. Algunas de sus opciones son:
grep -i: para no distinguir entre mayúsculas y minúsculas.
grep -n: muestra el nº de línea dentro de un archivo especificado según el patrón introducido.
grep -v: muestra las líneas no coincidentes con el patrón especificado.
grep -c: en lugar de mostrarlas líneas coincidentes con el patrón introducido muestra el número de líneas que coinciden.
grep -r: busca recursivamente dentro de los subdirectorios existentes en el directorio actual.
grep -o: para que en el listado solo aparezca la parte de la línea que coincide con el patrón.
Para entender la potencia de este comando conviene que veamos algunos ejemplos:
grep opciones docu.txt: para listar todas las líneas que contengan la cadena "opciones" dentro de docu.txt.
grep "expresiones regulares" docu.txt: para listar todas las líneas que contengan la cadena "expresiones regulares" dentro de docu.txt. Cuando se trate de dos o más palabras hay que entrecomillarlas.
grep -v "compras" departamentos.txtpara excluir del listado todas las líneas que contengan la cadena "compras" dentro de departamentos.txt.
grep guitarra dredg anathema dreamtheater rush > guitarras.txt: nos envía las líneas que contengan la palabra "guitarra" de los archivos dredg, anathema, dreamtheater y rush al archivo guitarras.txt.
grep guitarra dredg anathema dreamtheater rush | tee guitarras.txt: visualiza el mismo resultado que anteriormente por pantalla y, a través de una tubería, usamos el comando tee para enviarlo al archivo guitarras.txt.
sed
Comando que permite borrar líneas y registros o sustituir cadenas de caracteres dentro de las líneas. Estas modificaciones solo se dan a efectos de visualización y los archivos originales no se ven alterados salvo que utilicemos el comando de una manera muy concreta.
sed "3d" lista.lst: elimina la línea nº 3 del archivo lista.lst.
sed "3,5d" lista.lst: elimina el rango de líneas de la 3 a la 5 del archivo lista.lst.
sed "3,$d" lista.lst: elimina el rango de líneas de la 3 en adelante del archivo lista.lst.
sed "/^$/d" lista.lst: elimina las líneas en blanco del archivo lista.lst. 
sed "s/cadena1/cadena2/g" lista.lst: sustituye cadena1 por cadena2  en el archivo lista.lst.
sed "5 s/USUARIO/usuario/g" lista.lst: sustituye USUARIO por usuario en la línea nº 5 del archivo lista.lst. 
sed -i "3,5d" lista.lst: mismo efecto que el anterior, pero esta vez los cambios se realizan en el archivo.
sort
Comando para ordenar registros y líneas de uno o más archivos.
sort listado.txt: ofrece por pantalla las líneas del archivo listado.txt  ordenadas por orden alfabético.
sort listado.txt >  listado2.txt: crea un duplicado de listado.txt con nombre listado2.txt y con sus líneas ordenadas alfabéticamente.
sort -o listado.txt listado.txt: ordena las líneas del archivo sin ofrecerlo por pantalla.
sort -r listado.txt: muestra por pantalla las líneas del archivo ordenadas en orden inverso.
sort -n listado.txt: ordena las líneas por número; útil cuando dichas líneas comienzan con un carácter numérico.
sort -u salida.txt: elimina las líneas repetidas al ordenar el archivo salida.txt
sort -m lista1.txt lista2.txt: combina ambos archivos asumiendo que los dos están previamente ordenados.
sort -b: ignora los espacios en blanco. 
tr (translate)
Permite cambiar unos caracteres por otros dentro de un archivo. Primero especificamos lo que vamos a sustituir y seguidamente lo que lo sustituye. Escribamos su sintaxis y la aclararemos después con ejemplos:

tr [opción] SET1 [SET2].

Las opciones pueden ser
-d: elimina los caracteres incidados en SET1.
-s: elimina o reemplaza los caracteres indicados en SET1. 
-c: todos los caracteres que no estén indicados en SET1 los convierte a SET2.
-t: trunca la longitud de SET1 a la de SET2.
Veamos algunos ejemplos:
echo ejemplo | tr -d emp: elimina los caracteres emp de la palabra ejemplo. Aquí ejemplo sería SET1 y emp sería SET2.
echo ejjemmpplo | tr -s [a-zA-Z]: elimina cualquier letra (representada por la expresión comodín [a-zA-Z]) duplicada de la palabra ejjemmpplo.
echo "nací el 02 de enero de 1947" | tr -c [0-9] $: sustituye todo carácter no numérico (incluidos espacios en blanco -de nuevo ver comodines-) de la expresión "nací el 02 de enero de 1947" por el carácter $.
echo murcielago | tr aeiou AEIOU: lo que aquí decimos es que de murcielago cojamos las letras aeiou y las sustituyamos por AEIOU.
Como vengo insistiendo, esto no son más que pequeños ejemplos. Documentarse y practicar es la mejor receta para aprovechar las prestaciones de estos comandos.

Y como no podría ser más a propósito, ya que hemos hablado de filtros terminemos con un vídeo de la banda de Cleveland Filter y este potente "Welcome to the fold".



lunes, 2 de diciembre de 2013

Visualizar un árbol de directorios

La de hoy va a ser una entrada breve pero interesante. Cuando tenemos un árbol de directorios muy extenso a veces queremos visualizarlo todo, con sus subdirectorios. En GNU/Linux disponemos de un comando que si bien no viene de serie (al menos en Debian 7.2) lo podemos instalar así:

sudo apt-get install tree

Exacto, el comando se llama tree (árbol). Ingenioso, ¿verdad? Pues bien, con él puedo hacer justo lo que perseguía, que no es otra cosa que mostrar en árbol todos los artistas y discos que tengo en el directorio Música de mi disco duro externo. Como sería muy extenso solo ojearemos lo poquito que tengo en la misma carpeta del disco del PC.



Como ven, añadiendo la opción -d obtenemos como resultado el árbol de directorios solo con sus subdirectorios. La órden tree monda y lironda nos daría también todos los archivos contenidos en cada directorio. Pero si nuestro árbol resultara demasiado largo como para verlo de un solo golpe de vista podemos hacer uso de la redirección para enviar la salida del comando a un archivo, de esta forma:

tree -d > musica.txt

Así podemos visualizar nuestro árbol con total comodidad con solo abrir el archivo. Y si lo que queremos es imprimir desde el terminal:

tree -d > lp

Siempre que tengamos una impresora correctamente instalada, of course.

Pues de esa lista uno de los discos que más me está gustando es el de la banda usamericana de post-rock Caspian, de los cuales les dejo este "Gone in bloom and bough".



miércoles, 27 de noviembre de 2013

Tuberías y concatenación de comandos

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Esta entrada está estrechamente relacionada con la última publicada en este blog. Si con la redirección de comandos empezamos a tomar contacto con una forma de introducir órdenes en la terminal de forma que no se tratara de simplemente de teclear el comando, con las tuberías y las concatenaciones aumentaremos las prestaciones de nuestra shell hasta límites que solo nuestra imaginación podrá establecer.

Pipes o tuberías

Describir las pipes o tuberías es sencillo: se trata de utilizar la salida de un comando (su resultado) como entrada de otro. Hablando en términos matemáticos, 3 + 4 - 5 x 8 sería como una tubería; el resultado de 3 + 4 es el primer operando (la entrada) de la siguiente operación, y su resultado el primer operando la de la siguiente operación.

Para construir una tubería utilizamos en carácter | (Alt Gr + 1) y lo colocamos entre la sucesión de comandos que queremos ejecutar. Para trabajar con tuberías es muy frecuente emplear el comando tee.

tee
Sirve para enviar la entrada del teclado a la pantalla y a uno o más ficheros.
tee -a: inserta los datos al final del archivo.
Veamos algunos ejemplos:
cat grupos001.txt | tee grupos002.txt
De esta forma hemos listado el contenido del fichero grupos001.txt con el comando cat y la salida de dicho comando la hemos enviado, mediante una tubería, al comando tee, el cual nos muestra en pantalla ese contenido y, al mismo tiempo, nos lo inserta en el archivo grupos002.txt que, si no existe, será creado. Sería otra manera de duplicar un archivo, pero es solo un ejemplo de uso.
cat puesto01.txt 2>&1 | tee puesto02.txt
Lo que hemos hecho ahora es listar el archivo puesto01.txt, enviar el error estándar a la pantalla y enviar la salida del comando cat al comando tee, tubería mediante, para crear puesto02.txt.
cat archivo1 2>&1 | tee -a archivo2
Este tercer ejemplo es igual que el anterior pero al incluir el modificador -a al comando tee lo que hacemos en añadir los datos listados de archivo1 en archivo2 si este ya existiera.

Son ejemplos muy simples pero sirven para observar el potencial que pueden tener varias tuberías consecutivas a la hora de simplificar operaciones en el terminal de comandos.

Concatenación de comandos

La concatenación funciona de manera similar a las tuberías pero con una salvedad: en esta ocasión hablamos de comandos ejecutados consecutivamente, uno tras otro y en la misma línea, pero independientes entre sí. Se pueden separar de dos formas obteniendo dos diferentes resultados:
Ejemplo 1: cd /etc ; ls -l
Aquí, los comandos cd /etc y ls -l están separados por el carácter ; lo que significa que aunque el primero de un error el siguiente se ejecuta de todas formas, y así sucesivamente en caso de haber más.
Ejemplo 2: cd /etc && ls -l
En cambio, si están separados por && al primer error la secuencia de comandos se detiene, sea la concatenación tan larga como sea.

Un ejemplo clásico de concatenación es teclear en el terminal la siguiente línea:
sudo apt-get update ; sudo apt-get upgrade
Suele ocurrir que cuando queremos actualizar repositorios y sistema con estos dos comandos el primero se toma su tiempo antes de que podamos ejecutar el segundo, lo que nos lleva a estar pendiente del monitor pasa saber cuando introducir la segunda orden. De este modo actualizaremos nuestros repositorios con apt-get update y nuestra distribución con apt-get upgrade de una sola vez. Es como dejar programadas varias tareas para que se vayan realizando una detrás de la otra hasta quedar todas acabadas.

Y como hemos hablado de pipes escuchemos a la que fue banda de Pepper Keenan, Corrosion Of Conformity, en el vídeoclip de "Albatross".



sábado, 23 de noviembre de 2013

Redirección de comandos

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Hoy vamos a conocer como redireccionar el resultado de un comando hacia la pantalla o hacia un archivo. Se emplean unos caracteres llamados operadores de redirección o redireccionadores para enviar el resultante de la ejecución de un comando al lugar donde nos interesa tenerlo.

Lo primero a tener claro es que los procesos en GNU/Linux tienen asociados tres archivos ubicados en el directorio /dev y denominados:

/dev/stdin o entrada estándar
/dev/stdout o salida estándar
/dev/stderr o salida de errores

La entrada estándar o stdin es el lugar desde donde un comando obtiene la información a procesar, y por defecto es el teclado.

La salida estándar o stdout es el lugar donde un comando envía el resultado de su ejecución, y por defecto es la pantalla del terminal.

La salida de errores o stderr es el lugar donde un comando envía un mensaje de error en caso de que se produzca; por defecto es la pantalla pero también puede ser un archivo.

Cada uno de estos tres archivos lleva también asociado un número descriptor:

stdin - 0
stdout - 1
stderr - 2

Luego están los operadores, que son los símbolos < y >. Con estos caracteres realizaremos la operativa de redirección. Resumiendolo en una tabla:
  1. stdin  -  entrada estándar (teclado)  - Descriptor: 0  - Operador: <
  2. stdout  -  salida estándar (terminal)  - Descriptor: 1  - Operador: >
  3. stderr  - salida de errores (pantalla o archivo)  - Descriptor: 2  -  Operador: >
Para entender todo esto lo mejor es verlo con ejemplos.

Imaginemos que queremos enviar la salida de un comando a un fichero para verlo con posterioridad, por ejemplo, el listado del contenido de nuestro directorio actual (comando ls -l) al archivo lista.txt. Lo haríamos así:
1) De salida estándar stdout (pantalla) a archivo -1er caso-: ls -l > lista.txt
Así, en lugar que ver el resultado del comando ls -l por pantalla obtendríamos un archivo llamado lista.txt en el que aparece el contenido de nuestro directorio actual según los términos del comando ls -l. Si este archivo ya existiera lo sobreescribiría. Veamos más ejemplos.
2) De salida estándar stdout (pantalla) a archivo -2º caso-: ls -l >> lista.txt
En este caso el redireccionador es >> y lo que conseguimos con él es añadir el resultado del comando ls -l al archivo lista.txt ya existente. Podemos así añadir contenido al archivo repetidas veces si no queremos crear uno nuevo cada vez o machacar el ya existente.
3) De error estándar stderr a archivo (1er caso): ls -l 2> errores.txt
Habrá ocasiones en que un comando nos de error al ejecutarse, total o parcialmente, y en esa ocasión quizá sea útil ver pausadamente en qué consiste ese error. Para eso está la salida de errores y lo más común es derivarla a un archivo, en este caso errores.txt. Recuerden que si ya existe lo sobreescribirá. Si no se produce ningún error el archivo se creará sin contenido alguno. No saldrá nada por pantalla.
4) De error estándar stderr a a archivo (2º caso)ls -l 2>> errores.txt
Mismo caso que el que vimos más arriba; si el redireccionador es doble lo que hacemos es añadir contenido al archivo de errores designado (que sigue siendo errores.txt). Tampoco saldrá nada por pantalla.
5) De error estándar stderr a la salida estándar stdout (pantalla): cp * 2>&1
En esta ocasión usando los descriptores hemos redireccionado la salida de error del comando cp * (copiar todo) a la salida estándar (la pantalla) mediante el carácter &. De esta forma si no es posible copiar todo lo designado con el comando cp por el motivo que sea (como puede ser no tener privilegios para hacerlo) los mensajes de error serán visualizados por la salida estándar (pantalla).
6) De un archivo al comando por la entrada estándar stdin (teclado): grep "López" < empleados.txt
Aquí hemos empleado el comando grep, el cual sirve para filtrar resultados en función del parámetro introducido, que ha sido "López". De este modo, dentro de un hipotético archivo llamado empleados.txt se han buscado todas las líneas de texto que contengan "López" y el resultado de esta búsqueda se ha enviado a la salida estándar (pantalla). Dicho de otro modo, el resultado de la búsqueda se emplea como entrada del comando grep y el resultado de su ejecución lo vemos por la pantalla.
7) De error estándar stderr a dispositivo nulo: ls -l 2> /dev/null
De esta forma los errores producidos al ejecutar el comando ls -l irán a un dispositivo nulo y se perderán.
8) De salida estándar stdout a dispositivo nulo: ls -l > /dev/null
No hay mucho más que explicar de este caso: el comando se ejecuta y su resultado se pierde por el agujero negro de la salida nula.

Como siempre digo, conviene consultar toda la documentación que cada uno tenga a mano para completar y terminar de entender el concepto de redirección. Y practicar, practicar mucho.

Parece que la ocasión la pintan calva para engarzar un vídeo de One Direction, ¿verdad? Pues lo siento, se van a quedar con las ganas. Ahí tienen a la extinta formación post-metalera Isis que, digamos, transitaron por senderos ligeramente dispares.



sábado, 9 de noviembre de 2013

Más comandos para operar con archivos y directorios

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Ya hemos hablado de como trabajar con archivos y directorios pero no es posible condensar todo el material que bajo ese título podría caber sin convertir la entrada en interminable. De tal modo, nuevamente vamos a vernos las caras con mandatos de terminal que nos ofrecen distintas prestaciones según la tarea que estemos realizando.

alias
Este comando ya fue tratado en el blog para un ejemplo concreto, pero no quiero que se quede fuera del tratamiento general que es la tónica del blog. Sirve para crear un atajo a un comando fijándole un nombre.
alias -a: elimina las definiciones de alias en el entorno de ejecución actual.
alias -p: muestra la lista de alias existente en el archivo .bashrc con el formato nombre_alias=valor.
alias instalar="sudo apt-get install":  crea un atajo para el comando sudo apt-get install llamado instalar.
alias lhost="cd /var/www/html": crea un atajo de acceso al directorio /var/www/html/ llamado lhost.
/comando_alias: tecleado de esta manera, en caso de invocar un alias cuyo nombre coincida con el de otro comando, no se tiene en cuenta dicho alias.
~/.bashrc: archivo oculto donde se incluyen los alias que deseamos que se vuelvan permanentes. 
unalias
Sirve para eliminar un alias existente.

ln
Comando para crear enlaces a archivos. Hay enlaces dos tipos de enlaces: duros y simbólicos. El enlace duro es un duplicado del archivo al que enlaza pero con otro nombre. Comparte inodo (estructura de datos que conserva cada archivo) con el original por lo que no pueden crearse en particiones o unidades distintas. El enlace simbólico funciona como un acceso directo de Windows, tenga o no el mismo nombre. Pueden crearse al margen de la unidad o partición donde se encuentren.
ln archivo1 archivo2: crea el enlace duro archivo2 a partir de archivo1.
ln -s archivo1 archivo2: crea el enlace simbólico archivo2 a partir de archivo1.
stat
Comando que muestra una serie de datos precisos acerca de un archivo o un directorio como nombre, tamaño, bloques que ocupa, tipo de archivo, inodo, enlaces, ID, GUID, propietario, grupos y fechas de acceso y modificación.

file
Comando simple que nos informa de si un objeto es un directorio o un archivo, y de qué tipo si es lo segundo.

cmp
Compara dos archivos y nos dice si son o no distintos. Nos informa en qué número de línea está la diferencia.

diff
Compara dos archivos línea a línea y nos dice las diferencias, algo que resulta más útil cuando se trata de archivos de texto.

wc
Cuenta las líneas, palabras y caracteres de un archivo.
wc -c: muestra solo el número de caracteres.
wc -w: muestra solo el número de palabras.
wc -l: muestra solo el número de líneas.
alien
Este comando no siempre viene por defecto en nuestra distribución por lo que, en tal caso, hay que instalarlo si lo queremos usar. Sirve para convertir paquetes de software de, entre otros, formato .deb (Debian), .rpm (Red Hat) y .tar.gz (Slackware).
alien -d archivo.rpm/tar.gz: para generar un paquete .deb a partir de un .rpm o un .tar.gz. (opción por defecto).
alien -t archivo.deb/rpm: para generar un paquete .tar.gz a partir de un .deb o un .rpm.
alien -r archivo.deb/tar.gz: para generar un paquete .rpm a partir de un .deb o un .tar.gz.
Nuevamente les recuerdo que solo una pequeña muestra de las opciones existentes son las mostradas aquí. Acudan a la ayuda del terminal para recabar más información.

Y como hemos hablado del comando alien, nada más apropiado que evocar el trailer original de 1979 de la mítica película de Ridley Scott.


jueves, 7 de noviembre de 2013

Obtener información del sistema

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Hay ocasiones en que es útil o necesario conocer determinados aspectos de nuestra máquina, ya sean detalles técnicos (modelo de tarjeta de red, p.e.) o eminentemente prácticos (espacio libre en disco). En esta entrada vamos a contemplar comandos para terminal que nos van a proporcionar este tipo de información.

arch
Comando que muestra la arquitectura del PC (el procesador). En mi caso el dato obtenido es i686, que se refiere al modelo Pentium PRO o Pentium II de Intel.

df
Comando para comprobar el espacio libre en disco duro (en bloques).
df -h: se muestra la misma información pero en unidades estándar (megas, gigas...)
top
Sirve para visualizar los procesos en ejecución en tiempo real.

free
Muestra la cantidad de memoria libre y usada que tenemos.

uname
Nos sirve para conocer la versión del kernel que tenemos instalada.
uname -a: visualiza toda la información que proporciona este comando de una sola vez.
dmidecode
Herramienta que permite conocer a fondo el hardware que compone nuestro equipo, ofreciendo información acerca del fabricante del sistema, versión del BIOS, memorias, procesador y mucha otra. Este comando valdría para una sola entrada por sí solo.

lshw
Similar al anterior, ofrece un listado de especificaciones de hardware.

hostname
Muestra o establece el nombre de la máquina.
hostame [nuevo_hostname]: para establecer un nuevo hostname (solo para la sesión actual). Hablé de ello aquí.
ifconfig
Para ver los interfaces de red instalados.

iwconfig
Para ver los adaptadores de red inalámbrica (wi-fi) instalados.

lspci
Para listar los componentes instalados tipo PCI (Peripheal Component Interconnect) como tarjetas de red, de sonido o de TV.

dmesg
Lista el búffer de mensajes del kernel relativos al arranque del sistema, depuración de aplicaciones o funcionamiento del hardware.

iwlist
Obtiene información de la red inalámbrica (wi-fi)
iwlist wlan0: informa con detalle sobre las distintas redes wi-fi detectadas por la interfaz wlan0.
lshal
Ofrece información diversa sobre el hardware y el software.

lscpu
Informa sobre la arquitectura de la CPU.

lsusb
Para ver los buses y los dispositivos USB instalados.

date
Para visualizar y cambiar la fecha y la hora del sistema.
date -d 06/15/13: cambia la fecha a mes 06, día 15, año 2013.
date -s 18:21:45:  cambia la hora a las 18 horas, 21 minutos y 45 segundos.
history
Comando que lista los últimos comandos utilizados por el usuario (por defecto, los últimos 500). Cada línea de este historial recibe un número.
$ !264: ejecuta el comando correspondiente a la línea 264 del historial de comandos.
history 5: lista los últimos 5 comandos utilizados.
history c: limpia el historial de comandos.
HISTSIZE: variable ubicada en el archivo oculto /home/usuario/.bashrc donde se establece su valor (por defecto, 500). Aquí hable de las formas de cambiar el valor de una variable.
Si antecedemos un comando con un espacio no se guarda en el historial. 
Vuelvo a advertir: aquí solo dejo constancia de algunas de las opciones (y solo en determinados casos) de que disponen los comandos. Acudan a la ayuda de man, a --help (ya saben como funciona) y a Google para encontrar más información.

Hemos hablado de como obtener información del sistema, y de golpear el sistema hablaban los legendarios Yes en esta interpretación en vivo del tema "Shock to the system" allá por 1991.



domingo, 3 de noviembre de 2013

VirtualBox sin puertos USB: solucionado

Después de cargarme el programa de arranque he optado por renovarlo todo e instalar Debian 7.2, nuevamente con GNOME como entorno de escritorio, lo cual es todo un alivio. Como novedad en esta ocasión decidí he decidido que usaré Windows a través de una máquina virtual dentro de Debian, así que instalé VirtualBox desde la línea de comandos. Una vez instalada designé Windows 7 (en mi caso, la Home Basic a 32 bits) como sistema anidado y todo fue bien salvo, como diría Rajoy, por alguna cosa: los puertos USB.

Como no me funcionaban lo primero que hice fue instalar las Guest Additions que encontraremos en el menú Dispositivos de la ventana de nuestro Windows virtual. Como aún así me seguían sin funcionar (fallo al acceder el subsistema USB) hice lo que todo buen internauta debe hacer en estos casos: navegar por la red en busca de la solución. Y (casi) nunca falla.

Abrimos la terminal y tecleamos:

paco@paco-pc:~/$ sudo nano /etc/fstab

Es decir, editamos con el editor de texto nano el fichero fstab situado en el directorio /etc. En este archivo encontramos la lista de discos y particiones disponibles. Lo que le añadiremos será lo siguiente:

#usbfs
none /proc/bus/usb usbfs devgid=46,devmode=664 0 0

Pulsamos Ctrl + o para guardar cambios y Ctrl + x para salir. A continuación tecleamos lo siguiente:

paco@paco-pc:~/$ mount -a

Con esto último lo que hacemos es montar todos los dispositivos que tenemos especificados en el fichero /etc/fstab, justo el que acabamos de modificar. Reiniciamos la máquina virtual y ahí están los dispositivos USB, listos para ser usados.

Y como hemos hablado de VirtualBox, vamos con "Man in a box", tema de 1990 a cargo de la banda de rock norteamericana Alice In Chains.


viernes, 18 de octubre de 2013

Solucionar problema con las descargas en Nicotine Plus.

Nicotine Plus es un cliente de descargas para GNU/Linux, se encuentra en los repositorios de Ubuntu y Debian y es la versión libre de Soulseek. El caso es que a veces sus descargas se quedan bloqueadas lanzándote un confuso mensaje acerca de los privilegios que dispones y de los que podrías disponer mediante una donación. No les hagan caso, todo es una cuestión de puertos abiertos o cerrados, y es lo que aquí vamos a abordar.

Para empezar hay que abrir Nicotine Plus (en adelante simplemente Nicotine) e ir al menú Edit > Opciones. Allí elegirán la primera opción de la columna de la izquierda, Servidor. Aparecerá una pantalla y debajo del nombre de usuario y la contraseña se nos facilita una dirección IP (IP address). Anótenla porque les hará falta. Cerramos y nos vamos al terminal de comandos. Allí tecleamos route y pulsamos enter; apuntamos la IP de nuestro equipo que aparece bajo Gateway (por poner un ejemplo, podría ser 189.176.0.1). Con este dato nos vamos a nuestro navegador favorito tecleamos esta IP en la barra de navegación como si fuera una dirección de internet; así entraremos en el programa de gestión de nuestro router.

Aviso que esto sirve para un router Huawei de Vodafone como este. Si hablásemos de otro modelo de router lo más probable es que este menú fuera distinto, parecido pero distinto.

Una vez dentro del programa que gestiona nuestro router nos tenemos que ir a la columna de la izquierda, al menú Router > NAT. Allí ya tengo la aplicación Nicotine, pero si no la tienen solo hay que pinchar en >Agregar e incluirla asegurándose de que el resto de opciones estén como sigue:

Protocolo: TCP+UDP
Primer puerto externo: pongamos 2320.
Último puerto externo: pongamos 2329.
IP de destino: la primera que les dije que anotaran y que cogimos de la opción Servidor de la pantalla Edit > Opciones de Nicotine.
Primer puerto interno: el mismo que el externo.
Último puerto interno: el mismo que el externo.

Recomiendo rangos de puertos pequeños como los sugeridos (2320-2329). A mí al menos me va bien así. Y recordemos que son puertos de ejemplo, ni siquiera son los que uso yo.

Cuando hayamos acabado pinchamos en >Aceptar y nos guardará los cambios. Si después nos vamos de nuevo a la columna de la izquierda, al menú Aplicaciones, y lo pinchamos nos aparecerá Nicotine como aplicación autorizada con la IP de destino asignada por nosotros.

Ahora volvemos de nuevo a Nicotine y a su menú Edit > Opciones. Entramos otra vez en Servidor y en los campos destinados al rango de puertos, debajo de Use the first available listening port for the following range: teclearíamos 2321 y 2329. No me pregunten por qué, pero hay que evitar el primer puerto del rango que hemos determinado (en nuestro caso hipotético, el 2320). El problema no se solucionaba si hacía uso de él. Pulsamos el botón de Aplicar y, aunque tras pulsar el de Check port status (estado de puertos) se me abre una página del navegador diciéndome que el puerto está CLOSED (cerrado) mis descargas vuelven a activarse, que al fin y al cabo es lo que pretendía.

Y para ilustrar musicalmente el post no se me ocurre nada especialmente apropiado más que este clásico "Cocaine" (por la similitud con Nicotine) del recientemente difunto J.J. Cale.

martes, 10 de septiembre de 2013

Los comodines en GNU/Linux

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Como en los sistemas de Microsoft en GNU/Linux también podemos utilizar métodos abreviados para introducir datos. Con los conocidos como wildcards o comodines, y vienen a ser caracteres simples que sustituyen a otros más complejos o a cadenas de estos. Todo esto se entiende mejor utilizando ejemplos.

Asterisco: *
Sustituye todos los caracteres, cero o más, a partir del comodín. Ejemplos con el comando para listar archivos y directorios ls:
ls a* : lista los archivos o directorios que empiecen con la letra a. El asterisco sustituye cualquier carácter o caracteres a continuación de la letra a.
la *a* : lista los archivos o directorios que contengan al menos una a. El asterisco sustituye cualquier carácter o caracteres que se hallen antes o después de la letra a.
Interrogante: ?
Sustituye a un solo carácter, cualquiera que sea, en la posición del comodín
ls h?r* :  lista los archivos o directorios que contengan las letras dadas y donde el segundo carácter sea cualquier letra.
Corchetes: [ ]
Sustituye a un solo carácter de una lista especificada.
[abc] : el carácter puede ser a, b ó c.
[.,_] : puede ser un punto, una coma o un guión bajo
[a-z] : puede ser cualquier letra en minúsculas.
[0-9] : puede ser cualquier número.
[a-zA-Z] : puede ser cualquier letra, mayúscula o minúscula (no olvidemos que GNU/Linux las distingue siempre). 
[a-z0-9_] : puede ser cualquier letra minúscula, cualquier número o el guión bajo.
Exclamación dentro de corchetes: [! ]
El signo de exclamación después del corchete de apertura describe un carácter que NO está en la cadena dada. En otra posición dentro de esa cadena es un carácter más.
[!0-9] : representa cualquier carácter menos un número.
[!a-zA-Z] : representa cualquier carácter que NO sea una letra. 
[0-9!] : representa cualquier número o el signo de exclamación. Al no figurar como el primer carácter de la cadena la exclamación recibe un tratamiento de carácter convencional.
Llaves: { }
Sirven para expandir palabras que contengan cadenas de texto dadas, las cuales deben ser al menos dos. Utilicemos de nuevo el comando ls:
ls pe{lota,lotero,lazo} : lista archivos y directorios que contengan en su nombre las cadenas lota, lotero y lazo con pe delante. Ojo con que no haya espacios dentro de las llaves.
echo ca{mión,mino,cerola} :  forma tres palabras uniendo ca a cada cadena contenida entre las llaves (camióncamino y cacerola).
Vamos a dejarlo para ir asimilando la información. Hoy día la banda escocesa Simple Minds está poco menos que olvidada pero en 1989 se mostraba pletórica durante la grabación en vivo de este épico "Street fighting years".


viernes, 23 de agosto de 2013

Instalar con éxito varias distribuciones Linux en un solo ordenador

Finalmente me atreví y he finalizado con relativo éxito la instalación de tres distribuciones GNU/Linux en un mismo PC en el que ya tenía Windows 7 previamente instalado. Es algo que hace tiempo perseguía y que, según lo visto por la red, no era tan sencillo como a priori parecía. Tengo que decir que no me ha resultado difícil, tan solo he respetado algunas reglas básicas que he visto recomendadas en distintos sitios.

Eso sí, advierto que la instalación que he llevado a cabo no es perfecta, y está sujeta a mejoras que los conocimientos de cada uno puedan implementar. Por adelantar algo, finalmente no dispongo de un solo directorio /home para todas las distribuciones como era mi propósito inicial, aunque supongo que eso se puede modificar con posterioridad cambiando las preferencias de usuario (aunque no he tenido tiempo de probarlo).

Valga lo que a continuación viene como orientación, repito, simple orientación, para quien quiera embarcarse en el proyecto de trabajar con varias distros Linux en un solo ordenador. Con Windows de regalo.

Empezaré contándoles que dispongo de dos discos duros, uno de 250 Gb con Windows 7 y otro de 640 Gb, que es donde pretendía instalar las distribuciones Linux. Mi idea, y así venía funcionando, era mantener completamente al margen el Windows del otro disco. La mejor y más eficaz manera de hacerlo es desenchufar físicamente el disco de 250 con Windows antes de empezar a instalar los Linux. Bien, me olvidé de este punto. Todo me funciona correctamente pero ahora Windows me aparece como una de las opciones del menú de arranque GRUB por olvidar desconectar su maldito disco duro. En fin, cuanto tenga un rato veré como muevo el menú de arranque de un disco a otro, si es posible hacerlo, para volver a aislar Windows.

Recapitulamos: disco 1 de 250 Gb con Windows 7; disco 2 de 640 Gb listo para recibir los Linux, peeeero antes hay que particionarlo. Les cuento como lo hice.

Debemos disponer de un LiveCD o USBLive que disponga de un programa tipo Partition Magic de Windows o GParted en GNU/Linux. En mi caso tenía un viejo LiveCD de Ubuntu 11.4 y el GParted que traía consigo me funcionó a la perfección. Arranqué el ordenador con él en el lector y rápidamente me puse a particionar mi disco de 640 Gb (que he dado en denominar disco 2). Así es como lo dejé: cree tres particiones primarias, una para el primer Linux, otra para el directorio /home y otra para el disco de intercambio SWAP, y una partición extendida para albergar el resto de distribuciones. Esta última la dividí en particiones lógicas, cada una de las cuales iba a contener una distribución diferente.

Esquemáticamente, así es como me quedó (recuerden, disco de 640 Gb):

1ª partición primaria: --> sdb1 -- 100 Gb -- openSUSE 12

2ª partición primaria: --> sdb2 -- 190 Gb -- /home

3ª partición primaria: --> sdb3 -- 4 Gb -- SWAP

1ª partición extendida: --> sdb4
                                         |
                                         1ª partición lógica: --> sdb5 -- 100 Gb -- Debian Wheezy 7.1

                                         2ª partición lógica: --> sdb6 -- 100 Gb -- (sin uso)

                                         3ª partición lógica: --> sdb7 -- 110 Gb -- Fedora 18

Luego la cosa no terminó así, pero básicamente estoy contento del resultado final.

No he sido original y para primera partición lógica elegí openSUSE 12. En varios lugares de la red recomiendan que en una instalación múltiple de este tipo se instale siempre esta distro en primer lugar por eventuales problemas de arranque que suceden después. Les hice caso y ahí la tengo, en mi menú del GRUB y funcionando sin problemas.

Después le tocó el turno a Fedora 18, que es la distro que más díscola se mostró en su proceso de instalación. Como partición SWAP también elegí la unidad sdb3 para no generar otra partición extendida más. Crea su propio menú utilizando el gestor de arranque GRUB 2.

Finalmente instalé Debian Wheezy en su versión 7.1, que es la distro con la que habitualmente funciono. Siguiendo este orden el instalador de Debian crea su propio menú de arranque que ya engloba todos los sistemas instalados, Windows incluido si lo encuentra.

¿Pegas? Bien, lo confieso, he tenido que repetir alguna de las instalaciones porque me liaba con las particiones, sobre todo con Fedora, que me dividía la unidad sdb7 en tres particiones lógicas. También se niega a cargar el entorno gráfico GNOME 3 por lo que tengo que teclear ALT + F2 para entrar en modo texto, introducir root como usuario, luego la contraseña establecida durante la instalación y, finalmente, el comando startx para que el escritorio y los iconos aparezcan en pantalla. Con más tiempo seguro que podré resolver este problemilla.

La instalación de openSUSE fue como la seda y no me dio ningún problema y con Debian solo tuve que reformatear la unidad sdb5 para que acogiera la nueva instalación sin protestar. Ahora cada distro tiene su propia partición /home, amén de su propia unidad raíz /. Pero está todo ordenado y localizado y podría hacerlo para que cada distro trabaje en un solo /home. Pero lo que manejo sobre todo es Debian y el resto de distribuciones las tengo para hacer probaturas nada más. Es mi primera vez y de equivocarse surgen posteriores aciertos.

Me quedó la unidad sdb6 sin darle uso. En principio estaba destinada a recibir una copia de ArchLinux pero creo que ya es bastante con lo que tengo. Todas las distribuciones corren sin problema y Windows también.

Hemos visto lo importante que es definir las particiones antes de instalar nuestras distribuciones y... a quien intento engañar. Hace varias entradas que no se me ocurre como engarzar el post con un clip musical así que lo haré de la manera que se me ocurra por absurda que resulte. Y como hablamos de particiones... pues un vídeo de los británicos Bloc Party llamado "Helicopter".


jueves, 22 de agosto de 2013

No funciona sudo en Debian 7.1 con el editor gedit

Estaba yo instalando unas aplicaciones en mi nuevo y flamante Debian Wheezy 7.1 con entorno de escritorio KDE cuando intenté editar un fichero de texto con el editor de textos en modo gráfico gedit. El propietario del archivo era root por lo que debía teclear el comando sudo antes de hacer la llamada a gedit. Este fue el resultado:

paco@paco-pc:~$ sudo gedit mifichero.txt
[sudo]   password for paco:
No protocol specified
No se puede abrir el visor:
Ejecute "gedit --help" para ver una lista completa de las acciones  disponibles de los comandos de línea.

paco@paco-pc:~$

¿Qué es esto? Nunca antes me había fallado el sudo. El caso es que si tecleo gedit mifichero.txt y pulso enter sí se abre gedit pero no se me permite realizar cambios en el archivo ya que lo abre en modo lectura. Y si pongo la terminal en modo superusuario con el comando su, tecleando a continuación la contraseña de root, obtengo el mismo resultado que al principio cuando lo intento editar.

Siempre lo digo: Internet es una joya y, casi con toda probabilidad, nada de lo que me ocurra será la primera vez que sucede, así que en un minuto tenía la solución. Hay que utilizar el comando gksu en lugar de sudo, tal que así:

paco@paco-pc:~$ gksu gedit mifichero.txt

De esta forma el archivo se abre en modo escritura que es lo que desde un principio quería. Podría haber utilizado otro editor de textos como nano pero me interesaba el modo gráfico de gedit para copiar y pegar fragmentos de texto de un sitio a otro del archivo.

Hay que decir que gksu es una herramienta que permite trabajar con aplicaciones gráficas como otro usuario, incluido el superusuario o usuario root. Aquí lo explican más al detalle para los usuarios de Ubuntu.

jueves, 15 de agosto de 2013

Terminología básica para empezar a manejarse en redes

Ya que abrí el fuego de las redes en la anterior entrada, voy a dedicar este post a listar unos cuantos términos relacionados con las redes y los servidores que conviene conocer si queremos adentrarnos en este proceloso y complejo mundillo. Son definiciones escuetas, por lo que recomiendo a quien esté interesado que las complete con la abundante documentación que podemos encontrar en la red.

Protocolo de red
Conjunto de reglas que se usan para que un elemento de red pueda acceder a diversos medios de comunicación con el fin de realizar una transmisión de datos. Estos medios pueden ser un cable de red, un switch, un router...

LAN (Local Area Network)
Son las redes de área local, por ejemplo, dos ordenadores de un mismo centro de trabajo.

WAN (Wide Area Network)
Son las redes de área amplia, como un ordenador casero en relación al del puesto de trabajo.

Protocolo TCP (Transmision Control Protocol)
Es el protocolo que define las reglas de comunicación entre dos o más ordenadores. Las conexiones mediante este protocolo se producen a través de puertos para transportar la información, fragmentándola en origen en trozos más pequeños llamados paquetes. Ya en su destino estos paquetes se reensamblan y vuelven a adoptar la forma de la información original.

Procotolo IP (Internet Protocol)
Protocolo que proporciona un direccionamiento a cada dispositivo de red, que puede ser un ordenador, un router, una impresora... para que todos ellos puedan comunicarse entre sí mediante direcciones IP, utilizándo técnicas de enrutamiento, para que los paquetes viajen de manera bidireccional entre emisor y receptor. También es capaz de homogeneizar e intercomunicar redes físicamente distintas. La versión más extendida de este protocolo es la IPv4 aunque ya existe una nueva versión mejorada, la IPv6.

Puerto
Es el identificador numérico que un dispositivo utiliza para transmitir mensajes TCP o UDP de manera que una aplicación pueda interpretarlos. Utilizando un nombre (www.google.com, por ejemplo) o una dirección IP se puede localizar un ordenador concreto dentro de Internet, pero además de eso se necesita un mecanismo que permita conectar a un servicio concreto (correo electrónico, páginas web, FTP, etc) dentro de ese ordenador. La conexión a un servicio o proceso concreto ejecutado en un ordenador se realiza especificando un nº de puerto. De tal modo, los programas de correo electrónico "escuchan" en el puerto 25 y los servidores web en el 80.

Enrutamiento
Es la función de buscar un camino entre todos los posibles en una red de paquetes.

Dirección IP
Viene a ser el DNI de cada host en una red, es una etiqueta numérica que identifica al interfaz (elemento de comunicación/conexión) de dispositivo (normalmente un ordenador) dentro de una red con protocolo IP. Está formada por cuatro bloques (octetos) de 8 bits (32 bits, 4 bytes). Un ordenador puede poseer varias direcciones IP si dispone de varios interfaces de red (conectores), caso de un router, asignando una IP a cada interfaz.

Host
Es todo equipo informático que posee una dirección IP y que se halla conectado a uno o más equipos. También es descrito comúnmente como el sitio donde reside un sitio web. Un host o anfitrión tiene una dirección IP única y un solo nombre de dominio, y puede ser un ordenador conectado a una red o una impresora.

Dominio
Es un conjunto de ordenadores conectados en una red que confían a uno de esos equipos la administración de sus usuarios y sus privilegios. También es la parte principal de una dirección en la Web que indica la organización o compañía que administra esa página.

IP estática
Es una dirección IP que no sufre variación, siempre es la misma tanto para enviar información como para recibirla.

IP dinámica
Es una dirección IP que se modifica periódicamente. Normalmente cambia con cada reinicio del router.

Máscara de red (o subred)
Es una combinación de bits que sirve para delimitar el ámbito de una red de ordenadores. Indica a cada dispositivo qué parte d la dirección IP es el nº de la red, incluyendo la subred, y qué parte le corresponde al host. Si el router tiene la dirección IP 192.168.1.1 y la máscara de red 255.255.255.0 entiende que todo lo que se envía a una dirección IP que empieza por 192.168.1 va a parar a la red local, mientras que lo que va a otras direcciones IP, para afuera de esa red local (a otra red más grande o a Internet).

Puerta de enlace o Gateway
Es un dispositivo que permite interconectar redes con protocolos y arquitecturas diferentes a todos los niveles de comunicación. Traduce la información del protocolo de la red de origen para que sea entendida en la red de destino. En entornos domésticos son los routers los que actúan como gateways, conectando la red doméstica con Internet.

Broadcast
Difusión en español, es una forma de transmisión de información donde un nodo emisor envía información a una multitud de nodos receptores al mismo tiempo, sin necesidad de repetir la transmisión nodo a nodo.

Protocolo UDP (User Datagram Protocol)
Es una alternativa al protocolo TCP que trata los datos en forma de datagramas (técnica para encaminar paquetes en una red en la que cada uno de ellos es tratado de manera independiente) que luego son enviados. Es un protocolo basado en el trabajo sin conexión, por lo que ejerce una menor carga en la red aunque resulta menos fiable.

Protocolo ICMP (Interner Control Message Protocol)
Este es un protocolo empleado para enviar mensajes de error o mensajes con información de control. Tiene un comando muy habitual como es ping, que básicamente nos dice si un equipo responde a una llamada de comunicación.

Protocolo DHCP (Dynamic Host Configuration Protocol)
Es el protocolo empleado por los hosts para obtener información de forma dinámica a través de un servidor que tenga implementado este protocolo. Se podrán obtener datos como la dirección IP, la máscara de red, la dirección de broadcast, datos de configuración DNS,...

DNS (Domain Name System)
Es un sistema de nomenclatura jerárquica para ordenadores o sistemas conectados a Internet o a una red privada. Un servidor DNS es una máquina capaz de convertir un nombre de dominio (por ejemplo, www.google.com) en la dirección real de la máquina donde se aloja, esto es, su dirección IP. Cuando entramos en www.google.com el navegador conecta con el servidor DNS del sistema operativo para que le comunique cual es la dirección real de Google (en caso de no encontrarla se conecta con otros servidores DNS). El servidor DNS comprobará su dirección IP y se la transmite al navegador, que devolverá en pantalla la página web de Google.

Protocolo NFS (Network File System)
Es un protocolo que permite el acceso a nuestro ordenador de cualquier otro equipo que esté compartiendo información bajo este protocolo, a la cual se puede acceder como si se entrara en los directorios de nuestro disco duro. En este sistema existen dos partes: el servidor, que es el que comparte información, y el cliente, que es el que desea acceder a dicha información de forma remota.

Protocolo SFTP (SSH File Transfer Protocol)
Protocolo que permite la transferencia y manipulación de archivos entre ordenadores a través de las direcciones IP. Funciona mediante el software SSH (Secure SHell) que facilita el acceso a máquinas remotas desde una red.

FTP (File Transfer Protocol)
Protocolo de red para la transferencia de archivos entre sistemas conectados a una red TCP. Permite que un equipo cliente se pueda conectar a un servidor y descargar archivos desde él o enviárselos, al margen de los sistemas operativos presentes en ambos.

Protocolo Telnet
Protocolo basado en el TCP que dispone de su propio interfaz de usuario y sirve para conectarse a un equipo remoto y comunicarse con él, también al margen de los sistemas operativos.