Linux
R e v i s i n a b r i l / 2 0 1 4
Agradezco a todos quienes entienden
la colaboracin y el trabajo colectivo
como actos profundamente humanos
Diciembre/201
Contenido
!" !ntroduccin""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""2
!!" Distribuciones"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#
!!!" $ntornos gr%ficos y modo consola"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#
!&" 'rganizacin de particiones y el sistema de archivos"""""""""""""""""""""""""""""""""(
&" )omandos b%sicos"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""10
&!" *ermisos""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""1(
&!!" $ditor +vi+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""1,
&!!!" $mpaquetar y comprimir""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""1-
!." /ed y acceso remoto"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""1-
." Analizando registros y procesos""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""2#
.!" 0hell scripts con bash""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""2-
.!!" Demonios y servicios1 crontab"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.!!!" Autoevaluacin"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""2
1
I. Introduccin
Hace ya unas tres dcadas que existe el software libre. Para entender cmo ha llegado a estar en
la cresta de la ola en la industria de la computacin conviene repasar sus inicios histricos.
A finales de la dcada del ! y principios de los "! no exist#a una industria de software
reconocida$ los fabricantes de computadores vend#an sus enormes m%quinas incorpor%ndoles alg&n
tipo de sistema operativo y aplicaciones. 'sos programas pod#an ser tomados y estudiados en las
universidades$ los usuarios pod#an pedir el cdigo fuente de controladores de dispositivos y de los
programas para adaptarlos a sus necesidades. 'l software no ten#a valor en s# mismo si no estaba
acompa(ado por el hardware que lo soportaba.
'n estas condiciones en los famosos laboratorios )ell de A*+*$ dise(aron un sistema operativo
llamado ,nix$ que se caracteri-aba por una buena gestin de los recursos del sistema en un entorno
multiusuario$ estable y compatible con el hardware de diferentes fabricantes. siendo esto <imo
algo que a la postre le proporcion mucha popularidad.
/in embargo$ ya desde 10"1 la empresa 2)3 de4 de dar el cdigo fuente de su sistema
operativo$ a finales de los setenta 5igital comen- a comerciali-ar su software. 6as compa(#as
hab#an tomado conciencia de que el software pod#a rendirles incalculables beneficios si su cdigo
fuente era escondido ba4o siete llaves.
'n esos a(os un inform%tico del 32*$ llamado 7ichard /tallman se indign al comprobar que
cada ve- era m%s dif#cil conseguir el cdigo fuente de los programas que utili-aba para adaptarlos a
sus necesidades. 6a ancdota es que se eno4 cuando la compa(#a que les hab#a vendido una nueva
impresora para el laboratorio no le quiso facilitar el cdigo fuente de los drivers. resulta que l slo
quer#a modificarlos para que le avisara autom%ticamente cuando se atascaba el papel.
A partir de ah# /tallman decidi iniciar un proyecto para abrir el cdigo fuente de los programas.
5icho proyecto tom el nombre 89,$ que significa algo as# como 9ot ,nix. : desde sus inicios
qued claro que no deb#a confundirse el concepto de software libre con el de software gratuito.
9ace entonces la ;/; <;ree /oftware ;oundation=$ donde se habla m%s de filosof#a que de
ingenier#a. 's esta fundacin la que estableci las siguientes cuatro libertades para definir el
software libre>
1> 6ibertad de poder utili-ar el programa para cualquier propsito.
?> 6ibertad para estudiar cmo funciona un programa y adaptarlo a las necesidades propias.
'sta libertad se asegura accediendo al cdigo fuente.
@> /e permite distribuir libremente copias del software$ ayudando a quien lo necesite.
A> Por <imo$ se permite me4orar el programa y hacer p&blicas dichas me4oras$ en beneficio de
toda la comunidad. Btra ve-$ el acceso al cdigo fuente es requisito para asegurar esta
libertad.
'stas libertades se aseguran utili-ando una licencia creada especialmente$ la 8P6 <8eneral
Public 6icense=. 'sta licencia ha tenido una evolucin constante y se ha ramificado para atender
todo tipo de situaciones no contempladas inicialmente.
5esde 10CA$ la comunidad creada entorno a las ideas de /tallman comen- a producir software y
a licenciarlo con la 8P6. )uscaban crear un sistema operativo parecido a ,nix y que siguiera las
normas PB/2D <Portable Bperating /ystem 2nterface=. fueron de4ando para el final la tarea de
dise(ar y escribir el n&cleo del sistema operativo.
'n 10C"$ el profesor holands Andrew *anenbaum decidi escribir un sistema operativo para que
sus estudiantes pudieran estudiarlo. :a no pod#a utili-ar el cdigo fuente del ,nix de A*+* y creo
?
el sistema llamado 3292D$ con una arquitectura microEFernel$ altamente modulari-ado. Por <imo$
en 1001 6inus *orvalds toma la posta$ bas%ndose en una cr#tica al funcionamiento de 3292D y
proponiendo un n&cleo monol#tico con la ayuda de muchos inform%ticos de todo el mundo.
'n definitiva$ lo que conocemos hoy se denomina 89,G6inux$ donde 6inux es el Fernel del
sistema operativo y el proyecto 89, ha aportado mucho de la estructura que permite su
funcionamiento> la mayor#a de los mdulos para dispositivos.
Ahora existen distribuciones de 89,G6inux para toda clase de dispositivos$ no solo
computadores. 5e las distribuciones para PHIs y servidores vale la pena nombrar a las m%s
conocidas y utili-adas empresarialmente> 5ebian 89,G6inux$ /u/' 6inux$ 7edHat 6inux$ 6inux
3int <basado en 5ebian=$ ,buntu$ etc.
Notas:
1. 'n este curso y para usar 6inux a futuro$ no hay que tenerle alergia a los manuales. Juienes
tengan la paciencia y curiosidad suficientes para investigar por su cuenta$ sumando el modesto
aporte de este cursillo$ es f%cil que lleguen a enamorarse de 6inux.
?. ,n aporte muy interesante para complementar esta introduccin puede apreciarse viendo la
pel#cula I7evolution B/I$ en http>GGwww.youtube.comGwatchKvL/-MEdENdr3,
@
II. Distribuciones
<de OiFipedia= ,na distribucin 6inux <coloquialmente llamada distro= es una distribucin de
software basada en el n&cleo 6inux que incluye determinados paquetes de software para satisfacer
las necesidades de un grupo espec#fico de usuarios$ dando as# origen a ediciones domsticas$
empresariales y para servidores. Por lo general est%n compuestas$ total o mayoritariamente$ de
software libre$ aunque a menudo incorporan aplicaciones o controladores propietarios.
Adem%s del n&cleo 6inux$ las distribuciones incluyen habitualmente las bibliotecas y
herramientas del proyecto 89, y el sistema de ventanas D Oindow /ystem. 5ependiendo del tipo
de usuarios a los que la distribucin est dirigida se incluye tambin otro tipo de software como
procesadores de texto$ ho4a de c%lculo$ reproductores multimedia$ herramientas administrativas$ etc.
'n el caso de incluir herramientas del proyecto 89,$ se utili-a el trmino distribucin 89,G6inux.
'xisten distribuciones que est%n soportadas comercialmente y distribuciones mantenidas por la
comunidad$ como 5ebian. 'n la actualidad$ gracias a la modularidad inherente a este sistema
operativo$ se puede afirmar que existe una distribucin especiali-ada para cada necesidad
identificable de uso de un /B. 6a computacin en la nube ha incentivado la creacin de
distribuciones especiali-adas conocidas como IappliancesI. 'sto originalmente se refer#a a un
dispositivo de hardware conteniendo una serie de funciones o aplicaciones de software que
originalmente hayan sido creadas para ser instaladas en sistemas operativos de propsito general$
sin embargo hoy identifica$ por e4emplo$ algo muy similar al archivo de m%quina virtual con 6inux
3int instalado y preparado para este curso.
3%s informacin> http>GGdistrowatch.comGdwres.phpKresourceLma4or+languageL'/
III. Entornos grficos y modo consola
<de OiFipedia= 89,G6inux puede funcionar tanto en entorno gr%fico como en modo consola. 6a
consola es com&n en distribuciones para servidores$ mientras que la interfa- gr%fica est% orientada
al usuario final tanto de hogar como empresarial. Asimismo$ tambin existen los entornos de
escritorio$ que son un con4unto de programas conformado por ventanas$ iconos y muchas
aplicaciones que facilitan la utili-acin del computador. 6os escritorios m%s populares en
89,G6inux son> 89B3'$ M5'$ 6D5' y Dfce. 'n dispositivos mviles se encuentra Android$ que
funciona sobre el n&cleo 6inux$ pero no usa las herramientas 89,.
PPor qu usar la consolaK
6a consola permite un mayor grado de funciones y configuracin de lo que queremos hacer con
una aplicacin o accin en general respecto del entorno gr%fico. A Qgrosso modoR$ se tiene un
mayor control sobre el equipo.
'n 89,G6inux la consola es algo necesario. Acciones para dar o quitar permisos$ configurar e
instalar controladores que no estn empaquetados y puedan ser e4ecutados por un instalador$ matar
procesos de una manera m%s efectiva$ e4ercer como superusuario cuando se est% en una cuenta
cualquiera del equipo y muchas acciones m%s$ algunas de las cuales se ver%n a lo largo de este curso
y otras que se podr%n descubrir consultando los manuales que correspondan.
6a consola de texto nos puede salvar de muchas situaciones dif#ciles>
9os va a permitir hacer cosas que no es posible reali-ar en modo gr%fico.
A
Sa a haber determinadas situaciones en las que puede ser m%s sencillo escribir una l#nea de
comandos en una consola que mane4ar una comple4a herramienta gr%fica.
Huando el sistema gr%fico falle la consola de texto va a seguir funcionando.
,na conexin remota siempre ser% m%s sencilla y eficiente si la reali-amos directamente a la
consola de comandos$ sin utili-ar un entorno gr%fico.
'n la consola de texto$ el llamado intrprete de comandos es la interfa- entre el usuario y el
sistema operativo. 'n realidad$ la shell es un archivo e4ecutable que debe interpretar los comandos$
trasmitirlos al sistema y devolver su resultado. 'xisten varias shells$ las m%s comunes son sh
<)ourne shell=$ bash <)ourne again shell=$ csh <H shell=$ entre otras. 6a shell predeterminada en casi
todas las distribuciones 6inux es IbashI.
A cada usuario se le asigna una shell al momento de su creacin en el sistema. 6a shell se inicia
luego de leer su configuracin completa que se distribuye en por lo menos dos archivos$ uno
general que estar% en el directorio Getc y otro oculto en el directorio particular del usuario
<GetcGbash.bashrc y GTHB3'G.bashrc$ para el caso del shell bash=.
'n cuanto al modo gr%fico$ D Oindow es el entorno gr%fico habitual de los sistemas ,nix <es el
shell gr%fico por excelencia=. 'l sistema D Oindow se compone de dos partes principales> el
servidor D y el programa para la gestin de las ventanas. 'l servidor D es el programa que se
encarga realmente de dibu4ar en la pantalla. Por el contrario el gestor de ventanas$ como su nombre
indica$ es el encargado de crear las ventanas y gestionar su apariencia. 5ebido a este modelo$ la
apariencia de las aplicaciones var#a seg&n se use uno u otro gestor de ventanas u escritorio.
3%s informacin> http>GGwebubuntu.wordpress.comG?!1!G1?G@1GentornosEgraficosEmasEusadosEenEgnulinuxG
IV.Organizacin de particiones y el sistema de arci!os
6os dispositivos de almacenamiento son organi-ados en el sistema dentro de un directorio
especial del mismo$ llamado Gdev <de la palabra IdeviceI=. /e crean aqu# las entradas para todos los
dispositivos registrados del equipo.
A continuacin$ una lista del esquema b%sico de nomenclatura>
6a primera unidad de disco /H/2$ </A*A$ /A/= se llama GdevGsda.
6a segunda unidad de disco /H/2 </A*A$ /A/= se llama GdevGsdb$ y as# sucesivamente.
6a primera unidad de un H5E7B3 /H/2 se llama GdevGscd!$ tambin conocida como GdevGsr!.
'l disco maestro en el controlador 25' primario se llama GdevGhda.
'l disco esclavo en el controlador 25' primario es llamado GdevGhdb.
6as particiones en cada disco son representadas a(adiendo un n&mero decimal al nombre del
disco> sda1 y sda? representan a la primera y segunda particin en la primera unidad de disco /H/2
en el sistema.
Aqu# un e4emplo de un caso real> supongamos que tiene un sistema con ? discos /A*A$ uno en el
conector identificado como ?do. y el otro en el marcado como Ato. 'l primer disco <en el conector
?= se llama entonces sda$ y el segundo sdb. /i el dispositivo sda tiene @ particiones$ stas se
llamar%n sda1$ sda?$ y sda@ respectivamente. 6o mismo se aplica a el disco sdb y sus particiones.
Actualmente esta nomenclatura est% siendo sustituida por un ,,25 <,niversally ,nique
2dentifier=$ porque as# se tiene un identificador &nico y no centrali-ado de cada particin y de cada
1
disco f#sico. considerando diferentes m%quinas$ se tiene un identificador que nunca cambia$ a no ser
que la particin sea reformateada. 6a asignacin de nombres puede cambiar de acuerdo a la
posicin del disco en el bus de conexin de la controladora y puede cambiar tambin cuando se lo
conecta a otro equipo.
Opciones de particionado
Hay muchas opciones para las particiones que se pueden definir en el almacenamiento que
contendr% un sistema 6inux. 6a eleccin va a depender del uso que se le dar% al mismo. 9os
referiremos a lo m%s com&n en los sistemas de archivo de tipo ext@ o extA$
Para una instalacin de servidor$ en general se recomienda un m#nimo de tres particiones$ a
saber>
Gboot 7equiere de ?!! a 11? 3).
swap Para sistema con hasta ? 8) de memoria 7A3$ se debe asignar el doble del tama(o de la
7A3 f#sica. /i se tiene m%s de ? 8)$ se debe asignar una cantidad igual al tama(o de la
7A3 f#sica m%s ? 8). Para cantidades de 7A3 mayores a C 8)$ aproximadamente$
podr#a ser conveniente no superar esa cantidad de gigabytes en el tama(o de swap. aqu#
podr#a comen-ar a 4ugar en contra la velocidad de acceso a disco del equipo.
'sta deber#a ser siempre la primera o la <ima particin del espacio disponible para
almacenamiento y 4am%s se le asigna un punto de monta4e.
G 'sta ser% la particin conocida como Ira#-I$ en la que estar% instalado el sistema operativo
organi-ado en un sistema de archivos que conoceremos m%s adelante. 'n la actualidad$ un
sistema m#nimo de servidor$ con entorno gr%fico instalado$ va a necesitar entre 1! y 1? 8)
's posible y conveniente definir otras particiones con el fin de aislar la instalacin del software
que va a correr en el servidor. Por e4emplo$ es com&n destinar el directorio Gopt como punto de
monta4e de una particin que contenga aplicaciones como *omcat$ Apache$ 3y/J6$ etctera.
*ambin es com&n asignar un directorio exclusivo para el monta4e de las particiones que van a
contener IdatafilesI de una base de datos.
Asimismo$ en una instalacin de escritorio es recomendable aislar en una particin los datos de
los usuarios$ montando la misma en el directorio Ghome$ que es el lugar donde se crean los
directorios particulares de los usuarios.
Jerarqua del sistema de archivos
*odo surge a partir del directorio ra#- <G=. 'l contenido de este directorio debe ser el adecuado
para reiniciar$ restaurar$ recuperar yGo reparar el sistema$ es decir$ debe proporcionar mtodos$
herramientas y utilidades necesarias para cumplir estas especificaciones.
Adem%s$ es deseable que se mantenga los m%s ra-onablemente peque(o como sea posible por
cuestin de funcionamiento y de seguridad.
Por <imo$ este debe que ser el &nico directorio en el nivel superior del %rbol 4er%rquico de
archivos y$ tiene que ser imposible moverse m%s all% del mismo.
Contenido del directorio raz:
Gbin 'n este directorio se ubica el cdigo binario o compilado de los programas y
comandos que pueden utili-ar todos los usuarios del sistema.
comandos bash
}
'l comando unset -f nombrefn$ borra la funcin de la memoria y con declare -f podemos
acceder a un listado de ls funciones definidas en una sesin. 6as funciones tambin pueden definirse
al inicio de un script$ para luego ser invocadas en el cdigo.
@!
)ash utili-a variables del tipo cadena de caracteres$ como tipo por defecto. Por convencin se
utili-an en may&scula las variables de entorno exportadas y las que no exportamos$ en min&scula.
'n general$ un script recibe argumentos$ que son tratados como par%metros posicionales. /us
nombres son 1$ ?$ ...n$ por lo cual nos referimos a ellos como T1$ T?$ ...$ Tn. 'l par%metro posicional
! almacena el nombre del script que se e4ecuta.
6as variables T^ y Tf nos devuelven los argumentos recibidos por el script o funcin$ difiriendo
en el tratamiento que se obtiene cuando se pasan entrecomillados a una funcin. Por otra parte$ la
variable T] nos informa la cantidad de argumentos pasados al script. Seamos un e4emplo>
$ vi recibir.sh
#!/bin/bash
#Ejemplo de script que recibe parametros y los imprime
echo "El script $0 recibe $# argumentos: $*"
#Usamos el Internal Field Separator para cambiar el espacio por una coma
IFS=','
echo "El script $0 recibe $# argumentos: $@"
$ chmod +x recibir.sh
$ ./recibir Param01 Param02 Ultimo03
el resultado ser% algo similar a las dos l#neas siguientes>
$ El script recibir.sh recibe 3 argumentos: Param01 Param02 Ultimo03
$ El script recibir.sh recibe 3 argumentos: Param01,Param02,Ultimo03
,saremos de cuando se deban resolver ambiggedades con respecto al nombre de una variable.
,n nombre se transforma en ambiguo si va seguido por una letra$ d#gito o guin ba4o. 'l caso m%s
com&n es cuando tenemos que referirnos al dcimo par%metro del script$ T1! nos devolver% el
contenido de la primera variable con un ! concatenado$ para obtener el valor correcto debemos
escribir Td1!e.
Por <imo$ vemos la sustitucin de comandos. 'sta caracter#stica nos permite usar la salida de
un comando como si fuera el valor de una variable> T<comando=. *ambin se utili-an los tildes hacia
atr%s para lograr este efecto> varLhcomandoh.
e) !ontrol de $luo
Homo todo lengua4e de programacin$ bash tiene estructuras de control <if$ else$ for$ while$ until$
case y select=. 7evisaremos su sintaxis.
e.1= if$ elif y else
6a sentencia condicional tiene cualquiera de los dos formatos siguientes>
if condicion
then
sentencias
elif condicion
then
sentencias
else
sentencias
fi
if condicion ; then
sentencias
elif condicion ; then
sentencias
else
sentencias
fi
e.?= Hdigos de terminacin. 6os comandos dise(ados con proli4idad siempre deben terminar
devolviendo un cdigo de finali-acin <exit status= que indica si el comando tuvo xito o no.
Aunque no es obligatorio$ normalmente un cdigo de terminacin ! significa terminacin correcta y
@1
un cdigo entre 1 y ?11 corresponde a posibles salidas por error.
6a sentencia IreturnI permite retornar un valor al final de la e4ecucin de un script$ si no se
proporciona$ devolver% el cdigo de terminacin del <imo comando e4ecutado. 'sta sentencia
puede ser e4ecutada solo dentro de funciones y en scripts que se e4ecuten con el comando IsourceI.
6a sentencia IexitI$ sin embargo$ puede ser e4ecutada en cualquier l#nea y lo que provoca es el
abandono del script$ devolviendo o no un cdigo de retorno si se lo proporciona.
/i se lee la variable especial K$ 4usto despus de la e4ecucin de un comando$ se obtendr% en ella el
cdigo de finali-acin del mismo$ que podr#a guardarse haciendo$ por e4emplo> ctLTK.
Semos una tabla con los operadores de comparacin de cadenas m%s utili-ados>
Operador Verdadero si ...
str1 = str2 Las cadenas son iguales
str1 != str2 Las cadenas son distintas
str1 < str2 str1 es menor lexicogrficamente a str2
str1 > str2 str1 es mayor lexicogrficamente a str2
-n str1 str1 es no nula y tiene longitud mayor a cero
-z str1 str1 es nula (tiene longitud cero)
6os n&meros enteros tambin se pueden comparar como tales$ seg&n la tabla siguiente>
Operador Verdadero si ...
-lt Less Than
-le Less than or Equal
-eq EQual
-ge Greater than or Equal
-gt Greater Than
-ne Not Equal
Para comprobar m%s de una condicin$ se pueden utili-ar los operadores lgicos ++$ ZZ y _$
encerrando cada condicin entre parntesis rectos$ WX. Seamos algunos e4emplos>
if [ $var = 'pepe' ] && [ $par -le 5 ]; then ...
# Dentro de una condicin los operadores lgicos cambian,
# se debe utilizar -a (para and) y -o (para or)
if [ $reintegro -le $saldo -a $reintegro -le $max_caja ]
# Para usar parntesis debemos incorporar caracteres de escape:
if [ \( $reintegro -le $saldo \) -a \( $reintegro -le $max_cajero \) ]
A continuacin veremos un listado con los operadores de comparacin de atributos de archivo>
Operador Verdad si:
-d archivo archivo existe y es un directorio
-e archivo archivo existe
-f archivo archivo existe y es un archivo regular
-h archivo archivo existe y es un enlace simblicos
-N archivo archivo existe y fue modificado desde la ltima lectura
-r archivo archivo existe y tenemos permiso de lectura
-s archivo archivo existe y no esta vaco
-w archivo archivo existe y tenemos permiso de escritura
-x archivo archivo existe y con permiso de ejecucin (o bsqueda si es directorio)
archivo1 -nt archivo2 archivo1 es ms reciente que archivo2 (newer than)
archivo1 -ot archivo2 archivo1 es ms antiguo que archivo2 (older than)
archivo1 -ef archivo2 archivo1 y archivo2 son el mismo archivo (equal file)
e.@= 'l bucle for
'ste bucle es como un Ifor eachI$ dado que no procesa un contador sino que se tratan las palabras
de una frase una a una. /u sintaxis es la siguiente>
@?
for var [in lista]
do
...
sentencias usando var
...
done
e.A= )ucles while y until
/u sintaxis es>
while comando
do
...
done
until comando
di
...
done
'n este caso el comando tambin puede ser una condicin encerrada entre WX.
e.1= 6a sentencia case
'n bash se puede hacer una comparacin de padrones con la cadena a examinar en un case$ la
sintaxis es la siguiente>
case cadena in
patron1)
sentencias ;;
patron2)
sentencias ;;
...
esac
Hada patrn puede estar formado por varios patrones separados por el car%cter Z. Huando cadena
cumple alguno de los patrones$ se e4ecutan sus correspondientes sentencias.
$) !omandos internos
5e los comandos internos del bash$ nos interesa mencionar por lo menos la existencia de los
siguientes>
echo$ printf$ read$ command$ enable$ test$ pwd$ exec$ fg$ export$ Fill$ 4obs
%II. Demonios y ser!icios) crontab
a) %aemons" servicios
,n daemon <5isF And 'xecution 3B9itor= es un proceso que$ generalmente$ tenemos cargado
en memoria$ esperando alguna se(al <proveniente de una interrupcin de dispositivo o del mismo
n&cleo= para despertarse y e4ecutar las funciones necesarias para tratarla. Aunque esta definicin
tambin puede incluir a otros procesos del sistema <lan-ados por los usuarios o por el mismo
sistema=$ un daemon tambin suele a4ustarse a esta forma de e4ecucin <aunque en algunos casos
especiales$ no=. 5e esta forma$ los daemons que tengamos cargados no ocupan la HP, mientras no
es estrictamente necesario y por muchos que tengamos en memoria siempre podremos traba4ar con
el ordenador sin problemas.
,n demonio <mala traduccin de la palabra original=$ en resumen$ es un programa que se e4ecuta
de forma autom%tica$ por regla general$ al iniciarse el sistema y que reali-a una tarea determinada$
sin intervencin del usuario. /e e4ecuta en segundo plano y por lo general solo se puede detener por
@@
intervencin directa del administrador o del usuario que lo inici.
6os demonios se inician o se paran mediante un shell script. 'stos se deben colocar en la carpeta
IGetcGinit.dI y respetan cierta estructura para poder ser mane4ados por utilidades especiali-adas del
sistema.
Por h%bito los scripts que mane4an los demonios del sistema responden$ como m#nimo$ a las
siguientes rdenes>
Iniciar el demonio: /etc/init.d/<nombre_demonio> start
Parar el demonio: /etc/init.d/<nombre_demonio> stop
Consultar el estado: /etc/init.d/<nombre_demonio> status
,n e4emplo conocido es cuando disponemos de un servidor de base de datos 3y/J6 en el
sistema. 6as rdenes necesarias para arrancarlos$ pararlo$ reiniciarlo y consultar su estado$ ser#an las
siguientes>
# /etc/init.d/mysql start
# /etc/init.d/mysql stop
# /etc/init.d/mysql restart
# /etc/init.d/mysql status
'n la mayor#a de los sistemas$ actualmente$ existe el comando IserviceI$ con el cual se puede
escribir lo anterior como sigue>
# service mysql start
# ..
6os demonios pueden iniciarse manualmente$ como acabamos de ver$ pero tambin pueden
hacerlo de forma autom%tica. Hay que tener en cuenta en qu niveles de e4ecucin van a actuar. 6os
demonios se podr%n e4ecutarGparar en los IrunlevelsI que nosotros queramos.
Para consultar el nivel en que nos encontramos existe la orden IrunlevelI. 'n general los niveles
del sistema son los siguientes>
0 - Halt. Detener el sistema
1 - Single-User Mode. Para tareas administrativas.
2 - Multi-User Mode. Sin servicios de red.
3 - Multi-User Mode with Networking. Inicio normal del sistema.
4 - Not used/User-definable. Para propsitos especiales.
5 - X11 o GUI. Entorno grfico.
6 - Reboot. Reiniciar el sistema.
Seremos ahora cmo crear un demonio sencillo. 6o primero que necesitamos es el script que se
encargar% de iniciar o detener el proceso>
#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=[el ejecutable]
DAEMON_OPTS='opciones'
NAME=miscript
PIDFILE="/var/run/${NAME}.pid"
QUIET="--quiet"
START_OPTS="--start ${QUIET} --background --make-pidfile --pidfile ${PIDFILE} --exec $
{DAEMON} ${DAEMON_OPTS}"
STOP_OPTS="--stop --pidfile ${PIDFILE}"
OWNER=admin
LOGDIR=/var/log/${NAME}
test -x $DAEMON || exit 0
# SI NO EXISTE EL DIRECTORIO LOG, LOS CREAMOS
if [ ! -d "$LOGDIR" ]; then
mkdir -m 750 $LOGDIR
chown $OWNER:$OWNER $LOGDIR
fi
@A
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
su -c $DAEMON $START_OPTS
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
su -c $DAEMON $STOP_OPTS
echo "$NAME."
rm $PIDFILE
;;
restart|force-reload)
echo -n "Restarting $DESC: "
su -c $DAEMON $STOP_OPTS
sleep 1
su -c $DAEMON $START_OPTS
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
6a variable 9A3' se deber% igualar al nombre del script y la variable 5A'3B9 al nombre del
e4ecutable o script a mane4ar como servicio. 'n la variable 6B8527 pondremos el directorio donde
quedar%n los archivos de log que use el script. 's un buena idea utili-ar GvarGlogG.
P25;26' ser% el archivo donde quedar% el identificador de proceso del demonio. Al igual que
6B8527$ es una buena idea el situarlo en GvarGrunG. BO9'7$ es el usuario due(o del proceso. /i
queda en IrootI solo el administrador podr% iniciar o parar el demonio.
6uego de construirlo$ se debe guardar en la carpeta GetcGinit.dG$ con permisos de e4ecucin>
chmod u+x /etc/init.d/miscript
Hon esto ya se puede iniciar el demonio con la orden> /etc/init.d/miscript start
,nos p%rrafos m%s atr%s nos refer#amos a los niveles de e4ecucin o IrunlevelsI. Para que un
demonio se inicie de forma autom%tica en uno u otro nivel est%n las carpetas GetcGrc<nivel=.d$ donde
<nivel= es el n&mero que identifica un nivel de e4ecucin. 6os demonios que deban iniciarse al
iniciar el entorno gr%fico D11$ que corresponde al nivel 1$ se deber#an situar en la carpeta
GetcGrc1.dG. Para esto se deber% crear un enlace al script de inicioGparada situado en GetcGinit.dG. :
tambin deber% existir un enlace que posibilite la accin de IstopI sobre el demonio cuando el
sistema entra en los niveles de e4ecucin ! y <apagar y reiniciar=.
/i nos referimos al script de e4emplo$ ImiscriptI$ deber#amos crear los siguientes enlaces>
# ln -s /etc/init.d/miscript /etc/rc5.d/S99miscript
# ln -s /etc/init.d/miscript /etc/rc6.d/K01miscript
# ln -s /etc/init.d/miscript /etc/rc0.d/K01miscript
6a I/I o la IMI indican si el demonio se inicia o se para <start$ Fill=. 6a numeracin es la indicacin
de en qu momento se reali-ar% la accin en relacin al resto de los scripts cuyos enlaces est%n
tambin en esos directorios <!! es la m%xima prioridad y 00 la <ima=.
,n comando muy cmodo para utili-ar en estos casos es IchFconfigI$ con el cual se puede
instalar un script como daemon y$ adem%s$ activarlo o desactivarlo.
@1
a) !ron" !rontab
IcronI es el nombre del programa que permite a usuarios 6inuxG,nix e4ecutar autom%ticamente
comandos o scripts <grupos de comandos= a una hora o fecha espec#fica. 's usado normalmente
para comandos de tareas administrativas$ como respaldos$ pero puede ser usado para e4ecutar
cualquier orden$ incluso haciendo persistente su e4ecucin peridica. 'n definitiva$ IcronI es un
demonio que e4ecuta programas agendados.
'n pr%cticamente todas las distribuciones de 6inux se encuentra preinstalada una versin de
IcronI. 2gualmente es interesante se(alar que existe otro comando$ IatI$ que se puede utili-ar para
e4ecutar una orden a una hora espec#fica$ su diferencia con el demonio IcronI es que no es
persistente.
IcronI es un demonio <servicio=$ esto significa que solo requiere ser iniciado una ve-$
generalmente con el mismo arranque del sistema. 'l servicio de IcronI se llama IcrondI. Podemos
comprobar la disponibilidad de IcronI en el sistema de varias maneras>
# /etc/rc.d/init.d/crond status
# /etc/init.d/crond status
crond (pid 507) is running...
# service crond status
crond (pid 507) is running...
# ps -ef | grep crond
(si por alguna razn, cron no esta funcionando, hacemos:)
# /etc/rc.d/init.d/crond start
Starting crond: [ OK ]
(si el servicio no estuviera configurado para arrancar desde un principio, bastara con
gregarlo con el siguiente comando:)
# chkconfig --level 35 crond on
$ormas de usar %cron%
Hay tres maneras distintas de usarlo. 6a primera es utili-ando los directorios previstos para
e4ecuciones peridicas$ que se encuentran en Getc>
cron.hourly
cron.daily
cron.weekly
cron.monthly
/i se coloca un archivo tipo script en cualquiera de estos directorios$ entonces el script se
e4ecutar% cada hora$ cada d#a$ cada semana o cada mes$ dependiendo del directorio.
Para que el archivo pueda ser e4ecutado por el e4ecutable IcrondI$ tiene que ser algo similar a lo
siguiente>
#!/bin/sh
#script que genera un respaldo
cd /usr/documentos
tar czf * respaldo
cp respaldo /otra_directorio/.
'ste script debe ser e4ecutable$ por lo tanto$ si lo llamamos Irespaldo.shI$ tendr#amos que darle
permisos de e4ecucin>
# chmod 700 respaldo.sh
'ste permiso es de e4ecucin para el propietario del archivo$ en este caso solo IrootI podr%
e4ecutarlo porque es el usuario que est% e4ecutando el demonio IcrondI.
@
/i el script lo de4amos en el directorio GetcGcron.hourly$ etonces se e4ecutar% cada hora con un
minutos$ de todos los d#as.
'l segundo modo de e4ecutar o usar cron$ afectando a todos los usuarios del sistema$ es a travs
de manipular directamente un archivo que es consultado por IcrondI. 'n la mayor#a absoluta de las
distribuciones 6inux$ ese archivo se llama IcrontabI y se encuentra en Getc. 'n general su contenido
es como las siguientes l#neas>
#> cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
6as primeras cuatro l#neas son variables que indican lo siguiente>
/H'66 es el IshellI ba4o el cual se e4ecuta el IcronI. /i no se especifica$ se tomar% por defecto el
indicado en la l#nea correspondiente al usuario que este e4ecutando IcronI.
PA*H contiene o indica la ruta a los directorios en los cuales IcronI buscar% el comando a e4ecutar.
'ste path es distinto al path global del sistema o del usuario.
3A26 *B es a quien se le env#a la salida del comando <si es que este tiene alguna salida=. IcronI
enviar% un correo a quien se especifique en este variable$ es decir$ debe ser un usuario v%lido del
sistema o de alg&n otro sistema. /i no se especifica$ entonces IcronI enviar% el correo al usuario
propietario del comando que se e4ecuta.
HB3' es el directorio ra#- o principal del comando IcronI$ si no se indica entonces$ la ra#- ser% la
que se indique en el archivo correspondiente al usuario que e4ecuta IcronI.
5espus de lo anterior vienen las l#neas que e4ecutan las tareas programadas. 9o hay l#mites de
cuantas tareas pueda haber$ una por rengln. 6os campos <son "= que forman estas l#neas est%n
formados de la siguiente manera>
Minuto Hora DiaDelMes Mes DiaDeLaSeana !suario Coando
Minuto
Controla el minuto de la hora en que el comando ser ejecutado, este valor
debe de estar entre 0 y 59.
Hora
Controla la hora en que el comando ser ejecutado, se especifica en un
formato de 24 horas, los valores deben estar entre 0 y 23, 0 es
medianoche.
Da del Mes
Da del mes en que se quiere ejecutar el comando. Por ejemplo se indicara
20, para ejecutar el comando el da 20 del mes.
Mes
Mes en que el comando se ejecutar, puede ser indicado numricamente (1-
12), o por el nombre del mes en ingls, solo las tres primeras letras.
Da de la
semana
Da en la semana en que se ejecutar el comando, puede ser numrico (0-7)
o por el nombre del da en ingls, solo las tres primeras letras. (0 y 7 =
domingo)
Usuario Usuario que ejecuta el comando.
Comando
Comando, script o programa que se desea ejecutar. Este campo puede
contener mltiples palabras y espacios.
,n asterisco ^ como valor en los primeros cinco campos$ indicar% inicioEfin del campo$ sin
definicin alguna. ,n ^G@ en el campo de minuto indicar% cada @ minutos$ por e4emplo.
Para entender bien esto de los primeros 1 campos y el asterisco veamos algunos casos>
01 * * * * Se ejecuta al minuto 1 de cada hora de todos los das
@"
15 8 * * * A las 8:15 a.m. de cada da
15 20 * * * A las 8:15 p.m. de cada da
00 5 * * 0 A las 5 a.m. todos los domingos
* 5 * * Sun Cada minuto de 5:00a.m. a 5:59a.m. todos los domingos
45 19 1 * * A las 7:45 p.m. del primero de cada mes
01 * 20 7 * Al minuto 1 de cada hora del 20 de julio
10 1 * 12 1 A la 1:10 a.m. todos los lunes de diciembre
00 12 16 * Wen Al medioda de los das 16 de cada mes y que sea Mircoles
30 9 20 7 4 A las 9:30 a.m. del dia 20 de julio y que sea jueves
30 9 20 7 *
A las 9:30 a.m. del dia 20 de julio sin importar el da de la
semana
20 * * * 6 Al minuto 20 de cada hora de los sbados
20 * * 1 6 Al minuto 20 de cada hora de los sbados de enero
*ambin es posible especificar listas en los campos. 6as listas pueden estar en la forma de
1$?$@$A o en la forma de 1EA que ser#a lo mismo. IcronI$ de igual manera soporta incrementos en las
listas$ que se indican de la siguiente manera>
Valor o lista/incremento
5e nuevo$ es m%s f%cil entender las listas e incrementos con e4emplos>
59 11 * 1-3 1,2,3,4,5 A las 11:59 a.m. de lunes a viernes, de enero a marzo
45 * 10-25 * 6-7
Al minuto 45 de todas las horas de los das 10 al 25 de todos
los meses y que el da sea sbado o domingo
10,30,50 * * * 1,3,5
En el minuto 10, 30 y 50 de todas las horas de los das lunes,
mircoles y viernes
*/15 10-14 * * * Cada quince minutos de las 10:00a.m. a las 2:00p.m.
* 12 1-10/2 2,8 *
Todos los minutos de las 12 del da, en los das 1,3,5,7 y 9 de
febrero y agosto. (El incremento en el tercer campo es de 2 y
comienza a partir del 1)
0 */5 1-10,15,20-23 * 3
Cada 5 horas de los das 1 al 10, el da 15 y del da 20 al 23
de cada mes y que el da sea mircoles
3/3 2/4 2 2 2
Cada 3 minutos empezando por el minuto 3 (3,6,9, etc.) de las
horas 2,6,10, etc (cada 4 horas empezando en la hora 2) del da
2 de febrero y que sea martes
Homo se puede apreciar en el <imo e4emplo$ la tarea IcronI que estuviera asignada a ese rengln
con esos datos$ solo se e4ecutar#a si se cumple con los 1 campos <A95=. 's decir$ para que la tarea
se e4ecute tiene que ser un martes ? de febrero a las !?>!@. /iempre es un A95 booleano que solo
resulta verdadero si los 1 campos son ciertos en el minuto espec#fico.
'l caso anterior de4a claro entonces que el programa IcronI se invoca cada minuto y e4ecuta las
tareas que sus campos se cumplan en ese preciso minuto.
/iendo el usuario root$ es posible entonces$ modificar directamente crontab>
#> vi /etc/crontab
Por <imo$ la tercera forma de utili-ar IcronI est% pensada para el uso directo de cada usuario del
sistema. 6inux es un sistema multiusuario y IcronI es de las aplicaciones que soporta el traba4o con
varios usuarios a la ve-. Hada usuario puede tener su propio archivo crontab$ de hecho l se asume
que es el archivo crontab del usuario root$ aunque no hay problema que se incluyan otros usuarios$
y de ah# el sexto campo que indica precisamente quin es el usuario que e4ecuta la tarea y es
obligatorio.
Pero cuando los usuarios normales <e incluso root= desean generar su propio archivo de crontab$
entonces utili-aremos el comando .
@C
$> crontab -e
'n el directorio GvarGspoolGcronGWnom usuarioX$ que puede variar seg&n la distribucin$ se genera
un archivo IcronI para cada usuario$ este archivo aunque es de texto$ no debe editarse directamente.
Hon el comando Icrontab EeI se abrir% el editor por default <generalemente vi= con el archivo
llamado crontab vac#o$ donde el usuario ingresar% su tabla de tareas y lo guardar% con los comandos
propios del editor. Para listar el archivo con las tareas de IcronI$ se e4ecuta el comando>
$> crontab -l
%III. 'utoe!aluacin
'l cuestionario que sigue intenta confirmar la lectura atenta del material anterior. 9o todas las
respuestas est%n escritas en el texto previo$ por lo tanto al intentar responderlo for-osamente deber%
recurrir a otros materiales. 'ntendemos que es un buen e4ercicio tratar de hacer esta parte del
traba4o a conciencia y verificar$ posteriormente$ el acierto o error en las respuestas$ utili-ando esta
pr%ctica como complemento del aprendi-a4e. Pero lo fundamental es que no de4e de disfrutar y
compartir todo lo que descubra y aprenda.
9B*A> 6as pocas p%ginas anteriores$ como ya se se(al$ no cubren gran parte de los comandos
existentes en el entorno 6inux$ tanto internos como externos. *ampoco cubren las infinitas
combinaciones entre ellos$ por lo tanto sugerimos tener presente tres cosas> a= 'l &nico comando
que hay que saber> ImanI seguido del nombre de la utilidad cuyas opciones necesitamos conocer$ b=
,tili-ar la tecla \tab[ para que el sistema complete los comandos cuyo nombre no recordamos
<habr% que conocer las primeras letras$ por lo menos= y c= *ener a mano una conexin a 2nternet
para utili-ar cualquier buscador de la Oeb.
1" De los seis nombres siguientes marque cu%les 3' han contribuido a la construccin del
4ernel 5inu6"
!ngo 7olnar
5inus 8orvalds
/ichard 0tallman
David 0" 7iller
*aul Allen
2" 5a m%s adecuada definicin para la e6presin +distribucin de 5inu6+ es9
:na familia de compiladores de soft;are libre
:n conjunto de programas que se entregan junto al n<cleo 5inu6"
5a identificacin de un entorno gr%fico determinado
)ualquier sistema operativo que se distribuya con el n<cleo 5inu6
" 7arque los nombres que identifiquen entornos gr%ficos comunes de sistemas =3:/5inu6
>edora
?D$
5.D$
7andriva
=nome
@0
#" @&/>A Actualmente 5inu6 es el 4ernel predominante en el mundo de los smartphones
&erdadero
>also
(" @&/>A $n =3:/5inu6 e6iste un intBrprete de comandos con una sinta6is similar al lenguaje
)
&erdadero
>also
C" 5os paquetes de aplicaciones que tienen la e6tensin +rpm+ son caracterDsticos de las
distribuciones @marque por lo menos dosA
:buntu
>edora
)entos
Debian
0u0$
," $l directorio de trabajo del administrador del equipo es
/var
/dev
/root
/proc
/home/administrador
no tiene directorio
-" 5a particin de intercambio @s;apA se monta en
/mnt
/home/s;ap
/s;ap
/root
3o se monta
2" 5as configuraciones generales de todos los programas en 5inu6 deberDan usar el directorio9
/proc
/etc
/root
/opt
/dev
/var
10" *ara cambiar el nombre del directorio +contabilidad+ por el nombre +trabajo+1 en el directorio
actual1 haremos
mv contabilidad trabajo
rm contabilidad trabajo
cp contabilidad trabajo
mv trabajo contabilidad
A!
11" *ara obtener m%s informacin sobre el uso del comando +usermod+1 hay que ejecutar la
orden
man usermod
usermod E
usermod help
help usermod
12" FDe la siguiente lista1 marcar los nombres de sistemas de archivo que no son utilizados
por ninguna distribucin de 5inu6 como almacenamiento normalE
e6t2
38>0
reiserf
e6t#
>A82
e6t
1" F)on quB comando se crea un sistema de archivosE @dar formato a un dispositivo de
almacenamientoA
fdis4
crfs
parted
m4fs
format /:
fs
1#" F)u%l de los comandos siguientes puede ser utilizado para formatear una particinE
@Asuma que la particin requerida e6iste en el particionado lgico correspondienteA
m4fs Gt msdos /dev/sda1
m4fs e6t2 /dev/null
m4fs Gt e6t /dev/sda#
m4f6 GGtypeHe6t# /dev/sd2
1(" FIuB atributos marcar%n un archivo conteniendo un script bash como ejecutable1 al aplicar
el comando +chmod+E
CCC
,((
,CC
,,,
###
1C" 0uponga que ha creado la aplicacin +miaplica+ y la copi al directorio /usr/local/bin para
que se encuentre en el path" 0i quiere que todos los usuarios del sistema puedan correr
esa aplicacin1 Fcu%l de los siguientes comandos permitir% el acceso apropiadoE
chgrp bin /usr/local/bin/miaplica
chmod oJ6 /usr/local/bin/miaplica
umas4 0022 /usr/local/bin/miaplica
cho;n ,(( /user/local/bin/miaplica
A1
1," :n usuario est% conectado a un servidor 5inu61 trabajando en una shell" F)u%l es la mejor
manera de ingresar como +root+ al sistema1 desde esa shellE
chuser root
login root
su G
root
1-" )ompilando el fuente +micodigo"c+1 el programa +gcc+ le informa un error en la lDnea 1(-C1
Fcon quB comando de los siguientes puede acceder directamente a ver la lDnea y editarla
si fuera precisoE
vi micodigo"c J1(-C
grep micodigo"c Gli 1(-C
vi micodigo"c @y luego presionar +91(-C+1 KenterL1 para acceder a la lDneaA
cat micodigo"c M grep Gline 1(-C
less micodigo"c Gl 1(-C
12" F)u%l de las siguientes secuencias de teclas puede guardar los cambios realizados
durante una sesin con el editor +vi+ y terminar la aplicacinE
KescL9q;
KescL9s6
KescL9;q
KescL96s
20" :sted ha bajado de !nternet el empaquetado +unaappG1""-"src"tar"bz2+ y ha quedado en el
directorio /home/usuario" F)u%l de los siguientes comandos es el que ejecutar%1
razonablemente1 en primera instancia para instalar la aplicacin +unaapp+E
rpm :vh unaappG1""-"src"tar"bz2
tar 6vfj unaappGN
bunzip2 unaappG1""-"src"tar"bz2 M tar tvf G
cat unaappG1""-N M tar 6vfz G
dp4g G5 unaappG1""-"src"tar"bz2
21" De los siguientes archivos1 Fcu%l es utilizado para definir alias para direcciones !*1
especialmente en una red localE
/etc/hosts
/etc/services
/etc/aliases
/etc/net;or4s
/home/OusuarioP/"aliases
22" F)u%l de las siguientes utilidades de red 8)*/!* es la mejor herramienta a utilizar para
establecer si una determinada direccin !* es accesible en virtud de la configuracin de
red actualE
finger
ping
route
host
A?
2" F)u%l de las siguientes utilidades de red 8)*/!* es el mejor comando para determinar la
7A) de una tarjeta de red instalada en el sistemaE
netstat
ethers
ifconfig
arp;atch
ifup
2#" F)u%l de las siguientes utilidades de red 8)* / !* es la mejor herramienta para utilizar en
la identificacin de los cuellos de botella entre m%quinas remotas en la redE
$specDficamente1 asumir que un objetivo en esta depuracin es determinar los caminos
recorridos en el reenvDo de paquetes de red1 e identificar los routers intermedios que
pueden descartar paquetes"
route
netstat
ping
traceroute
dig
2(" $scriba lDnea a lDnea los mensajes que se ver%n en el shell del sistema cuando el usuario
que ejecut el comando siguiente1 desde una estacin de trabajo en la 5A3 de =eocom9
curso01 home # ssh -t 192.168.250.65 ssh -t -p 11000 -L 3308:190.0.148.132:1107 \
geocom@190.0.148.132 ssh -L 1107:tacuarembo.db.k:3306 geocom@tacuarembo.db.k
haya terminado su trabajo y digite +e6it+ en el prompt remoto" @ayuda9 son # lDneasA
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
2C" 5a empresa AAA publica un punto de acceso a su infraestructura de red por la !p
200"#0"1--"1(1 puerto 22" $ste servidor permite llegar a la red interna de AAA1 en particular
al servidor en el que tenemos que trabajar1 con !p 10"1"2"( y cone6in ssh en el puerto
1100" FIuB comando de los siguientes nos permite ingresar al shell del servidor de la 5A3
interna para comenzar nuestro trabajoE
ssh 10"1"2"( G* 1100
ssh G* 1100 200"#0"1--"1( M ssh 10"1"2"(
telnet 200"#0"1--"1( M ssh G* 1100 10"1"2"(
ssh Gt 200"#0"1--"1( ssh G* 1100 10"1"2"(
ssh G* 22 200"#0"1--"1( @y despuBs habr% que ingresar al servidor internoA
2," F)u%les de los siguientes protocolos o herramientas es lo mejor para copiar varios
archivos entre m%quinas de una red1 de manera que su contenido estB protegido frente a
cualquier intruso que utilice un analizador de paquetesE
ssh / scp
httpd / 005
gpg / snmp
A@
nfs / md(sum
rsync
2-" )uando se realiza una auditorDa de seguridad en un sistema 5inu61 un problema conocido
a identificar son las aplicaciones que est%n configuradas para ejecutarse como root @o
como otras cuentas de permisos altosA1 esas aplicaciones pueden ser invocadas para
provocar vulnerabilidades tales como desbordamientos de b<fer" F)u%l de las siguientes
lDneas de comandos se puede utilizar para hacer un listado inicial de esas aplicaciones1
para su an%lisisE
suid GGlist /N
chmod G/ uGs "/N
find / Gperm J #000 Guser root
chgrp Qfind / GsuidQ
22" FIuB comando de los siguientes nos permite ver r%pidamente la lista de puertos que est%n
abiertos y escuchando en nuestro equipo1 tanto en el protocolo !*v# como en !*vCE
tcpdump GGlist M grep 5!08$3
openports
netstat Gnat M grep 5!08$3
nmap localhost Gp 1GC(000
0" F)u%l de los siguientes comandos o secuencia1 le permite e6aminar cu%ntas veces el
usuario remoto +4oni4a+ ha abierto un shell seguro en el sistemaE
cat auth"log M grep sshd K tmpver"t6t
vi tmpver"t6t
cd /var/log
less /proc/4msg
ssh GGlog M more
vi /var/log/messages
grep Gc +sshd"N4oni4a+ auth"log
@dividir el n<mero entre 2A
1" 0uponga que en el directorio actual tiene varios archivos cuyo nombre cumple con la
siguiente e6presin regular9 +archO0G2P+" F)on cual de los comandos siguientes puede crear
un reporte que le permita ver su contenido lado a lado para compararlosE
ls fileO0G2P M 6args paste M less
paste Qls fileO0G2PQ L report R less report R rm report
cat fileO0G2P M paste G M more M less
ls fileO0G2P M tee report M paste Qcat reportQ
ls fileO0G2P M tee report M 6args paste M more
2" Analizando un archivo de log de 8omcat1 el +catalina"out+1 usted llega a la conclusin que
deberDa poder no solo listar la lDnea que contiene la palabra +0$&$/$+1 sino tambiBn dos
lDneas antes y dos lDneas despuBs1 viendo en un color diferente la palabra por la cual va a
filtrar" F)u%l de los siguientes comandos eligirDaE
cat catalina"out M grep S0$&$/$T
less Gl 2 catalina"out M grep 0$&$/$
grep GA2 GU2 GGcolorHal;ays 0$&$/$ catalina"out
AA
cat catalina"out M grep 0$&$/$ GA2 GU2
cat catalina"out L color VW-002(0V M grep 0$&$/$
" :sted est% en un directorio que contiene cientos de archivos y una decena de directorios"
Debe revisar los directorios e6istentes1 viBndolos ordenados por fecha" FIuB comando de
los siguientes le permite hacer eso r%pidamenteE
ls Glrt M grep Xd
sort Gt + + G4 C1Cn G4 ,
ls Gd Gl Grt
find N Gma6depth 0 Gtype d M grep sort Gt + + G4 C
#" 0e tiene un archivo llamado +lista+ que contiene una serie de palabras1 una por lDnea" :sted
debe hacer un reporte que contiene una lista numerada de las primeras cinco palabras1 de
acuerdo con el orden alfabBtico" F)u%l de las siguientes lDneas de comandos se puede
utilizar para mostrar el resultado de este reporte por la consolaE
sort lista M nl M head G(
split G1 lista R cat 6args M head G(
nl lista M sort M sed +/X OX12#(P/d+
nl lista M sort M head G(
(" FIuB hace el comando psE
!mprime el directorio en formato postscript
7uestra el status del puerto 5*81
7uestra los procesos que est%n corriendo en el sistema
*roduce estadDsticas del sistema
3inguna de las respuestas anteriores es correcta
C" 0uponga que el archivo +lista+ contiene una lista de nombres en la forma +3ombre Apellido+1
uno por lDnea" $stos nombres est%n desordenados y usted debe mostrarlos ordenados por
apellido1 sin embargo1 el formato de los nombres de cada lDnea debe seguir siendo el
mismo" F)u%l de los siguientes comandos no seria una lista debidamente ordenada de
nombres sobre la consolaE
cut Gf 2 Gd S"T lista M paste lista G M sort G4 M cut Gf 1
sort G42 lista
set +s/Y@ Y;NYA Y@Y;NYA/Y2 Y1 Y2/+ lista M sort M cut Gf 2G Gd S"T
cut Gf 2 Gd S"T lista M sort
cut Gf2 Gd S"T lista M paste G lista M sort M cut Gf 2
," $l comando +ps GA+ muestra una lista ordenada de todos los procesos en ejecucin1 con el
!D de proceso en el primer campo y los campos est%n separados por espacios"
0upongamos que desea mostrar en la pantalla una lista de los cinco procesos m%s
recientemente lanzados @son los que tienen los identificadores de proceso m%s altosA"
F)on cu%l de los siguientes comandos se mostrar%n los elementos que deseeE
ps GA M tail G( M cut Gf 1 Gd S"T
ps GA M tail G( M set +s/O"PNO0G2PN//+
ps GA M head G( M nl
ps GA M tac M head G( M cut Gb 1G(
A1
-" $stamos trabajando en =3:/5inu6 y se produce un error en uno de nuestros programas
que est% corriendo" FIuB comando se debe utilizar para terminar el proceso de dicho
programaE
stop
4ill
end
KctrlLKaltL D$5
;ait
2" :sted ejecuta el comando +jobs+1 obteniendo el siguiente resultado9
# jobs -l
[1] 5110 Running kedit &
[2]- 5382 Stopped (signal) pine
[3]+ 5457 Stopped (tty output) vi
F)u%l de los siguientes comandos se debe utilizar para pasar el foco de su shell a la
aplicacin +vi+E
bg Z
fg Z
top Gp (#(,
s;itch Z(#(,
#0" F$n cu%l de los siguientes archivos o directorios se deben hacer modificaciones para
configurar los directorios locales que estar%n disponibles para una cone6in remota a
travBs del servicio 3>0 @3et;or4 >ile 0ystemAE
/etc/fstab
/mnt/nfs
/etc/e6ports
/etc/smb"conf
#1" *reste atencin a la siguiente instant%nea de la informacin brindada por el comando +top+9
# top
top - 16:47:19 up 1:38, 4 users, load average: 0,30, 0,17, 0,20
Tasks: 208 total, 2 running, 206 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2,9 us, 8,8 sy, 0,0 ni, 87,1 id, 38,0 wa, 0,0 hi, 0,2 si, 0,0 st
KiB Mem: 12221788 total, 3876192 used, 8345596 free, 147876 buffers
KiB Swap: 12207100 total, 0 used, 12207100 free, 1636856 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2594 administ 20 0 1703m 1,1g 1,1g S 74,7 9,4 4:18.02 VirtualBox
4350 mysql 20 0 949m 134m 10m S 15,6 12,1 0:05.03 mysqld
10194 administ 20 0 2721m 72m 35m S 2,7 0,6 0:42.39 kwin
4881 root 20 0 190m 41m 27m S 2,0 0,3 1:35.05 Xorg
21983 root 20 0 507m 17m 11m S 1,0 0,1 0:04.78 gnome-terminal
4188 administ 20 0 382m 27m 15m S 0,7 0,2 0:31.27 plugin-containe
2489 root 20 0 0 0 0 S 0,3 0,0 0:00.46 kworker/0:2
2558 administ 20 0 230m 10m 7136 S 0,3 0,1 0:07.03 VBoxSVC
3014 root 20 0 4376 944 528 S 0,3 0,0 0:03.14 acpid
10171 administ 20 0 676m 29m 18m S 0,3 0,2 0:02.67 kded4
Describa brevemente a continuacin quB parte de esta informacin llama la atencin y a
cu%l de los procesos que se visualizan en la lista deberDa ser atribuida"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
A
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#2" 0uponga que tiene una aplicacin cuyo comportamiento depende del valor de la variable
de ambiente &A/1" F)u%l de los siguientes comandos debe utilizarse en un shell script
bash para cargar y persistir el valor de dicha variableE
e6port [&A/1HvalorR echo [&A/1
set &A/1Hvalor
&A/1Hvalor R e6port &A/1
echo [&A/1Hvalor
declare G6 &A/1Hvalor
#" F)u%l de las lDneas siguientes puede ser utilizada en un shell script bash para ejecutar
todos los archivos ejecutables e6istentes en un directorioE
for i in N R do \ case O G6 [i P R \ "/[iR ] esac ] done
;hile i in N R do \ if O G6 [i P R then \ "/[iR ] fi ] done
foreach i in N R do \ if O G6 [i P R then \ "/[iR ] done ]
for i in N R do \ if O G6 [i P R then \ "/[iR ] fi ] done
##" 0i acaba de instalar una aplicacin poco conocida1 que corre como un demonio y sabe que
el proceso de instalacin crea un script para lanzar la misma1 Fcon quB lDnea de las
siguientes podrDa identificar r%pidamente el nombre del servicio para dicha aplicacinE
find / Gname Onombre appP
grep Onombre appP N G/
ls Glrt /etc/init"d/
ls Gt /etc/init"d
#(" 5a mayorDa de las distribuciones =3:/5inu6 para servidores utilizan scripts para lanzar los
demonios que corren en el sistema" $sos scripts generalmente comienzan con las
siguientes lDneas9
#!/bin/sh
### BEGIN INIT INFO
# Provides: ntp
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 1
# Short-Description: Start NTP daemon
### END INIT INFO
las que facilitan la administracin del los servicios del sistema" F)u%l de los siguientes
comandos con seguridad utiliza estas lDneas cuando lo invocamos para establecer el
comportamiento de un servicio en el sistemaE
service
lsmod
ch4config
file
A"
#C" $l siguiente es el contenido del archivo /etc/crontab de un servidor 5inu69
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
23 4 * 1,6 1 root run-parts /etc/cron.special
&iendo esas lDneas1 marquB cu%l de las siguientes afirmaciones es verdadera9
$l archivo de comandos +/etc/cron"special+ se ejecuta una vez por semana1 los lunes"
$l contenido del directorio +/etc/cron"special+ se ejecutan en enero y junio"
Durante algunas partes del a^o +/etc/cron"special+ es ejecutado un minuto despuBs de
+/etc/cron";ee4ly+"
Durante el mes de marzo1 +/ etc/cron"special+ se ejecuta los lunes"
#," :sted ha escrito un script bash que se debe ejecutar escribiendo una lDnea como la
siguiente9
# > ./mibash param1 param2 param3
$l script no tiene control de los par%metros al inicio1 por lo tanto se pide que escriba a
continuacin las lDneas @no m%s de -A que le permitan validar que la cantidad de
par%metros es correcta y1 en caso contrario1 emitir un mensaje mostrando cmo se debe
utilizar1 en el cual se deber% incluir el nombre del script"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#-" F$n cu%l archivo de configuracin del sistema1 de los siguientes1 debo modificar una lDnea
sustituyendo un ( por un 1 para cambiar el nivel de ejecucin del servidor desde el modo
gr%fico al modo te6toE
/etc/fstab
/var/spool/init
/etc/inittab
/etc/sysconfig/init"conf
#2" $scriba las lDneas de comandos que necesitara introducir en el interfaz de usuario de la
lDnea de comandos1 para realizar las tareas que se indican" )ada respuesta deber% ser en
una <nica lDnea de cdigo y estar constituida por un solo comando"
Averiguar todos los usuarios que tiene el sistema
1" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
AC
=uardar en una variable la posicin actual del usuario en el %rbol de directorios"
2" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Dirigirse al directorio raDz del sistema
" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Abrir directamente1 sin cambio de directorio ni en este y ni en los siguientes pasos1 el
archivo +/etc/apache2/httpd"conf+ @asuma una vez que lo ha abierto lo cierra directamente
sin hacer cambiosA
#" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
)rear el directorio +old+ en su directorio raDz @el directorio raDz del usuarioA
(" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
)opiar el archivo anteriormente mencionado en #"1 al reciBn creado directorio cambi%ndole
el nombre por +httpd"conf"old+
C" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
7ueva el archivo anteriormente creado al directorio padre de donde dicho archivo se
encuentra
," """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
!ndique en quB directorio se encuentra finalmente el archivo +httpd"conf"old+
-" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
!mprima en pantalla el contenido de httpd"conf"old
2" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
/egrese al directorio del que originalmente parti utilizando la variable guardada al inicio
10" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
A0
'nexo '
Estableciendo una V"* a tra!+s de un t,nel ((-
#!/bin/bash
# "start_vpn.sh", version 0.2 (04/2013)
################################################################################
########################## INPUT ARGUMENTS #####################################
################################################################################
#
# Change these to match your network setup
#
## REMOTE_IP : That's the remote IP you can SSH into.
## REMOTE_SSH_PORT : That's the port you use to SSH into ${REMOTE_IP}
## LOCAL_VPN_NET : The local LAN addressable space (ex: "in my local LAN all
## computers are '10.10.1.x'" --> "10.10.1.0/24")
## REMOTE_VPN_NET : The remote LAN addressable space (ex: "in the school
## network all computers are '10.10.1.x'" --> "10.10.2.0/24")
REMOTE_IP=x.x.x.x
REMOTE_SSH_PORT=22
LOCAL_VPN_NET=192.168.1.0/24
REMOTE_VPN_NET=192.168.2.0/24
# NOTE: LOCAL_VPN_NET and REMOTE_VPN_NET must be different.
# If both networks have the same ehem... network... this won't work
################################################################################
########################## END OF INPUT ARGUMENTS ##############################
################################################################################
#
# Tunnel device arguments
#
## LOCAL_TUNNEL_IP : The IP the local tunnel interface will be created with.
## REMOTE_TUNNEL_IP : The IP the remote tunnel interface will be created with.
## LOCAL_TUNNEL_DEVICE_NUMBER : The number to use when creating the local tunX interface.
## REMOTE_TUNNEL_DEVICE_NUMBER: Same as before, but with the remote tunY interface.
LOCAL_TUNNEL_IP=10.10.254.253
REMOTE_TUNNEL_IP=10.10.254.254
LOCAL_TUNNEL_DEVICE_NUMBER=9
REMOTE_TUNNEL_DEVICE_NUMBER=8
# Make sure we are root
#
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root. Try with 'sudo'" 1>&2
echo "Exiting..."
exit -1
fi
# Exit if any command fails
#
set -e
# Try to log in using public key. If it does not work, use "ssh-copy-id" to make
# it work from now on. This way, we will avoid having to ask for the password each time.
#
echo "> Cheking public key authentication with the remote server..."
if ssh -o PreferredAuthentications=publickey -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} true
then
echo "> OK"
echo ""
else
echo "> KO!"
echo "> The remote server does NOT allow public key authentication."
echo "> Let's try to fix that."
echo "> Enter the root password on the remote server when prompted..."
echo ""
1!
if ssh-copy-id "-p ${REMOTE_SSH_PORT} root@${REMOTE_IP}"
then
echo ""
echo "> Done! Public key authentication should work from now on."
echo ""
else
echo "> KO!"
echo "> There were problems trying to ssh as 'root' into ${REMOTE_IP}."
echo "> Make sure you can manually execute this command and try again:"
echo ">"
echo "> # ssh root@${REMOTE_IP}"
echo ">"
echo "> In case the root account is not enabled (ex: Ubuntu) in the"
echo "> remote computer, remember to first log in into any other"
echo "> account (in the sudo'ers group) and execute this:"
echo ">"
echo "> # sudo passwd root"
echo ">"
echo "Exiting..."
exit -1
fi
fi
echo "> Cheking needed binaries are installed in local and remote computer..."
if which ip >/dev/null && \
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} which ip iptables >/dev/null
then
echo "> OK"
echo ""
else
echo "> You need the 'ip' (from the 'iproute' package) and 'iptables' (from the"
echo "> 'iptables' package) network configuration utilities before proceeding."
echo "> Install them in both the local and remote computers and then re-run this"
echo "> script."
echo "Exiting..."
exit -1
fi
echo "> Obtaining local interface associated to ${LOCAL_VPN_NET}..."
if [ -z ${LOCAL_VPN_IFACE} ]
then
LOCAL_VPN_IFACE=`ip route show | grep ${LOCAL_VPN_NET} | awk '{print $3}'`
fi
if [ -z ${LOCAL_VPN_IFACE} ] || ! ip address show dev ${LOCAL_VPN_IFACE} &>/dev/null
then
echo "> KO! (iface=${LOCAL_VPN_IFACE})"
echo "> Cannot automatically find out which interface (wlan0, eth1, etc...)"
echo "> (in the local computer) is associated to local network ${LOCAL_VPN_NET}."
echo "> In order to fix this, manually export from the shell a variable"
echo "> called 'LOCAL_VPN_NET' and try again."
echo "> Example:"
echo ">"
echo "> # export LOCAL_VPN_NET=eth0; ./start_vpn.sh"
echo ">"
echo "Exiting..."
exit -1
else
echo "> OK (iface=${LOCAL_VPN_IFACE})"
echo ""
fi
echo "> Obtaining remote interface associated to ${REMOTE_VPN_NET}..."
REMOTE_VPN_IFACE=`ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} ip route show | grep ${REMOTE_VPN_NET}
| awk '{print $3}'`
if [ -z ${REMOTE_VPN_IFACE} ] || ! ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} ip address show dev $
{REMOTE_VPN_IFACE} &>/dev/null
then
echo "> KO! (iface=${LOCAL_VPN_IFACE})"
echo "> Cannot automatically find out which interface (wlan0, eth1, etc...)"
echo "> (in the remote computer) is associated to remote network ${LOCAL_VPN_NET}."
echo "> In order to fix this, manually export from the shell a variable"
echo "> called 'REMOTE_VPN_NET' and try again."
echo "> Example:"
echo ">"
echo "> # export REMOTE_VPN_NET=eth0; ./start_vpn.sh"
11
echo ">"
echo "Exiting..."
exit -1
else
echo "> OK (iface=${REMOTE_VPN_IFACE})"
echo ""
fi
echo "> REMOTE: Creating tunnel interface..."
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} ip tuntap del dev tun${REMOTE_TUNNEL_DEVICE_NUMBER} mode
tun || true
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} ip tuntap add dev tun${REMOTE_TUNNEL_DEVICE_NUMBER} mode
tun
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} ip link set tun${REMOTE_TUNNEL_DEVICE_NUMBER} up
echo "> OK"
echo ""
echo "> REMOTE: Configuring tunnel interface..."
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} ip address add ${REMOTE_TUNNEL_IP} peer $
{LOCAL_TUNNEL_IP} dev tun${REMOTE_TUNNEL_DEVICE_NUMBER}
echo "> OK"
echo ""
echo "> REMOTE: Enabling IP forwarding and NAT..."
sysctl -w net.ipv4.ip_forward=1 >/dev/null
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} iptables -I FORWARD 1 -i tun$
{REMOTE_TUNNEL_DEVICE_NUMBER} -o ${REMOTE_VPN_IFACE} -j ACCEPT
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} iptables -I FORWARD 1 -i ${REMOTE_VPN_IFACE} -o tun$
{REMOTE_TUNNEL_DEVICE_NUMBER} -j ACCEPT
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} iptables -t nat -A POSTROUTING -s ${LOCAL_TUNNEL_IP} -o
${REMOTE_VPN_IFACE} -j MASQUERADE
echo "> OK"
echo ""
# Add a route/gw to the local network in the remote computer
echo "> REMOTE: Adding route (gw) to the local network..."
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} ip route add ${LOCAL_VPN_NET} dev tun$
{REMOTE_TUNNEL_DEVICE_NUMBER} || true
echo "> OK"
echo ""
echo "> LOCAL: Creating tunnel interface..."
ip tuntap del dev tun${LOCAL_TUNNEL_DEVICE_NUMBER} mode tun || true
ip tuntap add dev tun${LOCAL_TUNNEL_DEVICE_NUMBER} mode tun
ip link set tun${LOCAL_TUNNEL_DEVICE_NUMBER} up
echo "> OK"
echo ""
echo "> LOCAL: Configuring tunnel interface..."
ip address add ${LOCAL_TUNNEL_IP} peer ${REMOTE_TUNNEL_IP} dev tun${LOCAL_TUNNEL_DEVICE_NUMBER}
echo "> OK"
echo ""
echo "> LOCAL: Enabling IP forwarding and NAT..."
sysctl -w net.ipv4.ip_forward=1 >/dev/null
iptables -I FORWARD 1 -i tun${LOCAL_TUNNEL_DEVICE_NUMBER} -o ${LOCAL_VPN_IFACE} -j ACCEPT
iptables -I FORWARD 1 -i ${LOCAL_VPN_IFACE} -o tun${LOCAL_TUNNEL_DEVICE_NUMBER} -j ACCEPT
iptables -t nat -A POSTROUTING -s ${REMOTE_TUNNEL_IP} -o ${LOCAL_VPN_IFACE} -j MASQUERADE
echo "> OK"
echo ""
echo "> LOCAL: Adding route (gw) to the remote network..."
ip route add ${REMOTE_VPN_NET} dev tun${LOCAL_TUNNEL_DEVICE_NUMBER} || true
echo "> OK"
echo ""
# Finally, connect the tunnel ends with ssh. But first, define a "cleanup"
# function that will be used when exiting from the ssh session with CTRL+D + CTRL+C
# Clean up function
function cleanup {
echo "> VPN connection closed. Cleaning up..."
# Remote computer cleanup
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} iptables -t nat -D POSTROUTING -s ${LOCAL_TUNNEL_IP}
-o ${REMOTE_VPN_IFACE} -j MASQUERADE
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} iptables -D FORWARD -i ${REMOTE_VPN_IFACE} -o tun$
{REMOTE_TUNNEL_DEVICE_NUMBER} -j ACCEPT
1?
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} iptables -D FORWARD -i tun$
{REMOTE_TUNNEL_DEVICE_NUMBER} -o ${REMOTE_VPN_IFACE} -j ACCEPT
ssh -p ${REMOTE_SSH_PORT} root@${REMOTE_IP} ip tuntap del dev tun${REMOTE_TUNNEL_DEVICE_NUMBER}
mode tun
# Local computer cleanup
iptables -t nat -D POSTROUTING -s ${REMOTE_TUNNEL_IP} -o ${LOCAL_VPN_IFACE} -j MASQUERADE
iptables -D FORWARD -i ${LOCAL_VPN_IFACE} -o tun${LOCAL_TUNNEL_DEVICE_NUMBER} -j ACCEPT
iptables -D FORWARD -i tun${LOCAL_TUNNEL_DEVICE_NUMBER} -o ${LOCAL_VPN_IFACE} -j ACCEPT
ip tuntap del dev tun${LOCAL_TUNNEL_DEVICE_NUMBER} mode tun
echo "> OK"
echo ""
echo "> Have a nice day :)"
}
# Execute it when CTRL+C (SIGINT) is detected
trap cleanup SIGINT
echo "> Connecting bridge ends..."
echo "> This will open an SSH session to the remote server. It might take a"
echo "> few seconds, so wait until you see the remote computer prompt."
echo "> Once this happens, you will be able to access any computer on the"
echo "> remote network (that's ${REMOTE_VPN_NET}). Try it!"
echo ">"
echo "> NOTE: To finish the VPN connection, just close (CTRL+D plus CTRL+C)"
echo "> the remote shell and wait for the clean up functions to finish"
echo "> (it will take a few seconds, so don't press CTRL+C for a second"
echo "> time!)"
echo ""
ssh -w ${LOCAL_TUNNEL_DEVICE_NUMBER}:${REMOTE_TUNNEL_DEVICE_NUMBER} -o Tunnel=point-to-point -p $
{REMOTE_SSH_PORT} root@${REMOTE_IP}
echo ""
# NOTE: In order to exit the ssh session, CTRL+D is not enough (the ssh server
# won't return control to the local process. That's why CTRL+C also needs to be
# pressed, and that's why we have to capture SIGINT and execute the cleanup
# afterwards.
1@