<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title># rm-rf.es &#187; Linux</title>
	<atom:link href="http://rm-rf.es/sobre/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://rm-rf.es</link>
	<description>Administración de sistemas, Unix, Linux, FreeBSD, Windows, hosting, dominios, servidores...</description>
	<lastBuildDate>Wed, 23 May 2012 19:38:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Comando chage: tiempo de vida de claves y usuarios en GNU/Linux</title>
		<link>http://rm-rf.es/comando-chage-tiempo-de-vida-de-claves-y-usuarios-en-gnulinux/</link>
		<comments>http://rm-rf.es/comando-chage-tiempo-de-vida-de-claves-y-usuarios-en-gnulinux/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 15:54:38 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[claves]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[Seguridad]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2225</guid>
		<description><![CDATA[Hace un tiempo vimos como establecer la caducidad de claves en Linux con el comando passwd. Hoy vamos a aprender otra forma de hacerlo, en este caso con el comando chage, con el que además podemos especificar la caducidad de la cuenta de un usuario concreto, no sólo de su clave. Echando un vistazo a [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un tiempo vimos como <a title="Configurar la caducidad de claves en Linux" href="http://rm-rf.es/configurar-la-caducidad-de-claves-en-linux/">establecer la caducidad de claves en Linux con el comando passwd</a>. Hoy vamos a aprender otra forma de hacerlo, en este caso con el <strong>comando chage</strong>, con el que además podemos <strong>especificar la caducidad de la cuenta de un usuario concreto</strong>, no sólo de su clave.</p>
<p>Echando un vistazo a la ayuda del comando vemos claramente la función de cada uno de los parámetros:</p>
<pre>$ chage --help
Modo de uso: chage [opciones] [USUARIO]

Opciones:
  -d, --lastday ULTIMO_DÍA      establece el último cambio de clave a
                                ULTIMO_DÍA
  -E, --expiredate FECHA_EXP    establece la fecha de caducidad de la
                                cuenta a FECHA_EXP
  -h, --help                    muestra este mensaje de ayuda y termina
  -I, --inactive INACTIV        desactiva la cuenta después de INACTIV
                                días desde la fecha de expiración
  -l, --list                    muestra la información de envejecimiento
                                de la cuenta
  -m, --mindays DÍAS_MIN        establece el número mínimo de días antes
                                de cambiar la clave a DÍAS_MIN
  -M, --maxdays DÍAS_MAX        establece el número máximo de días antes
                                de cambiar la clave a DÍAS_MAX
  -W, --warndays DÍAS_AVISO     establece el número de días de aviso
                                a DÍAS_AVISO</pre>
<p>Como podéis ver, se puede especifica la fecha exacta en la que expirará la clave de acceso, los días permitidos tras la expiración de la cuenta hasta que se desactiva por completo, los días de aviso, etc. Vamos a ver unos ejemplos:</p>
<h3>Cambiar la fecha de expiración de la cuenta al día 2011-9-28 al usuario foo</h3>
<pre># chage -E 2011-9-28 foo</pre>
<p>Listamos los atributos de caducidad especificados para esta cuenta:</p>
<pre># chage -l foo
Último cambio de contraseña					: sep 07, 2011
La contraseña caduca					: nunca
Contraseña inactiva					: nunca
La cuenta caduca						: sep 28, 2011
Mínimo número de días entre cambios de contraseña		: 0
Máximo número de días entre cambios de contraseña		: 99999
Número de días de aviso antes de que caduque la contraseña	: 7</pre>
<h3>Cambiar número de días entre cambios de clave (15) y la caducidad por inactividad de la clave (150)</h3>
<pre># chage -m 15 -M 15 -I 150 foo
# chage -l foo
Último cambio de contraseña					: sep 07, 2011
La contraseña caduca					: sep 22, 2011
Contraseña inactiva					: feb 19, 2012
La cuenta caduca						: sep 28, 2011
Mínimo número de días entre cambios de contraseña		: 15
Máximo número de días entre cambios de contraseña		: 15
Número de días de aviso antes de que caduque la contraseña	: 7</pre>
<h3>Obligar a cambiar la clave en el próximo intento de acceso</h3>
<pre># chage -d 0 foo</pre>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/configurar-la-caducidad-de-claves-en-linux/" title="Configurar la caducidad de claves en Linux">Configurar la caducidad de claves en Linux</a></li><li><a href="http://rm-rf.es/permisos-especiales-setuid-setgid-sticky-bit/" title="Permisos especiales (setuid, setgid, sticky bit)">Permisos especiales (setuid, setgid, sticky bit)</a></li><li><a href="http://rm-rf.es/securizando-y-optimizando-linux/" title="Securizando y optimizando Linux">Securizando y optimizando Linux</a></li><li><a href="http://rm-rf.es/bucle-de-password-expirado-en-ldap-nativo-rhel-contra-sun-ldap/" title="Bucle de password expirado en ldap nativo RHEL contra Sun LDAP">Bucle de password expirado en ldap nativo RHEL contra Sun LDAP</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/comando-chage-tiempo-de-vida-de-claves-y-usuarios-en-gnulinux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gestión de LVM en Linux (Logical Volume Manager)</title>
		<link>http://rm-rf.es/gestion-de-lvm-en-linux-logical-volume-manager/</link>
		<comments>http://rm-rf.es/gestion-de-lvm-en-linux-logical-volume-manager/#comments</comments>
		<pubDate>Sun, 04 Sep 2011 17:02:57 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[disco duro]]></category>
		<category><![CDATA[fdisk]]></category>
		<category><![CDATA[lvm]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2211</guid>
		<description><![CDATA[Hace ya casi un par de años vimos en una entrada cómo crear un Linux Logical Volume Manager (LVM) usando fdisk. En ese post cubrimos la primera parte necesaria para gestionar volúmenes lógicos en GNU/Linux además de hacer una introducción a LVM. Vamos a continuar donde lo dejamos, omitimos el paso de fdisk porque está [...]]]></description>
			<content:encoded><![CDATA[<p>Hace ya casi un par de años vimos en una entrada <a title="Cómo crear un Linux Logical Volume Manager (LVM) usando fdisk" href="http://rm-rf.es/como-crear-linux-logical-volume-manager-lvm-fdisk/">cómo crear un Linux Logical Volume Manager (LVM) usando fdisk</a>. En ese post cubrimos la primera parte necesaria para <strong>gestionar volúmenes lógicos en GNU/Linux</strong> además de hacer una introducción a <strong>LVM</strong>.</p>
<p>Vamos a continuar donde lo dejamos, omitimos el paso de fdisk porque está explicado en ese artículo. Partimos de la base entonces de que tenemos ya creada una partición <strong>Linux LVM</strong>, en nuestro caso /dev/sda3:</p>
<pre># fdisk -l | grep sda3
/dev/sda3               1        3232    25961008+  8e  Linux LVM</pre>
<div align="center"><img class="size-full wp-image-2213" title="logical volume manager" src="http://rm-rf.es/wp-content/uploads/2011/09/logical-volume-manager.jpg" alt="logical volume manager" width="290" height="293" /></div>
<p><center><em>Imágen: <a href="http://madrigaladmin.blogspot.com/" target="_blank">madrigaladmin.blogspot.com</a></em></center></p>
<h2>Crear los volúmenes físicos (PV &#8211; pvcreate)</h2>
<p>Lo primero que debemos hacer cuando trabajamos con LVM es <strong>crear los volúmenes físicos (PV) de las particiones con las que queramos crear volúmenes lógicos</strong>. Esto lo hacemos con el comando <strong>pvcreate</strong>. Esto hay que hacerlo en todas las particiones que queramos usar con LVM. En nuestro caso de momento únicamente /dev/sda3:</p>
<pre># pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created</pre>
<p>Si quisieramos añadir más particiones, simplemente sería ejecutar ese comando con cada una de ellas.</p>
<p><em>Nota: Hay que tener el paquete <strong>lvm2</strong> instalado para poder usar LVM. En Debian:</em></p>
<pre># apt-get install lvm2</pre>
<h2>Crear el grupo de volúmen (VG &#8211; vgcreate)</h2>
<p>Ahora que ya tenemos configuradas las particiones que queremos usar como LVM, podemos añadir el <strong>primer grupo de volumen, que contendrá ya nuestros volúmenes lógicos finales</strong>. Lo haremos con el comando <strong>vgcreate</strong>. En nuestro caso sólo tenemos una partición, pero si quisiéramos añadir varias al grupo lo haríamos así:</p>
<pre>vgcreate volgroup_01 /dev/sda3 /dev/sda4 /dev/sda5</pre>
<p>Bien, voy a añadirlo entonces con mi partición /dev/sda3 que es con la que estamos trabajando de momento:</p>
<pre># vgcreate volgroup_01 /dev/sda3
  Volume group "volgroup_01" successfully created</pre>
<p>Con el comando vgscan podemos consultar los grupos creados, con el comando pvscan los volúmenes físicos:</p>
<pre># vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "volgroup_01" using metadata type lvm2
# pvscan
  PV /dev/sda3   VG volgroup_01   lvm2 [24,76 GB / 24,76 GB free]
  Total: 1 [24,76 GB] / in use: 1 [24,76 GB] / in no VG: 0 [0   ]</pre>
<h2>Crear los volúmenes lógicos (LV &#8211; lvcreate)</h2>
<p>Llegados a este punto, únicamente nos falta <strong>crear el volúmen lógico, sobre el que ya añadiremos el sistema de ficheros deseado</strong>. Vamos a crear un volúmen lógico de 2G de espacio sobre el grupo creado anteriormente (volgroup_01):</p>
<pre># lvcreate -L2G -n volumen_01 volgroup_01
  Logical volume "volumen_01" created</pre>
<p>Y con el comando <strong>lvscan</strong> vemos el estado de los volúmenes:</p>
<pre># lvscan
  ACTIVE            '/dev/volgroup_01/volumen_01' [2,00 GB] inherit</pre>
<p>Ahora ya sólo faltaría <strong>darle formato y montarlo</strong> como una partición normal:</p>
<pre># mkfs.ext4 /dev/volgroup_01/volumen_01
mke2fs 1.41.4 (27-Jan-2009)
Etiqueta del sistema de ficheros=
Tipo de SO: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
131072 nodos-i, 524288 bloques...
...
...
...

# mount /dev/volgroup_01/volumen_01 /temporal/
# df -h | grep temporal
                      2,0G   67M  1,9G   4% /temporal</pre>
<h2>Añadir nuevas particiones a un grupo volumen (vgextend)</h2>
<p>La gracia de LVM es que si disponemos de nuevos discos o particiones podemos añadirlas al grupo de volúmen de forma sencilla. Primero tenemos que crear los volúmenes físicos de esas nuevas particiones (recordad, con pvcreate) y luego asignarlas al grupo de volúmen deseado. Vamos a añadir /dev/sda5 a nuestro grupo volgroup_01:</p>
<pre># pvcreate /dev/sda5
# vgextend volgroup_01 /dev/sda5</pre>
<h2>Aumentar o reducir el tamaño de nuestro volúmen lógico y sistema de ficheros (lvextend &#8211; resize2fs)</h2>
<p>Ahora podríamos ampliar si quisiéramos el tamaño de nuestro volumen lógico creado anteriormente porque disponemos de más espacio gracias a las nuevas particiones añadidas al grupo de volúmen. VAmos a añadirle 2G más con el comando <strong>lvextend</strong>:</p>
<pre># lvextend -L +2G /dev/volgroup_01/volumen_01
  Extending logical volume volumen_01 to 4,00 GB
  Logical volume volumen_01 successfully resized</pre>
<p>Finalmente tendríamos que ampliar la última capa, el sistema de ficheros, en nuestro caso es ext4 así que usamos <strong>resize2fs</strong>. Tened cuidado con este último paso ya que tiene su riesgo y si se hace mal se pueden perder datos:</p>
<pre># resize2fs /dev/volgroup_01/volumen_01 4G
resize2fs 1.41.4 (27-Jan-2009)
Filesystem at /dev/volgroup_01/volumen_01 is mounted on /temporal; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/volgroup_01/volumen_01 to 1048576 (4k) blocks.
El sistema de ficheros en /dev/volgroup_01/volumen_01 tiene ahora 1048576 bloques.</pre>
<p>Y el nuevo tamaño ya queda reflejado:</p>
<pre># df -h | grep temporal
                      4,0G   68M  3,7G   2% /temporal</pre>
<p>Espero que os haya sido de utilidad esta introducción a LVM (logical volume manager) en GNU/Linux.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/como-crear-linux-logical-volume-manager-lvm-fdisk/" title="Cómo crear un Linux Logical Volume Manager (LVM) usando fdisk">Cómo crear un Linux Logical Volume Manager (LVM) usando fdisk</a></li><li><a href="http://rm-rf.es/clustered-logical-volume-manager-clvm-y-gfs2/" title="Clustered Logical Volume Manager (CLVM) y GFS2">Clustered Logical Volume Manager (CLVM) y GFS2</a></li><li><a href="http://rm-rf.es/comando-chage-tiempo-de-vida-de-claves-y-usuarios-en-gnulinux/" title="Comando chage: tiempo de vida de claves y usuarios en GNU/Linux">Comando chage: tiempo de vida de claves y usuarios en GNU/Linux</a></li><li><a href="http://rm-rf.es/convertir-a-ext4-en-un-sistema-de-ficheros-ext3/" title="Convertir a ext4 en un sistema de ficheros ext3">Convertir a ext4 en un sistema de ficheros ext3</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/gestion-de-lvm-en-linux-logical-volume-manager/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Emulador Linux con Javascript</title>
		<link>http://rm-rf.es/emulador-linux-con-javascript/</link>
		<comments>http://rm-rf.es/emulador-linux-con-javascript/#comments</comments>
		<pubDate>Wed, 18 May 2011 16:30:57 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1804</guid>
		<description><![CDATA[Me ha parecido curioso este emulador que he encontrado en nixCraft, hecho en Javascript, que permite arrancar un kernel Linux directamente en el navegador. Pinchad en la imagen para acceder al sitio web: También te puede interesar:Comando chage: tiempo de vida de claves y usuarios en GNU/LinuxGestión de LVM en Linux (Logical Volume Manager)Diferencias entre [...]]]></description>
			<content:encoded><![CDATA[<p>Me ha parecido curioso este emulador que he encontrado en <a href="http://www.cyberciti.biz/" target="_blank">nixCraft</a>, hecho en Javascript, que permite <strong>arrancar un kernel Linux directamente en el navegador</strong>. Pinchad en la imagen para acceder al sitio web:</p>
<div align="center"><a href="http://bellard.org/jslinux/"><img class="size-full wp-image-1805" title="Emulador Linux Javascript" src="http://rm-rf.es/wp-content/uploads/2011/05/linux-javascript.jpg" alt="Emulador Linux Javascript" width="650" height="515" /></a></div>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/comando-chage-tiempo-de-vida-de-claves-y-usuarios-en-gnulinux/" title="Comando chage: tiempo de vida de claves y usuarios en GNU/Linux">Comando chage: tiempo de vida de claves y usuarios en GNU/Linux</a></li><li><a href="http://rm-rf.es/gestion-de-lvm-en-linux-logical-volume-manager/" title="Gestión de LVM en Linux (Logical Volume Manager)">Gestión de LVM en Linux (Logical Volume Manager)</a></li><li><a href="http://rm-rf.es/diferencias-entre-soft-symbolic-y-hard-links/" title="Diferencias entre soft (symbolic) y hard links">Diferencias entre soft (symbolic) y hard links</a></li><li><a href="http://rm-rf.es/permisos-especiales-setuid-setgid-sticky-bit/" title="Permisos especiales (setuid, setgid, sticky bit)">Permisos especiales (setuid, setgid, sticky bit)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/emulador-linux-con-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diferencias entre soft (symbolic) y hard links</title>
		<link>http://rm-rf.es/diferencias-entre-soft-symbolic-y-hard-links/</link>
		<comments>http://rm-rf.es/diferencias-entre-soft-symbolic-y-hard-links/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 17:23:52 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[sistema ficheros]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1757</guid>
		<description><![CDATA[Hoy vamos a tratar de comprender las diferencias que existen en Unix / Linux entre los enlaces simbólicos (soft o symbolic links) y los enlaces duros (hard links). Esquema: tldp.org &#160; Enlaces simbólicos (soft / symbolic links) La manera más sencilla de comprender que es un enlace simbólico en Linux es compararlo con el &#8220;enlace [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy vamos a tratar de comprender las <strong>diferencias que existen en Unix / Linux entre los enlaces simbólicos (soft o symbolic links) y los enlaces <em>duros</em> (hard links)</strong>.</p>
<div align="center"><img src="http://rm-rf.es/wp-content/uploads/2011/04/links.png" alt="Symbolic Link Hard links Unix" title="Symbolic Link Hard links Unix" width="295" height="401" class=" size-full wp-image-1758" /></div>
<div align="center">Esquema: <a target="_blank" href="http://tldp.org/">tldp.org</a></div>
<p>&nbsp;</p>
<h2>Enlaces simbólicos (soft / symbolic links)</h2>
<p>La manera más sencilla de comprender que es un enlace simbólico en Linux es compararlo con el &#8220;enlace directo&#8221; o &#8220;shortcut&#8221; en Windows. El fichero o directorio se encuentra en un único punto del disco y los enlaces son un <em>puntero</em> contra él. <strong>Cada enlace simbólico tiene su propio número de inodo</strong> lo que permite hacer enlaces simbólicos entre distintos sistemas de ficheros.</p>
<p>Para crear enlaces (tanto simbólicos como duros) usamos el <strong>comando ln</strong>. En este caso vamos a crear un enlace simbólico (parámetro</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-s</div></div>
<p>) del fichero test:</p>
<pre>$ ln -s test enlace-a-test</pre>
<p>Si listamos ambos veremos que el enlace tiene el carácter</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">l</div></div>
<p>que lo identifica como enlace simbólico:</p>
<pre>$ ls -l
lrwxrwxrwx 1 alex alex 4 2011-04-27 18:59 enlace-a-test -&gt; test
-rw-r--r-- 1 alex alex 0 2011-04-27 18:58 test</pre>
<p>Para confirmar que el enlace simbólico tiene un inodo distinto usamos el comando stat:</p>
<pre>$ stat test
  File: «test»
  Size: 0         	Blocks: 0          IO Block: 4096   archivo regular vacío
Device: 804h/2052d	Inode: 73793       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    alex)   Gid: ( 1000/    alex)
Access: 2011-04-27 18:58:53.124142406 +0200
Modify: 2011-04-27 18:58:53.124142406 +0200
Change: 2011-04-27 18:58:53.124142406 +0200

$ stat enlace-a-test
  File: «enlace-a-test» -&gt; «test»
  Size: 4         	Blocks: 0          IO Block: 4096   vínculo simbólico
Device: 804h/2052d	Inode: 77212       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/    alex)   Gid: ( 1000/    alex)
Access: 2011-04-27 18:59:07.812139890 +0200
Modify: 2011-04-27 18:59:06.460112888 +0200
Change: 2011-04-27 18:59:06.460112888 +0200</pre>
<p>También lo podemos verificar sacando el inodo en el ls (</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-i</div></div>
<p>):</p>
<pre>$ ls -li
77212 lrwxrwxrwx 1 alex alex 4 2011-04-27 18:59 enlace-a-test -&gt; test
73793 -rw-r--r-- 1 alex alex 0 2011-04-27 18:58 test</pre>
<p>Hay que tener en cuenta, que en Linux / Unix (al igual que con los accesos directos de Windows), <strong>si borramos el fichero o directorio origen, el enlace simbólico permanece pero los datos desaparecen para siempre</strong>.<br />
&nbsp;</p>
<h2>Enlaces duros (hard links)</h2>
<p>Los enlaces duros lo que hacen es <strong>asociar dos o más ficheros compartiendo el mismo inodo</strong>. Esto hace que cada enlace duro es una copia exacta del resto de ficheros asociados, tanto de datos como de permisos, propietario, etc. Esto implica también que cuando se realicen cambios en uno de los enlaces o en el fichero este también se realizará en el resto de enlaces.</p>
<p>Los enlaces duros <strong>no pueden hacerse contra directorios y tampoco fuera del propio sistema de ficheros</strong>.</p>
<p>Vamos a crear un hard link contra el fichero &#8220;test&#8221; de antes y veremos que efectivamente comparten inodo y que los datos se sincronizan entre ambos:</p>
<pre>$ ln test enlace-duro-test
$ ls -li
73793 -rw-r--r-- 2 alex alex 5 2011-04-27 19:09 enlace-duro-test
73793 -rw-r--r-- 2 alex alex 5 2011-04-27 19:09 test</pre>
<p>En la primera columna verificamos que tienen el mismo número de inodo y en la tercera se especifica cuando enlaces duros tiene el fichero. Si hacéis cambios en uno de ellos veréis que también se hacen en el resto. Si por ejemplo cambiamos los permisos al fichero test:</p>
<pre>$ chmod 0755 test
$ ls -li
73793 -rwxr-xr-x 2 alex alex 5 2011-04-27 19:09 enlace-duro-test
73793 -rwxr-xr-x 2 alex alex 5 2011-04-27 19:09 test</pre>
<p>Y finalmente el stat de cada uno verifica todo lo que comentamos:</p>
<pre>
$ stat test
  File: «test»
  Size: 5         	Blocks: 8          IO Block: 4096   archivo regular
Device: 804h/2052d	Inode: 73793       Links: 2
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/    alex)   Gid: ( 1000/    alex)
Access: 2011-04-27 19:09:51.528132995 +0200
Modify: 2011-04-27 19:09:53.640114896 +0200
Change: 2011-04-27 19:11:42.516138726 +0200

$ stat enlace-duro-test
  File: «enlace-duro-test»
  Size: 5         	Blocks: 8          IO Block: 4096   archivo regular
Device: 804h/2052d	Inode: 73793       Links: 2
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/    alex)   Gid: ( 1000/    alex)
Access: 2011-04-27 19:09:51.528132995 +0200
Modify: 2011-04-27 19:09:53.640114896 +0200
Change: 2011-04-27 19:11:42.516138726 +0200
</pre>
<p>&nbsp;</p>
<h2>Diferencias entre soft y hard links</h2>
<ul>
<li>Los enlaces simbólicos se pueden hacer con ficheros y directorios mientras que los duros solo entre ficheros.</li>
<li>Los enlaces simbólicos se pueden hacer entre distintos sistemas de ficheros, los duros no.</li>
<li>Los enlaces duros comparten el número de inodo, los simbólicos no.</li>
<li>En los enlaces simbólicos si se borra el fichero o directorio original, la información se pierde, en los duros no.</li>
<li>Los enlaces duros son copias exactas del fichero mientras que los simbólicos son meros punteros o &#8220;accesos directos&#8221;.</li>
</ul>
<p>Si se os ocurre alguna diferencia o apunte más no dudéis en comentarlo.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/como-montar-sistema-ficheros-nfs/" title="Cómo montar un sistema de ficheros NFS (Cliente Linux)">Cómo montar un sistema de ficheros NFS (Cliente Linux)</a></li><li><a href="http://rm-rf.es/permisos-especiales-setuid-setgid-sticky-bit/" title="Permisos especiales (setuid, setgid, sticky bit)">Permisos especiales (setuid, setgid, sticky bit)</a></li><li><a href="http://rm-rf.es/gestion-de-trabajos-en-bash-jobs-fg-bg/" title="Gestión de trabajos en BASH (jobs, fg, bg, &#038;&#8230;)">Gestión de trabajos en BASH (jobs, fg, bg, &#038;&#8230;)</a></li><li><a href="http://rm-rf.es/stdin-stdout-y-stderr-redirigir-en-unixlinux/" title="redirigir stdin, stdout y stderr en Unix/Linux">redirigir stdin, stdout y stderr en Unix/Linux</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/diferencias-entre-soft-symbolic-y-hard-links/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Permisos especiales (setuid, setgid, sticky bit)</title>
		<link>http://rm-rf.es/permisos-especiales-setuid-setgid-sticky-bit/</link>
		<comments>http://rm-rf.es/permisos-especiales-setuid-setgid-sticky-bit/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 19:49:35 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[permisos]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1747</guid>
		<description><![CDATA[En Unix existen tres bits de permisos especiales que pueden ser asignados a directorios y/o ficheros ejecutables, setuid (set user information), setgid (set group information) y sticky. setuid EL bit setuid es asignable a ficheros ejecutables, y permite que cuando un usuario ejecute dicho fichero, el proceso adquiera los permisos del propietario del fichero ejecutado. [...]]]></description>
			<content:encoded><![CDATA[<p>En Unix existen tres bits de permisos especiales que pueden ser asignados a directorios y/o ficheros ejecutables, <strong>setuid (set user information), setgid (set group information) y sticky</strong>.</p>
<h2>setuid</h2>
<p>EL bit setuid es asignable a ficheros ejecutables, y permite que <strong>cuando un usuario ejecute dicho fichero, el proceso adquiera los permisos del propietario del fichero ejecutado</strong>. El ejemplo más claro de fichero ejecutable y con el bit setuid el</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">su</div></div>
<p>.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">su</div></div>
<p>sirve para ejecutar una shell con identificadores de grupo y de usuario distintos al nuestro, por ello ha de tener este bit y así permitir adquirir al usuario temporalmente permisos administrativos para poder hacer el cambio de usuario.</p>
<p>Podemos ver que el bit está asignado (s) haciendo un ls:</p>
<pre>$ ls -l /bin/su
-rw<strong>s</strong>r-xr-x 1 root root 31012 2009-04-04 07:49 /bin/su</pre>
<p>Para asignar este bit a un fichero:</p>
<pre># chmod u+s /bin/su</pre>
<p>Y para quitarlo:</p>
<pre># chmod u-s /bin/su</pre>
<p>Lógicamente, conviene utilizar este bit con extremo cuidado ya que puede provocar una escalada de privilegios en situaciones inseguras. Para que veáis un ejemplo de lo que se podría hacer.</p>
<p>El usuario &#8220;alex&#8221; no tiene permisos para ejecutar correctamente un fdisk -l:</p>
<pre>alex@linux:~$ fdisk -l</pre>
<p>La salida es 0, pero si asignamos el bit setuid al binario de fdisk&#8230;</p>
<pre># ls -l /sbin/fdisk
-rwsr-xr-x 1 root root 93048 2009-02-18 20:43 /sbin/fdisk</pre>
<p>Probamos de nuevo a ejecutar fdisk con el usuario &#8220;alex&#8221; y conseguimos privilegios de root:</p>
<pre>alex@linux:~$ fdisk -l

Disco /dev/sda: 160.0 GB, 160041885696 bytes
255 cabezas, 63 sectores/pista, 19457 cilindros
Unidades = cilindros de 16065 * 512 = 8225280 bytes
Identificador de disco: 0x000c3c51

Dispositivo Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sda1   *           1        3232    25959424    7  HPFS/NTFS
/dev/sda2            3233        9683    51817657+  83  Linux
/dev/sda3            9684        9855     1381590   82  Linux swap / Solaris
/dev/sda4            9856       19457    77128065   83  Linux</pre>
<p>Luego nos acordamos de volver a quitarlo:</p>
<pre># chmod u-s /sbin/fdisk</pre>
<h2>setgid</h2>
<p>Si el bit setuid permitía que el proceso adquiriera los permisos del propietario del fichero ejecutado, setgid hace lo mismo pero <strong>adquiriendo los privilegios del grupo asignado al fichero</strong>, también es asignable a directorios. Este bit entonces será muy útil cuando varios usuarios de un mismo grupo necesiten trabajar con recursos dentro de un mismo directorio.</p>
<p>En el siguiente ejemplo asignamos el bit setgid la carpeta /compartido, le asignamos permisos totales para el propietario y el grupo (770) y el bit segid (2):</p>
<pre>$ mkdir compartido &amp;&amp; chmod 2770 /compartido</pre>
<p>Si hacemos un ls veremos el bit asignado:</p>
<pre>$ ls -l
drwxrw<strong>s</strong>--- 2 alex alex      4096 2011-04-24 21:27 compartido</pre>
<p>Ahora vamos a hacer la prueba de crear un fichero dentro del directorio. Lo vamos a crear estando autenticados como root, pero al tener el bit setgid le asignará el grupo &#8220;alex&#8221; en lugar de root.</p>
<pre>$ su
# touch test
root@sistemas:/home/alex/compartido# ls -l
total 0
-rw-r--r-- 1 root alex 0 2011-04-24 21:28 test
# whoami
root</pre>
<p>En lugar de modo octal podéis asignar también los permisos setgid del siguiente modo:</p>
<pre>$ chmog g+s /compartido</pre>
<p>Y quitarlo:</p>
<pre>$ chmog g-s /compartido</pre>
<h2>sticky</h2>
<p>Este bit suele asignarse en directorios a los que todos los usuarios tienen acceso, y <strong>permite evitar que un usuario pueda borrar ficheros/directorios de otro usuario dentro de ese directorio, ya que todos tienen permiso de escritura</strong>. Seguro que lo estáis pensando, este bit se asigna siempre en /tmp y /var/tmp.</p>
<p>tmp tiene permisos 777, el bit sticky se asignaría del siguiente modo:</p>
<pre># chmod 1777 /tmp</pre>
<p>También así:</p>
<pre>chmod o+t /tmp</pre>
<p>Y para quitarlo:</p>
<pre>chmod o-t /tmp</pre>
<p>Si hacemos un ls veremos la &#8220;t&#8221; asignada:</p>
<pre>drwxrwxrw<strong>t</strong>  13 root root  4096 2011-04-24 20:55 tmp</pre>
<p>Esta es una visión general de estos tres bits especiales asignables a ficheros ejecutables y directorios en Unix/Linux.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/el-comando-umask/" title="El comando umask">El comando umask</a></li><li><a href="http://rm-rf.es/comando-chage-tiempo-de-vida-de-claves-y-usuarios-en-gnulinux/" title="Comando chage: tiempo de vida de claves y usuarios en GNU/Linux">Comando chage: tiempo de vida de claves y usuarios en GNU/Linux</a></li><li><a href="http://rm-rf.es/diferencias-entre-soft-symbolic-y-hard-links/" title="Diferencias entre soft (symbolic) y hard links">Diferencias entre soft (symbolic) y hard links</a></li><li><a href="http://rm-rf.es/gestion-de-trabajos-en-bash-jobs-fg-bg/" title="Gestión de trabajos en BASH (jobs, fg, bg, &#038;&#8230;)">Gestión de trabajos en BASH (jobs, fg, bg, &#038;&#8230;)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/permisos-especiales-setuid-setgid-sticky-bit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CentOS 5.6</title>
		<link>http://rm-rf.es/centos-5-6/</link>
		<comments>http://rm-rf.es/centos-5-6/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 20:36:17 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[centos]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1698</guid>
		<description><![CDATA[Desde hace unos días está disponible  la versión 5.6 de CentOS (derivada de Red Hat Enterprise Linux 5.6). Esta versión probablemente sea la predecesora del esperado CentOS 6. Las principales novedades que encontramos son interesantes, entre ellas el soporte del sistema de ficheros ext4: Soporte completo al sistema de ficheros ext4. libvirt actualizada a 0.8.2 [...]]]></description>
			<content:encoded><![CDATA[<div align="center"><img class=" size-full wp-image-1699" title="CentOS" src="http://rm-rf.es/wp-content/uploads/2011/04/centos.jpg" alt="CentOS" width="400" height="153" /></div>
<p>Desde hace unos días está disponible  la <strong>versión 5.6 de <a title="CentOS" href="http://rm-rf.es/sobre/centos/">CentOS</a></strong> (derivada de Red Hat Enterprise Linux 5.6). Esta versión probablemente sea la predecesora del esperado CentOS 6. Las principales novedades que encontramos son interesantes, entre ellas el soporte del sistema de ficheros ext4:</p>
<ul>
<li>Soporte completo al sistema de ficheros ext4.</li>
<li>libvirt actualizada a 0.8.2</li>
<li>Bind actualizado a to 9.7 y con soporte  NSEC3.</li>
<li>Añadido ebtables.</li>
<li>PHP 5.3.</li>
<li>Añadido Security Services Daemon (SSSD).</li>
<li>Actualizaciones de drivers, Samba3x, ghostscript, LVM, mod_nss, subversion, gcc, etc.</li>
</ul>
<p>Para sistemas dentro de la rama 5 actualizar es tan sencillo como lo siguiente, eso sí, conviene revisar si nuestro sistema es compatible con estas actualizaciones:</p>
<pre># yum update</pre>
<p>Podéis descargar los distintos instaladores a través de los <a href="http://www.centos.org/" target="_blank">mirrors en el sitio web de CentOS</a>. También podéis revisar la <a title="Guía de instalación GNU/Linux CentOS 5" href="http://rm-rf.es/manual-instalar-gnu-linux-centos-5/">guía de instalación de CentOS</a>.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/como-montar-servidor-dhcp/" title="Cómo montar un servidor DHCP">Cómo montar un servidor DHCP</a></li><li><a href="http://rm-rf.es/instalar-configurar-vnc-server-en-centos-rhel-fedora/" title="Instalar y configurar vnc-server en CentOS/RHEL/Fedora">Instalar y configurar vnc-server en CentOS/RHEL/Fedora</a></li><li><a href="http://rm-rf.es/asignar-ip-virtual-linux/" title="Cómo añadir IP virtual en Linux">Cómo añadir IP virtual en Linux</a></li><li><a href="http://rm-rf.es/dm-multipath-en-redhat-y-centos/" title="DM-Multipath en RedHat y CentOS">DM-Multipath en RedHat y CentOS</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/centos-5-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asignar prioridad de CPU a procesos en Linux con nice</title>
		<link>http://rm-rf.es/asignar-prioridad-de-cpu-a-procesos-en-linux-con-nice/</link>
		<comments>http://rm-rf.es/asignar-prioridad-de-cpu-a-procesos-en-linux-con-nice/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 19:54:51 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[comando linux]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[nice]]></category>
		<category><![CDATA[procesos]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1684</guid>
		<description><![CDATA[El comando nice en Linux nos permite modificar la prioridad de un proceso frente al resto dentro del sistema. El kernel Linux es el encargado de planificar y asignar tiempo de CPU a cada uno de los procesos que corren en el sistema. El rango de asignación de prioridad disponible es de -20 a 20 [...]]]></description>
			<content:encoded><![CDATA[<p>El comando <strong>nice</strong> en <strong>Linux</strong> nos permite <strong>modificar la prioridad de un proceso frente al resto dentro del sistema</strong>. El <strong>kernel Linux es el encargado de planificar y asignar tiempo de CPU</strong> a cada uno de los procesos que corren en el sistema. El rango de asignación de prioridad disponible es de <strong>-20 a 20</strong> , siendo -20 la mayor prioridad y 20 la menor. Gracias a nice podemos asegurarnos que en momentos de usos elevados de CPU los procesos adecuados reciban el mayor % de la misma.</p>
<p>La sintaxis del comando nice es la siguiente:</p>
<pre># nice -n&lt;PRIORIDAD&gt; COMANDO</pre>
<p>Así pues, si quisiéramos ejecutar un proceso con la mayor prioridad disponible (en este caso el script prueba.pl) haríamos lo siguiente:</p>
<pre># nice -n-20 ./prueba.pl</pre>
<p><em>Nota: es necesario ser superusuario para poder utilizar el comando nice</em></p>
<p>Ejecutando el <a title="El comando ps: Listar y manejar procesos" href="http://rm-rf.es/el-comando-ps-listar-y-manejar-procesos/">comando ps</a> observaremos como efectivamente la prioridad ha sido asignada correctamente:</p>
<pre># ps al
F   UID   PID  PPID PRI  <strong>NI</strong>    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND

4     0  4204  3985   0 <strong>-20</strong>   1872   504 n_tty_ S&lt;+  pts/0      0:00 /bin/sh ./prueba.pl</pre>
<p><em>Nota: hay que pasar el parámetro</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">l</div></div>
<p>para visualizar la columna de nice.</em></p>
<p>Si en cambio quisieramos que tuviera la mínima prioridad pues haríamos todo lo contrario:</p>
<pre># nice -n20 ./prueba.pl</pre>
<p>Si ejecutamos el comando nice sin parámetros nos indicará el valor asignado actualmente para nice:</p>
<pre># nice
0</pre>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/linux-listar-procesos-cpu-memoria/" title="Linux: Listar procesos por % cpu o uso de memoria">Linux: Listar procesos por % cpu o uso de memoria</a></li><li><a href="http://rm-rf.es/linux-mostrar-informacion-de-cpu/" title="Linux: Mostrar información de CPU">Linux: Mostrar información de CPU</a></li><li><a href="http://rm-rf.es/el-comando-ps-listar-y-manejar-procesos/" title="El comando ps: Listar y manejar procesos">El comando ps: Listar y manejar procesos</a></li><li><a href="http://rm-rf.es/debug-de-procesos-en-solaris-con-truss/" title="Debug de procesos en Solaris con Truss">Debug de procesos en Solaris con Truss</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/asignar-prioridad-de-cpu-a-procesos-en-linux-con-nice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gestión de trabajos en BASH (jobs, fg, bg, &amp;&#8230;)</title>
		<link>http://rm-rf.es/gestion-de-trabajos-en-bash-jobs-fg-bg/</link>
		<comments>http://rm-rf.es/gestion-de-trabajos-en-bash-jobs-fg-bg/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 20:55:46 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1664</guid>
		<description><![CDATA[Hoy vamos a ver el modo de gestionar trabajos, procesos o aplicaciones que corren dentro de un sistema Linux/Unix. El objetivo es aprender a poner un proceso que se está ejecutando en segundo plano, suspenderlo, volver a ponerlo en primer plano, reactivarlo, etc. Ejecutar un trabajo/proceso en segundo plano Para ejecutar algo en segundo plano, [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy vamos a ver el modo de <strong>gestionar trabajos, procesos o aplicaciones que corren dentro de un sistema Linux/Unix</strong>. El objetivo es aprender a poner un proceso que se está ejecutando en segundo plano, suspenderlo, volver a ponerlo en primer plano, reactivarlo, etc.</p>
<h3>Ejecutar un trabajo/proceso en segundo plano</h3>
<p>Para ejecutar algo en segundo plano, debemos utilizar el carácter &amp; y colocarlo tras el comando o proceso a ejecutar:</p>
<pre>$ top &amp;</pre>
<p>Os recomiendo también revisar esta entrada sobre el <a title="nohup: Mantiene la ejecución de un comando pese a salir de la terminal" href="http://rm-rf.es/nohup-mantiene-ejecucion-comando-pese-salir-terminal/">comando nohup</a>.</p>
<h3>Visualizar los procesos que se encuentran en segundo plano</h3>
<p>Para obtener un listado de los procesos que están ejecutándose en segundo plano utilizaremos el comando</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bg</div></div>
<p>(<em>background</em>). La salida del mismo nos indicará cada uno de los procesos con su número de trabajo asignado entre corchetes.</p>
<pre>$ bg
[1]+ top &amp;</pre>
<h3>Traer a primer plano los procesos que se encuentran en segundo plano</h3>
<p>Para ello utilizaremos el comando</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fg</div></div>
<p>(<em>foreground</em>) junto con el ID del trabajo anteponiéndole %:</p>
<pre>$ fg %1</pre>
<h3>Suspender un proceso que tenemos corriendo en primer plano</h3>
<p>Si estamos ejecutando un trabajo en pantalla/terminal y queremos suspenderlo colocarlo en segundo plano utilizaremos la combinación de teclas <strong>Ctrl + Z</strong>. Automáticamente nos asignará el ID de trabajo para poder gestionarlo posteriormente:</p>
<pre>top - 21:20:57 up 33 min,  2 users,  load average: 0.99, 0.98, 0.81
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s): 23.0%us,  4.7%sy,  0.0%ni, 70.5%id,  1.6%wa,  0.1%hi,  0.0%si,  0.0%st
Mem:   2052640k total,   948528k used,  1104112k free,    55876k buffers
Swap:  1951888k total,        0k used,  1951888k free,   461444k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                  

  776 root      15  -5     0    0    0 S    0  0.0   0:00.02 kjournald2                                                                                                               

[1]+  Stopped                 top</pre>
<p>Para volver a arrancarlo en primer plano después:</p>
<pre>$ fg %1</pre>
<p>Y para ponerlo en segundo plano:</p>
<pre>$ bg %1</pre>
<p>Esto es realmente útil en casos como por ejemplo, estamos ejecutando un script que se demora más de lo esperado y necesitamos ejecutarlo sin necesidad de una terminal, lo dejamos en segundo plano y seguirá corriendo sin necesidad de ningún entorno visual. También si solo disponemos de una única terminal y necesitamos realizar varias tareas simultaneamente.</p>
<h3>Visualizar los trabajos en primer plano, suspendidos, en segundo plano</h3>
<p>El comando</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">jobs</div></div>
<p>nos permite visualizar un listado de los trabajos en el sistema junto con su estado e identificador:</p>
<pre>$ jobs
[1]   Stopped                 top
[2]-  Stopped                 top
[3]+  Stopped                 vim</pre>
<p>Un resumen práctico sería el siguiente. Arrancamos un programa (<em>por ejemplo thunderbird</em>) desde línea de comandos:</p>
<pre>$ thunderbird</pre>
<p>Ocurre que necesitamos pararlo temporalmente. En la terminal desde la que lo hemos lanzado presionamos <strong>Ctrl + Z</strong>.</p>
<p>Ahora el programa está parado a la espera de ser reactivado cuando queramos:</p>
<pre>$ thunderbird
^Z
[1]+  Stopped                 thunderbird
$ jobs
[1]+  Stopped                 thunderbird</pre>
<p>Podemos arrancarlo de nuevo pero en segundo plano:</p>
<pre>$ bg %1
[1]+ thunderbird &amp;</pre>
<p>O en primer plano:</p>
<pre>$ fg %1</pre>
<p>Recordad que es interesante revisar la ayuda (páginas man y &#8211;help) de los comandos para obtener información sobre su utilización y las posibilidades que nos ofrece.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/automatizar-tareas-ftp-dentro-de-un-script-en-bash/" title="Automatizar tareas FTP dentro de un script en BASH">Automatizar tareas FTP dentro de un script en BASH</a></li><li><a href="http://rm-rf.es/coleccion-definitiva-de-chuletas-linux-unix/" title="Colección definitiva de chuletas Linux-Unix">Colección definitiva de chuletas Linux-Unix</a></li><li><a href="http://rm-rf.es/diferencias-entre-soft-symbolic-y-hard-links/" title="Diferencias entre soft (symbolic) y hard links">Diferencias entre soft (symbolic) y hard links</a></li><li><a href="http://rm-rf.es/permisos-especiales-setuid-setgid-sticky-bit/" title="Permisos especiales (setuid, setgid, sticky bit)">Permisos especiales (setuid, setgid, sticky bit)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/gestion-de-trabajos-en-bash-jobs-fg-bg/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cómo compilar Apache y PHP en Linux</title>
		<link>http://rm-rf.es/como-compilar-apache-php-linux/</link>
		<comments>http://rm-rf.es/como-compilar-apache-php-linux/#comments</comments>
		<pubDate>Sat, 19 Mar 2011 16:53:45 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[compilador]]></category>
		<category><![CDATA[howto]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1641</guid>
		<description><![CDATA[En este artículo voy a explicar los pasos básicos para compilar Apache y PHP (con soporte para MySQL y otros módulos) en GNU/Linux, concretamente bajo RHEL, aunque se puede aplicar a cualquier distribución (CentOS, Fedora, Debian, etc). Lo primero que tenemos que comprobar es que tengamos instalados los compiladores necesarios (C / C++&#8230;) para poder [...]]]></description>
			<content:encoded><![CDATA[<p>En este artículo voy a explicar los <strong>pasos básicos para compilar Apache y PHP (con soporte para MySQL y otros módulos) en GNU/Linux</strong>, concretamente bajo RHEL, aunque se puede aplicar a cualquier distribución (CentOS, Fedora, Debian, etc).</p>
<p>Lo primero que tenemos que comprobar es que tengamos <a title="Red-Hat y Centos: Instalación de compiladores C / C++" href="http://rm-rf.es/red-hat-centos-instalacion-compiladores-c/">instalados los compiladores necesarios</a> (C / C++&#8230;) para poder empezar a trabajar, en RHEL y CentOS podemos instalarlos por yum, y en Debian y similar por apt:</p>
<pre># yum install gcc gcc-c++ autoconf make automake</pre>
<h2>Compilar Apache</h2>
<p>Para compilar Apache lo primero que debemos hacer es bajarnos las fuentes de la versión que queramos instalar. En este caso vamos a <a href="http://httpd.apache.org/download.cgi#apache22" target="_blank">bajar la última versión estable</a> de la rama 2.2, la 2.2.17:</p>
<pre># wget http://apache.rediris.es//httpd/httpd-2.2.17.tar.gz</pre>
<p>Descomprimimos (podéis hacerlo en el directorio /usr/src/ destinado a las fuentes o en donde más rabia os dé):</p>
<pre>#  tar -xzvf httpd-2.2.17.tar.gz</pre>
<p>Nos ubicamos en la ruta donde hayamos descomprimido las fuentes:</p>
<pre># cd /usr/src/httpd-2.2.17</pre>
<p>Ya estamos listos para comenzar a configurar nuestra instalación. El primer paso de toda compilación es el script <strong>configure</strong>, básicamente es el <strong>momento en el que podemos personalizar como queramos nuestra instalación</strong> (lugar donde instalar apache, módulos a compilar, cómo cargar esos módulos, etc) también se realizan ciertos chequeos para verificar que la compilación se puede realizar correctamente.</p>
<p>Para ver todas las posibilidades que nos ofrece la configuración, siempre tendremos que ejecutar la ayuda, resultaría tedioso explicar aquí todas las opciones de compilación así que nos vamos a centrar en una instalación básica, para personalizar vuestras instalaciones:</p>
<pre># ./configure --help</pre>
<p>Bien, en nuestro caso la línea de configure va a ser la siguiente:</p>
<pre># ./configure --prefix=/usr/local/apache --enable-headers --enable-rewrite --enable-expires --enable-so --disable-authz-default</pre>
<ul>
<li><strong>&#8211;prefix=&lt;ruta&gt;</strong> será la ruta en la que vamos a instalar Apache, en este caso /usr/local/apache.</li>
<li><strong>&#8211;enable-MODULO</strong>: para la activación de módulos utilizamos este parámetro. En la línea de configuración vemos que hemos activado <em>mod_rewrite, mod_headers y mod_expires</em>. Si no especificamos nada, los módulos se cargan de forma estática, para cargarlos de forma dinámica (DSO, explicado en el siguiente punto) utilizamos <strong>&#8211;enable-MODULO=shared</strong>.</li>
<li><strong>&#8211;enable-so</strong> Permitimos a Apache cargar módulos compartidos (Dynamic Shared Object (DSO)), php será uno de ellos. Esta opción también nos permitirá añadir nuevos módulos sin necesidad de recompilar y de forma dinámica (añadiendo simplemente el módulo mediante &#8220;Load Module&#8221; en la configuración). Los modulos que añadamos a través de esta línea de compilación, y sin especificar <em>shared</em> se instalarán de forma estática.</li>
<li><strong>&#8211;disable-MODULO</strong>: He puesto un ejemplo de deshabilitar un módulo en la línea de compilación para que veáis que se pueden deshabilitar módulos (por defecto Apache carga algunos módulos que quizás no te interesen), en el ejemplo desactivamos authz-default</li>
</ul>
<p>Una vez que tengamos claro que queremos y que no queremos instalar, podemos <em>construir</em> nuestra compilación, para ello simplemente ejecutamos make (según la cantidad de módulos que hayas configurado le puede costar un rato, puedes ir a tomar un café mientras ;) ):</p>
<pre># make</pre>
<p>Y una vez que haya terminado, finalizamos la compilación e instalamos apache:</p>
<pre># make install</pre>
<p>Cuando haya terminado ya podemos probar nuestra instalación de apache, lo arrancamos:</p>
<pre># /usr/local/apache/bin/apachectl start</pre>
<p>Si accedemos vía web, por ejemplo desde la IP del servidor o el host que tenga configurado, deberíamos visualizar lo siguiente:</p>
<p><strong><em>It works!</em></strong></p>
<h3>Cómo actualizar Apache</h3>
<p>La actualización por compilación de fuentes es bastante sencilla. Simplemente tendríamos que seguir este mismo proceso, pero en el punto del configure apache nos lo pone más fácil. <strong>En la ruta /usr/local/apache/build encontraréis un fichero llamado config.nice que guarda vuestros parámetros de compilación</strong>, con lo que podéis usar dicho fichero en lugar de crear un nuevo configure. El proceso sería entonces, bajar las fuentes de la nueva versión y:</p>
<pre># ./config.nice
# make
# make install
</pre>
<p><em><strong>Nota</strong>: Los ficheros de configuración, logs y documentos no se sobreescribirán durante la actualización.</em></p>
<h2>Compilar PHP</h2>
<p>Ahora que ya tenemos Apache funcionando, es hora de instalar PHP. Vamos a seguir el mismo procedimiento que para compilar Apache. En este caso vamos a instalar PHP con soporte para MySQL y algún otro módulo que veremos más adelante.</p>
<p>Empezamos descargando las fuentes desde el <a href="http://php.net/" target="_blank">sitio web de PHP</a>. En este caso la última versión estable de la rama 5.3, la 5.3.6. De nuevo nos colocamos en el directorio src o donde queráis trabajar mientras instalamos:</p>
<pre># cd /usr/sr
# wget http://es2.php.net/get/php-5.3.6.tar.gz/from/es.php.net/mirror</pre>
<p>Descomprimimos y nos colocamos dentro del directorio:</p>
<pre># tar -xzvf php-5.3.6.tar.gz
# cd php-5.3.6</pre>
<p>Ahora, al igual que con Apache llega el momento de crear la línea de configuración, el configure. Del mismo modo podemos seleccionar la ruta de instalación, los módulos y una buena cantidad de parámetros para personalizar nuestra instalación. Es imprescindible pues revisar la ayuda:</p>
<pre># ./configure --help</pre>
<p>Una vez que tenemos claro que y como queremos instalar, comenzamos con el configure:</p>
<pre># ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-mysql --enable-ftp --disable-pdo --disable-ctype</pre>
<p>Pasamos a explicar esta línea de configure:</p>
<ul>
<li><strong>&#8211;prefix</strong>: al igual que con Apache especificamos la ruta en la que instalaremos php.</li>
<li><strong>&#8211;with-config-file-path</strong>: especificamos la ruta donde se encontrará el fichero de configuración php.ini.</li>
<li><strong>&#8211;with-apxs2</strong>: como vamos a compilar php como módulo dinámico (DSO) updatede apache especificamos la ruta a apxs.</li>
<li><strong>&#8211;with-libxml2</strong>: para evitar el error provocado porque la compilación no encuentra xml2-config necesitaremos tener instalado libxml2-devel (yum install libxml2-devel. El error es <em>configure: error: xml2-config not found. Please check your libxml2 installation</em>.</li>
<li><strong>&#8211;with-mysql</strong>: habilitamos soporte para MySQL. Por supuesto, antes de habilitar cualquier extensión, si depende de algún programa hay que instalarlo antes, en este caso el cliente MySQL y las headers (paquete devel):
<pre>yum install mysql mysql-devel</pre>
</li>
<li><strong>&#8211;enable-ftp</strong>: habilitamos soporte para FTP. Podemos habilitar cualquier otro módulo con <strong>&#8211;enable-MODULO</strong></li>
<li><strong>&#8211;disable-pdo</strong>: deshabilitamos el soporte para PDO. Podemos deshabilitar cualquier otro módulo con <strong>&#8211;disable-MODULO</strong></li>
</ul>
<p>Una vez seleccionados los módulos a instalar y las opciones correspondientes podemos comenzar a compilar (puede tardar un rato):</p>
<pre># make</pre>
<p>Si todo ha ido bien y no hemos recibido errores podemos finalizar la instalación:</p>
<pre># make install</pre>
<p>Una vez instalado automáticamente habrá añadido la carga del módulo en nuestra configuración de apache (fichero httpd.conf):</p>
<pre>LoadModule php5_module modules/libphp5.so</pre>
<p>Ahora solo nos queda indicar a Apache como tiene que interpretar los ficheros php, tenemos que añadir la siguiente línea dentro del fichero httpd.conf. Podemos añadirla junto a los demás AddType, buscadlos y colocadla debajo:</p>
<pre>AddType application/x-httpd-php .php</pre>
<p>Ahora solo queda reiniciar apache y verificar el funcionamiento de php. Antes comprobamos que la sintaxis del fichero de configuración httpd.conf es correcta:</p>
<pre># /usr/local/apache/bin/apachectl configtest
Syntax OK</pre>
<p>Reiniciamos apache:</p>
<pre># /usr/local/apache/bin/apachectl restart</pre>
<p>Podemos crear un fichero de pruebas en php para verificar todos los parámetros y módulos de la instalación de php, el contenido es el siguiente:</p>
<pre>&lt;? phpinfo(); ?&gt;</pre>
<p>Lo colocamos en el DocumentRoot por defecto, en nuestro caso es /usr/local/apache/htdocs y lo ejecutamos desde el navegador, el resultado es el siguiente, ya tenemos Apache y php operativo:</p>
<div align="center"><img src="http://rm-rf.es/wp-content/uploads/2011/03/php.jpeg" alt="php 5.3.6" title="php 5.3.6" width="450" height="525" class="size-full wp-image-1651" /></div>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/pecl-configure-error-cannot-run-c-compiled-programs/" title="pecl: configure: error: cannot run C compiled programs">pecl: configure: error: cannot run C compiled programs</a></li><li><a href="http://rm-rf.es/configure-error-libpng-aso-not-found-compilando-php-con-64-bits/" title="configure: error: libpng.(a|so) not found (compilando PHP con 64 bits)">configure: error: libpng.(a|so) not found (compilando PHP con 64 bits)</a></li><li><a href="http://rm-rf.es/activar-pcntl-para-php-en-cpanel-easyapache/" title="Activar pcntl para PHP en cPanel (easyapache)">Activar pcntl para PHP en cPanel (easyapache)</a></li><li><a href="http://rm-rf.es/suphp-premature-end-of-script-headers-en-el-error_log/" title="suPHP: &#8220;Premature end of script headers&#8221; en el error_log">suPHP: &#8220;Premature end of script headers&#8221; en el error_log</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/como-compilar-apache-php-linux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>redirigir stdin, stdout y stderr en Unix/Linux</title>
		<link>http://rm-rf.es/stdin-stdout-y-stderr-redirigir-en-unixlinux/</link>
		<comments>http://rm-rf.es/stdin-stdout-y-stderr-redirigir-en-unixlinux/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 20:34:17 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[stderr]]></category>
		<category><![CDATA[stdin]]></category>
		<category><![CDATA[stdout]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1598</guid>
		<description><![CDATA[En todas las variantes de Unix tenemos tres flujos estándar que, a modo de canales, conectan la entrada y salida (I/O) de un comando/aplicación con la terminal/consola cuando se ejecuta, son los siguientes: standard input (stdin) standard output (stdout) standard error (stderr) Vamos a explicar los usos que podemos dar estos tres canales para enviar [...]]]></description>
			<content:encoded><![CDATA[<p>En todas las variantes de Unix tenemos tres flujos estándar que, a modo de canales, conectan la entrada y salida (I/O) de un comando/aplicación con la terminal/consola cuando se ejecuta, son los siguientes:</p>
<ul>
<li> standard input (stdin)</li>
<li>standard output (stdout)</li>
<li>standard error (stderr)</li>
</ul>
<p>Vamos a explicar los usos que podemos dar estos tres canales para <strong>enviar y recoger los datos que surgen de la ejecución de un script, comando o aplicación</strong>.</p>
<h3>standard input (stdin)</h3>
<p><strong>Stdin, o standard input son los datos que son enviados al programa</strong>, quizás cara al usuario de terminal sea el menos utilizado ya que lo normal suele ser interpretar los datos que el programa o comando envía, y no al revés. Normalmente stdin es texto enviado por el usuario, vamos a ver un ejemplo.</p>
<p>En un script en perl, podemos solicitar la interacción del usuario mediante STDIN, por ejemplo en este caso recogemos mediante STDIN el valor de dos variables que el usuario escribe:</p>
<pre>#!/usr/bin/perl
print "Introduce tu nombre:\n";
my $nombre = &lt;STDIN&gt;;
print "Introduce tu apellido:\n";
my $apellido = &lt;STDIN&gt;;</pre>
<p>Otro ejemplo que se me ocurre es el que puse en la entrada de <a title="Automatizar FTP" href="http://rm-rf.es/automatizar-tareas-ftp-dentro-de-un-script-en-bash/" target="_blank">automatizar comandos FTP</a>, en este caso a la conexión FTP le pasamos de antemano los comandos a ejecutar:</p>
<pre>ftp -inv direccion_ip&lt;&lt;FINFTP
comando1
comando2
comando3
FINFTP</pre>
<h3>standard output (stdout)</h3>
<p>A través de la salida estándar, &#8220;<strong>stdout</strong>&#8221; <strong>se reciben los datos que vuelca el comando o programa durante su ejecución</strong>, ejemplos sencillos de stdout serían por ejemplo el resultado de un &#8220;ls&#8221;,&#8221;cat&#8221; o cualquier otro comando de terminal. En cambio, hay otros comandos o programas que no muestran salida (a no ser que se especifique), como por ejemplo mover o copiar ficheros. Como ya sabemos cualquiera de estos flujos de datos se puede manipular, vamos a ver un ejemplo  para comprender sus posibilidades.</p>
<p>Si hicieramos un &#8220;ls&#8221; a una carpeta, la salida de datos (stdout) se muestra en nuestra terminal:</p>
<pre>$ ls
backups  cpq    games  local  log   opt  spool  www
cache    crash  lib    lock   mail  run  tmp</pre>
<p>Para manipular la salida estándar, utilizaremos el símbolo &#8220;&gt;&#8221;. Si por ejemplo quisieramos que stdout fuera redirigido a un fichero de texto, haríamos así:</p>
<pre>$ ls &gt; fichero.txt</pre>
<p>Como podréis comprobar, por pantalla no aparece el resultado del comando, sino que se ha almacenado en el fichero indicado:</p>
<pre>$ cat fichero.txt
backups  cpq    games  local  log   opt  spool  www
cache    crash  lib    lock   mail  run  tmp</pre>
<h3>standard error (stderr)</h3>
<p><strong>A través del canal stderr los programas o comandos suelen enviar el informe de error de la ejecución de un comando en caso de fallar</strong>. En nuestros scripts o comandos podemos combinar el uso de stdout y stderr para separar la salida estándar de los errores, almacenarlos en registros independientes o manipularlos por separado.</p>
<p>En el siguiente ejemplo vamos a ejecutar un &#8220;ls&#8221; con parámetros incorrectos, por defecto la salida de errores se volcará en pantalla (terminal):</p>
<pre>$ ls -7
ls: opción incorrecta -- '7'
Pruebe `ls --help' para más información.</pre>
<p>Si quisieramos almacenar los errores de la ejecución del comando en caso de suceder, podemos volcarlos usando en lugar del símbolo &#8220;&gt;&#8221; el número 2 seguido de &#8220;&gt;&#8221;, &#8220;2&gt;&#8221;:</p>
<pre>$ ls -7 2&gt; errores.log</pre>
<p>Como podéis ver los errores ya no aparecen por pantalla, pero si abrimos el fichero de log tenemos el registro del fallo:</p>
<pre>$ cat errores.log
ls: opción incorrecta -- '7'
Pruebe `ls --help' para más información.</pre>
<p>Si quisieramos redirigir tanto el stdout como stderr al mismo sitio, en lugar de especificar dos veces el destino podemos hacerlo del siguiente modo &#8220;2&gt;&amp;1&#8243;. Vamos a ver un ejemplo</p>
<p>Stdout y stderr a un fichero de log:</p>
<pre>$ ls -3 &gt; fichero.log 2&gt;&amp;1</pre>
<p>Vamos a ver un ejemplo práctico de mysql. El comando mysqldump vuelca a stdout el dump de una base de datos, seguro que nos es más útil en un fichero que por pantalla, así mismo, si surge algún error nos conviene revisarlo así que lo volcamos a otro fichero distinto de log:</p>
<pre>$ mysqldump test &gt; test.sql 2&gt; error.log</pre>
<p>Otra opción es querer que tanto stdout  como stderr vayan directamente a la basura (/dev/null):</p>
<pre>$ ls -l &gt; /dev/null 2&gt;&amp;1</pre>
<p>Este es el uso más básico que podemos dar a estos tres importantes <strong>flujos estandar Unix</strong>, si tenéis cualquier duda podéis consultarla a través de los comentarios.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/diferencias-entre-soft-symbolic-y-hard-links/" title="Diferencias entre soft (symbolic) y hard links">Diferencias entre soft (symbolic) y hard links</a></li><li><a href="http://rm-rf.es/permisos-especiales-setuid-setgid-sticky-bit/" title="Permisos especiales (setuid, setgid, sticky bit)">Permisos especiales (setuid, setgid, sticky bit)</a></li><li><a href="http://rm-rf.es/gestion-de-trabajos-en-bash-jobs-fg-bg/" title="Gestión de trabajos en BASH (jobs, fg, bg, &#038;&#8230;)">Gestión de trabajos en BASH (jobs, fg, bg, &#038;&#8230;)</a></li><li><a href="http://rm-rf.es/automatizar-tareas-ftp-dentro-de-un-script-en-bash/" title="Automatizar tareas FTP dentro de un script en BASH">Automatizar tareas FTP dentro de un script en BASH</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/stdin-stdout-y-stderr-redirigir-en-unixlinux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

