<?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; Comandos</title>
	<atom:link href="http://rm-rf.es/categoria/comandos-unix/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>Fri, 18 May 2012 21:00:07 +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>Debug de procesos en Solaris con Truss</title>
		<link>http://rm-rf.es/debug-de-procesos-en-solaris-con-truss/</link>
		<comments>http://rm-rf.es/debug-de-procesos-en-solaris-con-truss/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 06:58:38 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[procesos]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2595</guid>
		<description><![CDATA[Podríamos decir que truss es el equivalente en Solaris a strace de Linux, si bien existen también otras alternativas como dtrace que también cumplen perfectamente esta función. Truss es una utilidad que permite ejecutar el comando especificado o un proceso concreto y muestra durante su ejecución las llamadas al sistema que ejecuta y las señales [...]]]></description>
			<content:encoded><![CDATA[<p>Podríamos decir que <strong>truss</strong> es el equivalente en <strong>Solaris</strong> a <strong>strace</strong> de <strong>Linux</strong>, si bien existen también otras alternativas como dtrace que también cumplen perfectamente esta función.</p>
<p>Truss es una utilidad que permite ejecutar el comando especificado o un proceso concreto y muestra durante su ejecución las llamadas al sistema que ejecuta y las señales que recibe. Esto permite ver todo el proceso de ejecución y hacer debug de cualquier error o fault que ocurre.</p>
<p>Vamos a ver unos ejemplos. Lo más básico sería ejecutar truss seguido del comando del que queremos ver su debug, en el siguiente ejemplo simplemente ejecutamos el comando df:</p>
<pre># <strong>truss df</strong>
execve("/usr/gnu/bin/df", 0x08047E6C, 0x08047E74)  argc = 1
sysinfo(SI_MACHINE, "i86pc", 257)               = 6
mmap(0x00000000, 32, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, -1, 0) = 0xD1BB0000
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0) = 0xD1BA0000
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0) = 0xD1B90000
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, -1, 0) = 0xD1B80000
memcntl(0xD1BB8000, 32064, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0
memcntl(0x08050000, 15312, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0
resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = 12
resolvepath("/usr/gnu/bin/df", "/usr/gnu/bin/df", 1023) = 15
sysconfig(_CONFIG_PAGESIZE)                     = 4096
stat64("/usr/gnu/bin/df", 0x08047AB0)           = 0
open("/var/ld/ld.config", O_RDONLY)             Err#2 ENOENT
stat64("/lib/libc.so.1", 0x08047260)            = 0
...
...
...</pre>
<p>No muestro todo el output debido a su longitud, podemos volcarlo a un fichero para analizarlo mejor en lugar de la salida stderr:</p>
<pre># truss -o salida.out df</pre>
<p>En el siguiente ejemplo hacemos debug de un proceso que ya se encuentra en ejecución:</p>
<pre># truss -rall -wall -f -p &lt;PID&gt;</pre>
<p>&#8220;-rall&#8221; implica ver todos los datos de lectura y &#8220;-wall&#8221; todos los de escritura, con &#8220;-f&#8221; vemos los procesos fordked y &#8220;-p&#8221; especifica el PID.</p>
<p>Podéis ver más ejemplos e información del comando en la página man correspondiente. A continuación podéis ver un par:</p>
<pre>$ man truss</pre>
<p>Trazar las llamadas de sistema open, close, read y write únicamente:</p>
<pre># truss -t open,close,read,write find . -print &gt;salida.out</pre>
<p>Trazar todas las llamads a funciones a nivel de usuario desde y hacia cualquier sitio:</p>
<pre># truss -u a.out -u ld:: -u :: &lt;comando&gt;</pre>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/activar-debug-para-asp-en-iis7/" title="Activar DEBUG para ASP en IIS7">Activar DEBUG para ASP en IIS7</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><li><a href="http://rm-rf.es/consultar-y-exportar-certificados-ssl-en-sun-web-server-certutil-y-pkcs12/" title="Consultar y exportar certificados SSL en Sun Web Server (certutil y pkcs12)">Consultar y exportar certificados SSL en Sun Web Server (certutil y pkcs12)</a></li><li><a href="http://rm-rf.es/monitorizar-oracle-iplanet-web-server-con-get-perfdump/" title="Monitorizar Oracle iPlanet Web Server con get-perfdump">Monitorizar Oracle iPlanet Web Server con get-perfdump</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/debug-de-procesos-en-solaris-con-truss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>star: empaquetar preservando ACL y atributos extendidos (SElinux)</title>
		<link>http://rm-rf.es/star-empaquetar-preservando-acl-y-atributos-extendidos-selinux/</link>
		<comments>http://rm-rf.es/star-empaquetar-preservando-acl-y-atributos-extendidos-selinux/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 18:07:06 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[acl]]></category>
		<category><![CDATA[comprimir]]></category>
		<category><![CDATA[descomprimir]]></category>
		<category><![CDATA[selinux]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2527</guid>
		<description><![CDATA[El comando star permite comprimir y descomprimir y/o empaquetar múltiples ficheros con la posibilidad de mantener tanto los atributos extendidos de SElinux como las ACL que puedan tener configurados los ficheros/directorios. # yum info star.i686 ... Name : star Arch : i686 Summary : An archiving tool with ACL support URL : http://cdrecord.berlios.de/old/private/star.html Description : [...]]]></description>
			<content:encoded><![CDATA[<p>El comando <strong>star</strong> permite <strong>comprimir y descomprimir y/o empaquetar múltiples ficheros con la posibilidad de mantener tanto los atributos extendidos de SElinux como las ACL</strong> que puedan tener configurados los ficheros/directorios.</p>
<pre># yum info star.i686
...
Name        : star
Arch        : i686
Summary     : An archiving tool with ACL support
URL         : http://cdrecord.berlios.de/old/private/star.html
Description : Star saves many files together into a single tape or disk archive,
            : and can restore individual files from the archive. Star supports ACL.
...</pre>
<p>No es un comando que venga por defecto, así que lo instalamos con yum:</p>
<pre># yum info star.i686</pre>
<p>La utilización no es igual que el comando <strong>tar</strong>, es más, es bastante compleja. Sólo hay que mirar la página man, que es muy extensa para darse cuenta de las posibilidades que ofrece. Nosotros vamos a ver unos ejemplos básicos, luego cada uno que haga las pruebas e investigaciones oportunas.</p>
<h3>Mantener los atributos extendidos de SElinux y ACL</h3>
<p>Para incluir en el fichero empaquetado/comprimido cualquier atributo extendido de ficheros así como las ACL utilizamos los parámetros <strong>-xattr</strong> (podemos recordarlo por e<strong>x</strong>tended <strong>attr</strong>ibutes) y <strong>-H=exustar</strong>. Para preservar las ACL es más sencillo (<strong>-acl</strong>). Vamos a empaquetar los siguientes ficheros, que tienen atributos extendidos de SElinux:</p>
<pre># ls -Z
-rw-------. root root system_u:object_r:etc_t:s0       ftpusers
-rw-------. root root system_u:object_r:etc_t:s0       user_list
-rw-------. root root system_u:object_r:etc_t:s0       vsftpd.conf
-rwxr--r--. root root system_u:object_r:etc_t:s0       vsftpd_conf_migrate.sh</pre>
<p>Probamos también a meter una ACL para ver que la mantiene. Podéis revisar esta entrada sobre ACLs: <a title="ACL (Access Control List) en sistemas de ficheros GNU/Linux" href="http://rm-rf.es/acl-access-control-list-en-sistemas-de-ficheros-gnulinux/">ACL (Access Control List) en sistemas de ficheros GNU/Linux</a>.</p>
<pre># setfacl -m u:prueba:r-- ftpusers</pre>
<pre># getfacl ftpusers
# file: ftpusers
# owner: root
# group: root
user::rw-
user:prueba:r--
group::---
mask::r--
other::---</pre>
<p>El comando sería el siguiente. Podéis ver que especificamos la creación de un nuevo fichero (<strong>-c</strong>) y su nombre (<strong>-f=</strong>):</p>
<pre># star -xattr -H=exustar -acl -c -f=ejemplo.star *
star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).</pre>
<p>Desempaquetar el fichero es más sencillo, usamos el parámetro <strong>-x (desempaquetar)</strong> y especificamos el fichero de la misma forma que antes (-f=nombre). Si queremos mantener las ACL hay que especificarlo de la misma forma que al empaquetar (<strong>-acl</strong>):</p>
<pre># star -x -acl -f=ejemplo.star
star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).</pre>
<p>Y revisamos los atributos de <strong>SElinux</strong>:</p>
<pre># ls -Z
-rw-r-----. root root system_u:object_r:etc_t:s0       ftpusers
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0   test.star
-rw-------. root root system_u:object_r:etc_t:s0       user_list
-rw-------. root root system_u:object_r:etc_t:s0       vsftpd.conf
-rwxr--r--. root root system_u:object_r:etc_t:s0       vsftpd_conf_migrate.sh</pre>
<p>Y las <strong>ACL</strong>:</p>
<pre># getfacl ftpusers
# file: ftpusers
# owner: root
# group: root
user::rw-
user:prueba:r--
group::---
mask::r--
other::---</pre>
<p>De esta forma veréis que únicamente hemos empaquetado, no hemos <strong>comprimido</strong>. Con el parámetro <strong>-compress-program=</strong> podemos especificar el compresor a utilizar (gzip, bzip2,etc)</p>
<pre># star -xattr -H=exustar -compress-program=gzip -c -f=test.star *
star: 2 blocks + 0 bytes (total of 20480 bytes = 20.00k).</pre>
<p>Vemos que efectivamente el peso es mínimo:</p>
<pre>-rw-r--r--. 1 root root 2997 feb 27 20:41 test.star</pre>
<p>Para descomprimir es igual, el propio comando detectará la compresión y actuará en consecuencia:</p>
<pre># star -x -acl -f=test.star
star: WARNING: Archive is 'gzip' compressed, trying to use the -z option.</pre>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/comprobar-la-integridad-de-ficheros-tar-gz-rar-zip/" title="Comprobar la integridad de ficheros tar, gz, rar, zip">Comprobar la integridad de ficheros tar, gz, rar, zip</a></li><li><a href="http://rm-rf.es/sslcertificatefile-file-certificado-crt-does-not-exist-or-empty/" title="SSLCertificateFile: file certificado.crt does not exist or empty">SSLCertificateFile: file certificado.crt does not exist or empty</a></li><li><a href="http://rm-rf.es/vsftpd-y-selinux-cambiar-el-directorio-para-accesos-anonimos/" title="vsftpd y SELinux: cambiar el directorio para accesos anónimos">vsftpd y SELinux: cambiar el directorio para accesos anónimos</a></li><li><a href="http://rm-rf.es/selinux-semanage-command-not-found/" title="SELinux &#8216;semanage: command not found&#8217;">SELinux &#8216;semanage: command not found&#8217;</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/star-empaquetar-preservando-acl-y-atributos-extendidos-selinux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subnetting y cálculo de netmask desde línea de comandos</title>
		<link>http://rm-rf.es/subnetting-y-calculo-de-netmask-desde-linea-de-comandos/</link>
		<comments>http://rm-rf.es/subnetting-y-calculo-de-netmask-desde-linea-de-comandos/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 17:13:02 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[Redes]]></category>
		<category><![CDATA[CIDR]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[subnet]]></category>
		<category><![CDATA[subnetting]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2521</guid>
		<description><![CDATA[Si se os da tan mal como a mí el cálculo de subredes o simplemente queréis una herramienta rápida para hacerlo aquí tenéis ipcalc o sipcalc. A través de este comando podremos calcular subredes directamente desde la línea de comandos. La principal diferencia entre ambos es que sipcalc acepta IPV6 y permite subnetting. Para instalarlos [...]]]></description>
			<content:encoded><![CDATA[<p>Si se os da tan mal como a mí el <strong>cálculo de subredes</strong> o simplemente queréis una herramienta rápida para hacerlo aquí tenéis <strong>ipcalc</strong> o <strong>sipcalc</strong>. A través de este comando podremos calcular subredes directamente desde la línea de comandos. La principal diferencia entre ambos es que sipcalc acepta<strong> IPV6 y permite subnetting</strong>.</p>
<p>Para instalarlos utilizamos los gestores de paquetes correspondientes, apt, yum&#8230;</p>
<pre>$ sudo apt-get install ipcalc</pre>
<pre>$ sudo yum install ipcalc</pre>
<p><em>Nota: en RHEL y CentOS hay que activar el repositorio rpmforge.</em></p>
<p>La utilización es bien sencilla, podemos pasar como parámetro la subred en formato CIDR y nos devuelve toda la información de la misma, máscara, red, nº de hosts, etc:</p>
<pre>$ ipcalc 10.0.0.0/24
Address:   10.0.0.0             00001010.00000000.00000000. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=&gt;
Network:   10.0.0.0/24          00001010.00000000.00000000. 00000000
HostMin:   10.0.0.1             00001010.00000000.00000000. 00000001
HostMax:   10.0.0.254           00001010.00000000.00000000. 11111110
Broadcast: 10.0.0.255           00001010.00000000.00000000. 11111111
Hosts/Net: 254                   Class A, Private Internet</pre>
<p>IPV6 con sipcalc:</p>
<pre>$ sipcalc 2001:DB8::/24
-[ipv6 : 2001:DB8::/24] - 0

[IPV6 INFO]
Expanded Address	- 2001:0db8:0000:0000:0000:0000:0000:0000
Compressed address	- 2001:db8::
Subnet prefix (masked)	- 2001:d00:0:0:0:0:0:0/24
Address ID (masked)	- 0:b8:0:0:0:0:0:0/24
Prefix address		- ffff:ff00:0:0:0:0:0:0
Prefix length		- 24
Address type		- Aggregatable Global Unicast Addresses
Network range		- 2001:0d00:0000:0000:0000:0000:0000:0000 -
			  2001:0dff:ffff:ffff:ffff:ffff:ffff:ffff</pre>
<p>Otra característica interesante es la posibilidad de sipcalc de especificar una red y hacer subneting con ella, si por ejemplo queremos dividir un /21 en redes /22 o /24:</p>
<pre>$ sipcalc -s24 10.0.0.0/21
-[ipv4 : 10.0.0.0/21] - 0

[Split network]
Network			- 10.0.0.0        - 10.0.0.255
Network			- 10.0.1.0        - 10.0.1.255
Network			- 10.0.2.0        - 10.0.2.255
Network			- 10.0.3.0        - 10.0.3.255
Network			- 10.0.4.0        - 10.0.4.255
Network			- 10.0.5.0        - 10.0.5.255
Network			- 10.0.6.0        - 10.0.6.255
Network			- 10.0.7.0        - 10.0.7.255

-
$ sipcalc -s22 10.0.0.0/21
-[ipv4 : 10.0.0.0/21] - 0

[Split network]
Network			- 10.0.0.0        - 10.0.3.255
Network			- 10.0.4.0        - 10.0.7.255</pre>
<p>Si revisáis la ayuda del comando encontraréis otras posibilidades de interés.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/escanear-rango-de-ips/" title="Escanear rango de Ips">Escanear rango de Ips</a></li><li><a href="http://rm-rf.es/que-es-apipazeroconf-en-centosrhel-y-como-deshabilitarlo-169-254-x-y/" title="¿Qué es APIPA/zeroconf y cómo deshabilitarlo en CentOS/RHEL (169.254.x.y)?">¿Qué es APIPA/zeroconf y cómo deshabilitarlo en CentOS/RHEL (169.254.x.y)?</a></li><li><a href="http://rm-rf.es/nf_conntrack-table-full-dropping-packet-en-kernel-2-6-32/" title="nf_conntrack: table full, dropping packet en kernel 2.6.32">nf_conntrack: table full, dropping packet en kernel 2.6.32</a></li><li><a href="http://rm-rf.es/red-hat-cluster-generic-error-al-crear-un-ip-resource/" title="Red Hat Cluster: &#8220;generic error&#8221; al crear un IP Resource">Red Hat Cluster: &#8220;generic error&#8221; al crear un IP Resource</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/subnetting-y-calculo-de-netmask-desde-linea-de-comandos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Consultar IMAP o POP desde shell con mutt</title>
		<link>http://rm-rf.es/consultar-imap-o-pop-desde-shell-con-mutt/</link>
		<comments>http://rm-rf.es/consultar-imap-o-pop-desde-shell-con-mutt/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 09:18:44 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[correo]]></category>
		<category><![CDATA[imap]]></category>
		<category><![CDATA[mutt]]></category>
		<category><![CDATA[pop]]></category>
		<category><![CDATA[pop3]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2492</guid>
		<description><![CDATA[En su día ya vimos como acceder vía telnet a un servidor POP. Lo mismo es posible para IMAP, aunque el comando mutt nos facilita las cosas si no queremos saber utilizar con profundidad el protocolo por telnet. Podéis encontrar mutt a través de cualquier gestor de paquetes (apt,yum&#8230;), así que su instalación no tiene [...]]]></description>
			<content:encoded><![CDATA[<p>En su día ya vimos como acceder vía <a href="http://rm-rf.es/leer-correo-cuenta-pop-telnet/" title="Leer correo de una cuenta POP a través de TELNET">telnet a un servidor POP</a>. Lo mismo es posible para IMAP, aunque el <strong>comando mutt</strong> nos facilita las cosas si no queremos saber utilizar con profundidad el protocolo por telnet.</p>
<p>Podéis encontrar mutt a través de cualquier gestor de paquetes (apt,yum&#8230;), así que su instalación no tiene ningún misterio. Para acceder a una cuenta IMAP ejecutaremos el siguiente comando:</p>
<pre># mutt -f imap://test@test.com@mail.test.com</pre>
<p>En este caso accedemos a la cuenta test@test.com en el servidor IMAP mail.test.com. Para POP lo mismo pero cambiando el protocolo:</p>
<pre># mutt -f pop://test@test.com@mail.test.com</pre>
<p>Una vez dentro es tan simple como usar los cursores y ENTER para movernos por los mensajes y/o seguir las indicaciones del menú:</p>
<pre>q:Salir  d:Sup.  u:Recuperar  s:Guardar  m:Nuevo  r:Responder  g:Grupo  ?:Ayuda</pre>
<div align="center"><img src="http://rm-rf.es/wp-content/uploads/2012/02/mutt.png" alt="mutt" title="mutt" width="581" height="362" class="size-full wp-image-2493" /></div>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/leer-correo-cuenta-pop-telnet/" title="Leer correo de una cuenta POP a través de TELNET">Leer correo de una cuenta POP a través de TELNET</a></li><li><a href="http://rm-rf.es/hmailserver-err-your-mailbox-is-already-locked/" title="hMailserver: ERR Your mailbox is already locked">hMailserver: ERR Your mailbox is already locked</a></li><li><a href="http://rm-rf.es/mailenable-error-login-acceder-pop-cuenta-email/" title="Mailenable: Error de login al acceder por POP a cuenta de email">Mailenable: Error de login al acceder por POP a cuenta de email</a></li><li><a href="http://rm-rf.es/exim-establecer-filtros-anti-spam-para-entrada-y-salida-de-correo/" title="Exim: establecer filtros anti-spam para entrada y salida de correo">Exim: establecer filtros anti-spam para entrada y salida de correo</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/consultar-imap-o-pop-desde-shell-con-mutt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ver el contenido de btmp y wtmp con utmpdump</title>
		<link>http://rm-rf.es/ver-el-contenido-de-btmp-y-wtmp-con-utmpdump/</link>
		<comments>http://rm-rf.es/ver-el-contenido-de-btmp-y-wtmp-con-utmpdump/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 08:42:46 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[ssh login]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2476</guid>
		<description><![CDATA[El comando utmpdump permite visualizar el contenido de los ficheros btmp y wtmp. Ambos ficheros tienen formato binario y almacenan logs de: btmp: log que almacena un registro de los accesos fallidos al sistema wtmp: log que almacena un registro de los accesos al sistema Los ficheros son ilegibles de forma directa debido a que [...]]]></description>
			<content:encoded><![CDATA[<p>El comando <strong>utmpdump</strong> permite visualizar el contenido de los ficheros <strong>btmp</strong> y <strong>wtmp</strong>. Ambos ficheros tienen formato binario y almacenan logs de:</p>
<ul>
<li><strong>btmp</strong>: log que almacena un registro de los accesos fallidos al sistema</li>
<li><strong>wtmp</strong>: log que almacena un registro de los accesos al sistema</li>
</ul>
<p>Los ficheros son ilegibles de forma directa debido a que están almacenados en binario:</p>
<pre># file wtmp
wtmp: data</pre>
<p>Para ello tenemos el comando utmpdump. Simplemente pasamos el fichero de log como parámetro y podremos visualizar su contenido:</p>
<pre># <strong>utmpdump /var/log/btmp </strong>
Utmp dump of /var/log/btmp
[6] [01585] [    ] [alex    ] [ssh:notty   ] [192.168.1.128       ] [192.168.1.128  ] [Mon Jan 16 21:45:56 2012 CET]
[6] [01585] [    ] [alex    ] [ssh:notty   ] [192.168.1.128       ] [192.168.1.128  ] [Mon Jan 16 21:45:59 2012 CET]
[6] [02927] [    ] [foo  ] [ssh:notty   ] [192.168.1.128       ] [0.0.0.0        ] [Fri Jan 27 21:52:13 2012 CET]
[6] [03787] [    ] [root    ] [ssh:notty   ] [192.168.1.128       ] [192.168.1.128  ] [Fri Jan 27 22:01:35 2012 CET]
[6] [03787] [    ] [root    ] [ssh:notty   ] [192.168.1.128       ] [192.168.1.128  ] [Fri Jan 27 22:01:51 2012 CET]</pre>
<pre># <strong>utmpdump /var/log/wtmp</strong> | head
Utmp dump of /var/log/wtmp
[2] [00000] [~~  ] [reboot  ] [~           ] [2.6.32-220.el6.i686 ] [0.0.0.0        ] [Wed Dec 28 21:01:04 2011 CET]
[1] [00051] [~~  ] [runlevel] [~           ] [2.6.32-220.el6.i686 ] [0.0.0.0        ] [Wed Dec 28 21:01:04 2011 CET]
[6] [01052] [1   ] [LOGIN   ] [tty1        ] [                    ] [0.0.0.0        ] [Wed Dec 28 21:01:25 2011 CET]
[6] [01054] [2   ] [LOGIN   ] [tty2        ] [                    ] [0.0.0.0        ] [Wed Dec 28 21:01:25 2011 CET]
[6] [01056] [3   ] [LOGIN   ] [tty3        ] [                    ] [0.0.0.0        ] [Wed Dec 28 21:01:25 2011 CET]
[6] [01060] [4   ] [LOGIN   ] [tty4        ] [                    ] [0.0.0.0        ] [Wed Dec 28 21:01:25 2011 CET]
[6] [01062] [5   ] [LOGIN   ] [tty5        ] [                    ] [0.0.0.0        ] [Wed Dec 28 21:01:25 2011 CET]
[6] [01064] [6   ] [LOGIN   ] [tty6        ] [                    ] [0.0.0.0        ] [Wed Dec 28 21:01:25 2011 CET]
[7] [01052] [1   ] [root    ] [tty1        ] [                    ] [0.0.0.0        ] [Wed Dec 28 21:01:31 2011 CET]
[7] [03021] [ts/0] [root    ] [pts/0       ] [192.168.1.128       ] [192.168.1.128  ] [Wed Dec 28 21:10:28 2011 CET]</pre>
<p>utmpdump también nos permite visualizar el contenido del log a tiempo real (como un <strong>tail -f</strong>):</p>
<pre># <strong>utmpdump -f /var/log/wtmp </strong>
Utmp dump of /var/log/wtmp
[8] [01555] [6   ] [        ] [tty6        ] [                    ] [0.0.0.0        ] [Fri Jan 27 22:20:43 2012 CET]
[2] [00000] [~~  ] [reboot  ] [~           ] [2.6.32-220.el6.i686 ] [0.0.0.0        ] [Sat Jan 28 10:34:12 2012 CET]
[1] [00051] [~~  ] [runlevel] [~           ] [2.6.32-220.el6.i686 ] [0.0.0.0        ] [Sat Jan 28 10:34:12 2012 CET]
...
...</pre>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/configurar-un-syslog-remoto-para-centralizar-logs/" title="Configurar un syslog remoto para centralizar logs">Configurar un syslog remoto para centralizar logs</a></li><li><a href="http://rm-rf.es/login-ssh-sin-password-de-forma-rapida-y-sencilla/" title="Login SSH sin password de forma rápida y sencilla">Login SSH sin password de forma rápida y sencilla</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/ver-el-contenido-de-btmp-y-wtmp-con-utmpdump/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comando sar: controlar la actividad de CPU (I)</title>
		<link>http://rm-rf.es/comando-sar-controlar-la-actividad-de-cpu-i/</link>
		<comments>http://rm-rf.es/comando-sar-controlar-la-actividad-de-cpu-i/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 18:08:09 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[cpu]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2460</guid>
		<description><![CDATA[En Linux y Unix existen otros comandos además de top para monitorizar de un modo eficiente la utilización de las CPU en el sistema. Hoy vamos a ver unos cuantos ejemplos del comando sar. En este primer artículo nos centramos en la CPU, veremos en sucesivos que podemos ir más allá (disco, red, procesos, carga, [...]]]></description>
			<content:encoded><![CDATA[<p>En <strong>Linux y Unix</strong> existen otros comandos además de <a title="El comando TOP" href="http://rm-rf.es/el-comando-top/">top</a> para <strong>monitorizar de un modo eficiente la utilización de las CPU</strong> en el sistema. Hoy vamos a ver unos cuantos ejemplos del <strong>comando sar</strong>. En este primer artículo nos centramos en la CPU, veremos en sucesivos que podemos ir más allá (disco, red, procesos, carga, etc).</p>
<p>Para poder comenzar a utilizar sar, debemos tener en cuenta que es necesario por un lado tener corriendo el proceso <strong>sysstat</strong>:</p>
<pre># /etc/init.d/sysstat start
# chkconfig sysstat on</pre>
<p>Además, hay que configurar sysstat para permitir la recolección de datos. Estos datos estadísticos se almacenan en /var/log/sysstat/sa*. Para ello es necesario tener estos parámetros en el fichero de configuración <strong>/etc/sysconfig/sysstat</strong>. Lo hacemos antes de reiniciar sysstat:</p>
<pre>ENABLED="false"
SA1_OPTIONS="-S DISK"</pre>
<p>Normalmente, si se instala el paquete por yum o apt, automáticamente se configuran los cron necesarios para recolectar la información que utiliza sar:</p>
<pre>$ more /etc/cron.d/sysstat
# Global variables:
#
#  our configuration file
DEFAULT=/etc/default/sysstat
#  default setting, overriden in the above file
ENABLED=false
SA1_OPTIONS=""

# Activity reports every 10 minutes everyday
5-55/10 * * * * root [ -x /usr/lib/sysstat/sa1 ] &amp;&amp; { [ -r "$DEFAULT" ] &amp;&amp; . "$DEFAULT" ; [ "$ENABLED" = "true" ] &amp;&amp; exec /usr/lib/sysstat/
sa1 $SA1_OPTIONS 1 1 ; }

# Additional run at 23:59 to rotate the statistics file
59 23 * * * root [ -x /usr/lib/sysstat/sa1 ] &amp;&amp; { [ -r "$DEFAULT" ] &amp;&amp; . "$DEFAULT" ; [ "$ENABLED" = "true" ] &amp;&amp; exec /usr/lib/sysstat/sa1
$SA1_OPTIONS 60 2 ; }</pre>
<p>Vamos a ver unos cuantos ejemplos, os recomiendo como siempre revisar la página man porque es un comando con mucho potencial y opciones.</p>
<h2>Mostrar el uso de CPU en un intervalo de tiempo determinado</h2>
<p>El siguiente ejemplo muestra el uso de cpu cada 2 segundo:</p>
<pre># sar -u 2
Linux 2.6.28-17-generic (sistemas) 	22/01/12 	_i686_	(2 CPU)

19:14:05        CPU     %user     %nice   %system   %iowait    %steal     %idle
19:14:07        all     12,08      0,00      3,86      0,72      0,00     83,33
19:14:09        all      8,52      0,00      2,19      0,00      0,00     89,29
19:14:11        all      8,39      0,00      2,88      0,72      0,00     88,01
...
...
...</pre>
<p>EL siguiente ejemplo hace lo mismo a excepción de que se ejecutará únicamente 4 veces. El anterior por contra se ejecutaba continuamente hasta que lo cancelaramos. Lo interesante de este ejemplo es que al final nos muestra una media de utilización durante el tiempo que se ha ejecutado:</p>
<pre># sar -u 2 4
Linux 2.6.28-17-generic (sistemas) 	22/01/12 	_i686_	(2 CPU)

19:16:39        CPU     %user     %nice   %system   %iowait    %steal     %idle
19:16:41        all     35,47      0,00      6,40      3,20      0,00     54,93
19:16:43        all     26,57      0,00     10,78      0,00      0,00     62,66
19:16:45        all     13,87      0,00      3,65      1,46      0,00     81,02
19:16:47        all     19,07      0,00      5,13      0,00      0,00     75,79
<strong>Media: all 23,69 0,00 6,46 1,17 0,00 68,68</strong></pre>
<p>Para los que no conozcáis el significado de cada columna:</p>
<ul>
<li><strong>CPU</strong>: CPUs que se stán monitorizando, en los casos anteriores todas las del equipo.</li>
<li><strong>%user</strong>:  Porcentaje de tiempo de CPU utilizada por aplicaciones/procesos a nivel de usuario.</li>
<li><strong>%nice</strong>:  Porcentaje de tiempo de CPU utilizada por aplicaciones/procesos con prioridad nice asignada.</li>
<li><strong>%system</strong>:  Porcentaje de tiempo de CPU utilizada por aplicaciones/procesos a nivel de sistema/kernel.</li>
<li><strong>%iowait</strong>:  Porcentaje de tiempo de CPU en espera a que terminen operaciones de I/O.</li>
<li><strong>%steal</strong>:  Porcentaje de tiempo utilizado por las CPU en involuntary wait mientras el hypervisor servía a otro procesador virtual</li>
<li><strong>%idle</strong>: Porcentaje de tiempo de CPU en espera y sin operaciones de I/O pendientes.</li>
</ul>
<p>Por supuesto se pueden añadir más columnas, revisad las páginas man:</p>
<pre># sar -u ALL 2 4
Linux 2.6.28-17-generic (sistemas) 	22/01/12 	_i686_	(2 CPU)

19:28:16        CPU      %usr     %nice      %sys   %iowait    %steal      %irq     %soft    %guest     %idle
19:28:18        all      9,18      0,00      2,90      0,97      0,00      0,00      0,00      0,00     86,96
19:28:20        all      7,95      0,00      4,34      0,00      0,00      0,00      0,00      0,00     87,71
19:28:22        all     14,46      0,00      5,15      1,47      0,00      0,25      0,00      0,00     78,68
19:28:24        all     17,89      0,00      5,39      0,00      0,00      0,00      0,00      0,00     76,72
Media:          all     12,34      0,00      4,44      0,61      0,00      0,06      0,00      0,00     82,55</pre>
<p>Si ejecutaramos <strong>sar -u</strong> sin parámeteros nos mostaría la CPU utilizada durante el día, sacándola de los ficheros de estadísticas.</p>
<h3>Monitorizar por CPU</h3>
<p>En lugar de mostrar el estado de todas las CPU a la vez podemos seleccionar la que queramos o incluso mostrar una fila para cada CPU de forma independiente. En el siguiente ejemplo monitorizamos la CPU 1 durante 2 segundos y cuatro ejecuciones:</p>
<pre>$ sar -P 1 2 4
Linux 2.6.28-17-generic (sistemas) 	22/01/12 	_i686_	(2 CPU)

19:29:17        CPU     %user     %nice   %system   %iowait    %steal     %idle
19:29:19          1     22,49      0,00      2,39      0,48      0,00     74,64
19:29:21          1      3,33      0,00      2,86      0,00      0,00     93,81
19:29:23          1     17,92      0,00      5,19      0,00      0,00     76,89
19:29:25          1     26,09      0,00     14,01      0,00      0,00     59,90
Media:            1     17,42      0,00      6,09      0,12      0,00     76,37</pre>
<p>Como decía antes, una fila para cada CPU, en este caso un equipo con 2 CPU, únicamente una ejecución:</p>
<pre>$ sar -P ALL 2 1
Linux 2.6.28-17-generic (sistemas) 	22/01/12 	_i686_	(2 CPU)

19:31:12        CPU     %user     %nice   %system   %iowait    %steal     %idle
19:31:14        all     17,69      0,00      3,93      0,74      0,00     77,64
19:31:14          0     22,39      0,00      2,99      0,00      0,00     74,63
19:31:14          1     13,04      0,00      5,31      1,45      0,00     80,19

Media:          CPU     %user     %nice   %system   %iowait    %steal     %idle
Media:          all     17,69      0,00      3,93      0,74      0,00     77,64
Media:            0     22,39      0,00      2,99      0,00      0,00     74,63
Media:            1     13,04      0,00      5,31      1,45      0,00     80,19</pre>
<h3>Mostrar toda la información almacenada en el fichero de estadísticas diario</h3>
<pre>$ sar -A</pre>
<p>Sar no se limita únicamente a la monitorización de CPU, también podemos controlar la actividad en discos (al estilo <a title="Monitorización de CPU y actividad de discos duros con iostat" href="http://rm-rf.es/monitorizacion-cpu-actividad-discos-duros-iostat/">iostat</a>), de red, procesos, load average, etc. En este primer artículo no hemos centrado en la CPU, en los próximos veremos algunos ejemplos de ello.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/asignar-prioridad-de-cpu-a-procesos-en-linux-con-nice/" title="Asignar prioridad de CPU a procesos en Linux con nice">Asignar prioridad de CPU a procesos en Linux con nice</a></li><li><a href="http://rm-rf.es/top-mostrar-informacion-multiples-cpu/" title="TOP: mostrar información de múltiples CPU">TOP: mostrar información de múltiples CPU</a></li><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></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/comando-sar-controlar-la-actividad-de-cpu-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Añadir la cabecera Content-type al usar el comando mail o mailx</title>
		<link>http://rm-rf.es/anadir-la-cabecera-content-type-al-usar-el-comando-mail/</link>
		<comments>http://rm-rf.es/anadir-la-cabecera-content-type-al-usar-el-comando-mail/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 19:51:34 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mta]]></category>
		<category><![CDATA[smtp]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2436</guid>
		<description><![CDATA[En algunas versiones del comando mail&#124;mailx&#124;Mail (creo que en las antiguas) se podía especificar una cabecera con el parámetro -a: $ mail --help usage: mail [-dEIinv] [-a header] [-b bcc-addr] [-c cc-addr] [-s subject] to-addr ... De este modo era sencillo especificar cualquier cabecera y modificarla, como por ejemplo el Content-type si quisieramos enviar un [...]]]></description>
			<content:encoded><![CDATA[<p>En algunas versiones del comando <strong>mail|mailx|Mail</strong> (creo que en las antiguas) se podía especificar una cabecera con el parámetro <strong>-a</strong>:</p>
<pre>$ mail --help
usage: mail [-dEIinv] <strong>[-a header]</strong> [-b bcc-addr] [-c cc-addr] [-s subject] to-addr ...</pre>
<p>De este modo era sencillo especificar cualquier cabecera y modificarla, como por ejemplo el <strong>Content-type si quisieramos enviar un correo en formato HTML (text/html)</strong>. En cambio en nuevas versiones este parámetro ha desaparecido, y si queremos añadir el Content-type, por ejemplo, hay que engañar al MTA del siguiente modo:</p>
<pre>$ cat mensaje.html | mail -s "$(echo -e "Este es el asunto\nContent-Type: text/html")" foo@bar.com</pre>
<p>Como véis, a la hora de especificar el subject del mail con el parámetro -s, hacemos la trampa de crear un salto de línea y especificar después el Content-type, al igual que podemos ver en las cabeceras de un email estándar. De este modo, el MTA no asocia la segunda línea con el Subject sino como si fuera una cabecera normal de Content Type.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/communigate-pro-enrutar-un-dominio-local-a-un-servidor-externo/" title="Communigate Pro: enrutar un dominio local a un servidor externo">Communigate Pro: enrutar un dominio local a un servidor externo</a></li><li><a href="http://rm-rf.es/estadisticas-de-correo-spam-y-virus-con-mailgraph/" title="Estadísticas de correo, spam y virus con Mailgraph">Estadísticas de correo, spam y virus con Mailgraph</a></li><li><a href="http://rm-rf.es/configurar-ip-de-salida-en-postfix/" title="Configurar IP de salida en Postfix">Configurar IP de salida en Postfix</a></li><li><a href="http://rm-rf.es/cpanel-configurar-exim-puerto-alternativo/" title="cPanel: Configurar exim en puerto alternativo">cPanel: Configurar exim en puerto alternativo</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/anadir-la-cabecera-content-type-al-usar-el-comando-mail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejemplos prácticos de grep y egrep</title>
		<link>http://rm-rf.es/ejemplos-practicos-de-grep-y-egrep/</link>
		<comments>http://rm-rf.es/ejemplos-practicos-de-grep-y-egrep/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 16:19:55 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[expresiones regulares]]></category>
		<category><![CDATA[grep]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2399</guid>
		<description><![CDATA[Grep es sin duda alguna no de los comandos más utilizados en el día a día por los administradores de sistemas. Muchos no van más allá de sus usos más básicos, que si bien cumplen a la perfección su función son una mínima parte de las posibilidades que nos ofrece. Algunos de estos ejemplos se [...]]]></description>
			<content:encoded><![CDATA[<p><img class=" size-full wp-image-2402" title="grep search" src="http://rm-rf.es/wp-content/uploads/2011/12/search-logo.jpg" alt="grep search" width="180" height="179" align="right" />Grep es sin duda alguna no de los comandos más utilizados en el día a día por los administradores de sistemas. Muchos no van más allá de sus usos más básicos, que si bien cumplen a la perfección su función son una mínima parte de las posibilidades que nos ofrece. Algunos de estos ejemplos se pueden ejecutar tanto con grep como con egrep (<strong>egrep= grep -E</strong>), independientemente de que casi siempre se ejecuten con egrep en el post. Espero que os sean de utilidad.</p>
<p>Este es el texto que se va a utilizar para trabajar como ejemplo. Sí, es un fichero de configuración de un Cluster MySQL de prueba, pero es que no tenía otra cosa a mano y no me apetecía preparar un fichero específicamente para esto ;)</p>
<pre>[ndb_mgmd]
hostname=192.168.0.10           # Hostname or IP address of management node
datadir=/var/lib/mysql-cluster  # Directory for management node log files

# Options for data node "A":
[ndbd]
                                # (one [ndbd] section per data node)
hostname=192.168.0.30           # Hostname or IP address
datadir=/usr/local/mysql/data   # Directory for this data node's data files

# Options for data node "B":
[ndbd]
hostname=192.168.0.40           # Hostname or IP address
datadir=/usr/local/mysql/data   # Directory for this data node's data files

# SQL node options:
[mysqld]
hostname=192.168.0.20           # Hostname or IP address
                                # (additional mysqld connections can be
                                # specified for this node for various
                                # purposes such as running ndb_restore)</pre>
<h3>Buscar dos ó n strings distintas dentro de un mismo fichero</h3>
<p>La sintaxis es &#8216;(cadena1|cadena2|cadenaN)&#8217;. La salida será todas aquellas líneas que contienen cualquiera de esas strings. Esto nos permite hacer múltiples búsquedas en un único comando:</p>
<pre>$ egrep '(192.168.0.30|192.168.0.40)' test
hostname=192.168.0.30           # Hostname or IP address
hostname=192.168.0.40           # Hostname or IP address</pre>
<pre>$ egrep '(192.168.0.30|192.168.0.40|192.168.0.20)' test
hostname=192.168.0.30           # Hostname or IP address
hostname=192.168.0.40           # Hostname or IP address
hostname=192.168.0.20           # Hostname or IP address</pre>
<h3>Usar los corchetes para reducir el rango de búsqueda</h3>
<p>Podemos hacer uso de los corchetes [] para definir, dentro de una misma string, que una sección contenga únicamente X carácteres, un rango de ellos, etc.</p>
<p>En este caso queremos sacar únicamente los resultados que contengan 192.168.0.30 y 192.168.0.40:</p>
<pre>$ egrep 192.168.0.[30,40] test
hostname=192.168.0.30           # Hostname or IP address
hostname=192.168.0.40           # Hostname or IP address</pre>
<p>Pero si quisiéramos definir los rangos que queremos mostrar para los dos últimos caracteres, en este caso numéricos (se podría hacer con alfanuméricos) podemos hacerlo separando el valor inicial y el final con &#8220;-&#8221;. En este ejemplo queremos que nos muestre aquello que cumpla la condición de que el primer número del último bloque tiene que ser 0,1 ó 2:</p>
<pre>$ egrep 192.168.0.[0-2]0 test
hostname=192.168.0.10           # Hostname or IP address of management node
hostname=192.168.0.20           # Hostname or IP address</pre>
<p>Y en este que el primer número del último bloque sea 1,2 ó 3 y el último entre 0 y 9:</p>
<pre>$ egrep 192.168.0.[0-3][0-9] test
hostname=192.168.0.10           # Hostname or IP address of management node
hostname=192.168.0.30           # Hostname or IP address
hostname=192.168.0.20           # Hostname or IP address</pre>
<p>Un ejemplo práctico con caracteres alfanuméricos sería usar por ejemplo <strong>[a-c]test</strong>, que buscaría atest, btest y ctest ó por ejemplo <strong>[ar4d]test</strong> que buscaría atest, rtest, 4test y dtest.</p>
<h3>Uso de clases predefinidas</h3>
<p>Existen clases predefinidas que nos pueden llegar a ahorrar mucho trabajo. Son las siguientes:</p>
<pre>[:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:xdigit:]</pre>
<p>Lo que hace cada una de ellas está claro por su nombre, no obstante vamos a ver un ejemplo. Podemos buscar toda línea que contenga un carácter en mayúsculas:</p>
<pre>$ egrep [[:upper:]] test
hostname=192.168.0.10           # Hostname or IP address of management node
datadir=/var/lib/mysql-cluster  # Directory for management node log files
...
...</pre>
<h3>Todo lo que comienza o termina por&#8230;</h3>
<p>Esto es sencillo, <strong>las líneas comienzan por el carácter ^ y terminan con $</strong>. Por lo que:</p>
<p>Buscar todo lo que comience por &#8220;hostname&#8221;:</p>
<pre>$ egrep ^hostname test
hostname=192.168.0.10           # Hostname or IP address of management node
hostname=192.168.0.30           # Hostname or IP address
hostname=192.168.0.40           # Hostname or IP address
hostname=192.168.0.20           # Hostname or IP address</pre>
<p>O todo lo que termine por &#8220;node&#8221;:</p>
<pre>$ egrep node$ test
hostname=192.168.0.10           # Hostname or IP address of management node</pre>
<h3>Más expresiones regulares</h3>
<p>Ya hicimos un artículo sobre ello hace tiempo, podéis revisarlo aquí: <a title="Unix: Expresiones regulares" href="http://rm-rf.es/unix-expresiones-regulares/">unix: Expresiones regulares</a>, ahí también encontraréis unos cuantos <strong>ejemplos de grep</strong>. Son muy útiles los operadores de repetición:</p>
<pre>       ?      El carácter que precede es opcional y coincide al menos una vez.
       *      El carácter que precede coincidirá 0 o más veces.
       +      El carácter que precede coincidirá 1 o más veces.
       {n}    El carácter que precede coincidirá exactamente n veces.
       {n,}   El carácter que precede coincidirá n o más veces.
       {,m}   El carácter que precede coincidirá como máximo m veces.
       {n,m}  El carácter que precede coincidirá entre n y m veces.</pre>
<p>Podemos entonces buscar todas las líneas del fichero que contienen una IP. Usamos primero los corchetes para definir que puede haber números del 0 al 9, con las llaves decimos que habrá 1 o 3 números en cada bloque y así cuatro veces (nota: hay que escapar las llaves):</p>
<pre>$ grep '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' test
hostname=192.168.0.10           # Hostname or IP address of management node
hostname=192.168.0.30           # Hostname or IP address
hostname=192.168.0.40           # Hostname or IP address
hostname=192.168.0.20           # Hostname or IP address</pre>
<h3>Buscar palabras completas, contar resultados</h3>
<p>Para indicar a grep que queremos que la búsqueda se centre en palabras y no en caracteres sueltos especificamos el parámetro &#8220;-w&#8221;. Podemos ver la diferencia buscando &#8220;data&#8221; en el ejemplo, contamos los resultados satisfactorios con el parámetro &#8220;-c&#8221;:</p>
<pre>$ grep -cw data test
5
$ grep -c data test
6</pre>
<h3>Excluir resultados, sensibilidad a mayúsculas</h3>
<p>Algo básico a la hora de usar grep es conocer los parámetros &#8220;-v&#8221; que excluye la cadena indicada en el resultado y &#8220;-i&#8221; que especifica que no se tendrá en cuenta si el resultado es mayúscula o minúscula.</p>
<p>Eliminamos las líneas que tienen comodines:</p>
<pre>$ grep -v "#" test
[ndb_mgmd]

[ndbd]

[ndbd]

[mysqld]</pre>
<h3>Uso de pipes</h3>
<p>Todos usamos pipes (|) para acotar resultados. Hacemos un primer grep, con el resultado de ese hacemos otro y así sucesivamente:</p>
<pre>$ grep -iw hostname test | grep 192.168.0.[0-9]0 | grep -v 192.168.0.40 | grep -vw node
hostname=192.168.0.30           # Hostname or IP address
hostname=192.168.0.20           # Hostname or IP address</pre>
<h3>Listar los archivos que contienen la cadena</h3>
<p>Con el parámetro -l podemos ejecutar grep contra varios archivos (y de forma recursiva en múltiples directorios con -R) y recibiremos el listado de archivos con coincidencias sin mostrar las líneas que contienen la cadena:</p>
<pre>$ grep -lR SQL *
config.ini
header.xcf
iptables.sh
test
dir1/test.sql
dir2/prueba.txt
...</pre>
<h3>Número de línea en la que se encuentran los resultados</h3>
<p>Para saber el número de línea en la que se encuentra el resultado utilizaremos el parámetro -n:</p>
<pre>$ grep -n hostname test
2:hostname=192.168.0.10           # Hostname or IP address of management node
8:hostname=192.168.0.30           # Hostname or IP address
...</pre>
<h3>Cuantas veces se encuentran resultados</h3>
<p>Si &#8220;-n&#8221; nos monstraba el nº de línea en el que estaba la coincidencia, &#8220;-c&#8221; nos dice cuantas veces está la búsqueda en el fichero:</p>
<pre>$ grep -c hostname test
4</pre>
<p>Bueno, de momento esto es todo. Por supuesto hay muchas más opciones y explotar la potencia de grep llevaría mucho tiempo así que a partir de aquí investigáis vosotros ;)</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/awk-imprimir-expresion-regular-hasta-final-fichero/" title="AWK: imprimir a partir de una expresión regular hasta el final del fichero">AWK: imprimir a partir de una expresión regular hasta el final del fichero</a></li><li><a href="http://rm-rf.es/grep-mostrar-lineas-anteriores-posteriores-busqueda/" title="Truco GREP: Mostrar líneas anteriores/posteriores al resultado de la búsqueda">Truco GREP: Mostrar líneas anteriores/posteriores al resultado de la búsqueda</a></li><li><a href="http://rm-rf.es/truco-shell-unix-quitar-lineas-en-blanco-de-un-fichero-con-grep/" title="Truco shell Unix: quitar líneas en blanco de un fichero con grep">Truco shell Unix: quitar líneas en blanco de un fichero con grep</a></li><li><a href="http://rm-rf.es/vim-manual-de-expresiones-regulares/" title="Vim: Manual de expresiones regulares">Vim: Manual de expresiones regulares</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/ejemplos-practicos-de-grep-y-egrep/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Volver a concatenar líneas de un LDIF con sed</title>
		<link>http://rm-rf.es/volver-a-concatenar-lineas-de-un-ldif-con-sed/</link>
		<comments>http://rm-rf.es/volver-a-concatenar-lineas-de-un-ldif-con-sed/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 19:40:55 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[OpenLDAP]]></category>
		<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2325</guid>
		<description><![CDATA[Cuando necesitamos manipular a través de scripts un fichero LDIF, y este tiene líneas de atributos divididas con saltos de línea es necesario revertir esto y volver a concatenarlas para poder comenzar a trabajar. Como muchos sabéis, el estándar de LDIF especifica este punto: Any line that begins with a single space MUST be treated [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando necesitamos manipular a través de scripts un fichero <strong>LDIF</strong>, y este tiene líneas de atributos divididas con saltos de línea es necesario revertir esto y volver a concatenarlas para poder comenzar a trabajar. Como muchos sabéis, el estándar de LDIF especifica este punto:</p>
<blockquote><p>Any line that begins with a single space MUST be treated as a continuation of the previous (non-empty) line. When joining folded lines, exactly one space character at the beginning of each continued line must be discarded. Implementations SHOULD NOT fold lines in the middle of a multi-byte UTF-8 character.</p></blockquote>
<p>Vamos a ver entonces como a través de una línea de comandos <strong>usando sed podemos concatenar de nuevo las líneas que comiencen con un espacio con la línea anterior</strong>. El comando es el siguiente:</p>
<pre>$ sed -e :a -e '$!N;s/\n //;ta' -e 'P;D' test.ldif</pre>
<p>Este ejemplo únicamente volcará la salida por pantalla, recordar redirigir <a title="redirigir stdin, stdout y stderr en Unix/Linux" href="http://rm-rf.es/stdin-stdout-y-stderr-redirigir-en-unixlinux/">stdout</a> a otro fichero o forzar con &#8220;-i&#8221; para sobreescribir el mismo fichero.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/usar-autenticacion-ldap-openldap-con-opensshd-sshd/" title="Usar autenticación LDAP (OpenLDAP) con OpenSSHD (sshd)">Usar autenticación LDAP (OpenLDAP) con OpenSSHD (sshd)</a></li><li><a href="http://rm-rf.es/ldap-openldap-instalacion-y-configuracion-i/" title="LDAP (OpenLDAP): instalación y configuración (I)">LDAP (OpenLDAP): instalación y configuración (I)</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><li><a href="http://rm-rf.es/utilizar-variables-dentro-de-sed/" title="Utilizar variables dentro de sed">Utilizar variables dentro de sed</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/volver-a-concatenar-lineas-de-un-ldif-con-sed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cron o anacron, ¿qué elegir?</title>
		<link>http://rm-rf.es/cron-o-anacron-%c2%bfque-elegir/</link>
		<comments>http://rm-rf.es/cron-o-anacron-%c2%bfque-elegir/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 15:04:15 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Comandos]]></category>
		<category><![CDATA[anacron]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[crond]]></category>
		<category><![CDATA[crontab]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2264</guid>
		<description><![CDATA[Pese a que aparentemente su función es la misma, es decir, la de realizar tareas de forma automática y desantendida en momentos concretos y/o periódicos, cada uno tiene sus peculiaridades y características que los hacen bastante distintos y su utilización depende de ámbitos distintos. De cron/crontab ya he hablado en varias ocasiones, no así de [...]]]></description>
			<content:encoded><![CDATA[<p><img align="right" class=" size-full wp-image-2268" title="Cron Linux" src="http://rm-rf.es/wp-content/uploads/2011/09/cronjobs-linux.jpg" alt="Cron Linux" width="187" height="186" />Pese a que aparentemente su función es la misma, es decir, la de <strong>realizar tareas de forma automática y desantendida en momentos concretos y/o periódicos</strong>, cada uno tiene sus peculiaridades y características que los hacen bastante distintos y su utilización depende de ámbitos distintos. De <a title="crontab: modo de uso y ejemplos" href="http://rm-rf.es/crontab-modo-de-uso-ejemplos/">cron/crontab</a> ya he hablado en varias ocasiones, no así de anacron, podéis usar el buscador o seguir el anterior enlace para encontrar más artículos.</p>
<p>Básicamente, las principales diferencias entre cron y anacron son las siguientes:</p>
<ol>
<li>Cron es estricto al 100% a la hora de ejecutar tareas configuradas, todo lo contrario que anacron. Si hay un cron que se tiene que ejecutar todos los días a las 03:00 y el sistema está apagado, cron no lo ejecutará. En cambio, anacron sí, lo ejecutará una vez que el sistema vuelva a encenderse si el trabajo tenía que haberse realizado cuando el equipo estaba apagado. Es decir, <strong>en servidores y sistemas con disponibilidad 24 x 7 x 365 es mejor usar cron, pero en equipos de escritorio o aquellos que puedan estar apagados es mejor anacron</strong>.</li>
<li><strong>Cron permite programar tareas con exactitud de minutos, mientras que en anacron el mínimo es la ejecución diaria</strong> de la tarea, pudiendo únicamente especificar un rango horario en el que se ejecutará.</li>
<li>Cualquier usuario puede tener sus propios cron configurados, mientras que <strong>para usar anacron hay que ser superusuario</strong>. (<a title="Cron linux: autorizar o denegar su uso a usuarios" href="http://rm-rf.es/cron-linux-autorizar-o-denegar-su-uso-a-usuarios/">cron es versatil y se puede restringir</a> si fuera necesario).</li>
<li>Cron corre como demonio todo el tiempo mientras que anacron se ejecuta a través de scripts en el arranque de sistema o con llamadas propias desde cron.</li>
</ol>
<p>Normalmente en la mayoría de sistemas de producción, por no decir en todos encontraréis que se usa cron, anacron se suele dejar para equipos de escritorio, portátiles y demás equipos de uso personal.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/cron-linux-autorizar-o-denegar-su-uso-a-usuarios/" title="Cron linux: autorizar o denegar su uso a usuarios">Cron linux: autorizar o denegar su uso a usuarios</a></li><li><a href="http://rm-rf.es/crontab-modo-de-uso-ejemplos/" title="crontab: modo de uso y ejemplos">crontab: modo de uso y ejemplos</a></li><li><a href="http://rm-rf.es/generar-crontab-de-forma-sencilla/" title="Generar crontab de forma sencilla">Generar crontab de forma sencilla</a></li><li><a href="http://rm-rf.es/cambiar-editor-crontab-por-defecto/" title="Cambiar editor crontab por defecto">Cambiar editor crontab por defecto</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/cron-o-anacron-%c2%bfque-elegir/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

