Muchas veces necesitamos hacer algún script en bash donde queremos que tenga ciertas características, y muchas veces queremos que las salidas por pantalla de ese script se vean distintas para llamar la atención.

bash_colors

Pues bien, se puede usar colores para el texto en el bash de una forma sencilla.

Esta es la lista de algunos de los códigos de color para nuestro texto:

  • Negro = 0;30
  • Gris oscuro = 1;30
  • Azul = 0;34
  • Azul claro = 1;34
  • Verde = 0;32
  • Verde claro = 1;32
  • Cyan = 0;36
  • Cyan claro = 1;36
  • Rojo = 0;31
  • Rojo claro = 1;31
  • Púrpura = 0;35
  • Púrpura claro = 1;35
  • Café = 0;33
  • Amarillo = 1;33
  • Gris = 0;37
  • Blanco = 1;37

El comando echo se debe de ejecutar con el parámetro -e haciendo que bash interprete el comando \e (o sea el escape) de esta manera:

echo -e ‘Esto es \e[0;31mrojo\e[0m y esto es \e[1;34mazul resaltado\e[0m’

Resultado: Esto es rojo y esto es azul

echo -e ‘Así se escribe \e[1;34mG\e[0m\e[1;31mo\e[0m\e[1;33mo\e[0m\e[1;34mg\e[0m\e[1;32ml\e[0m\e[1;31me\e[0m’

Resultado: Así se escribe Google

En resumen para poder utilizarlo solo hay que poner los caracteres que quieras que tengan color entre los caracteres de escape de esta manera:

‘\e[CODIGOm(texto)\e[0m’ (el texto sin los paréntesis)

Colores de fondo

De la misma forma podemos cambiar el color de fondo mediante los siguientes valores:

  • Negro = 40
  • Rojo = 41
  • Verde = 42
  • Amarillo = 43
  • Azul = 44
  • Rosa = 45
  • Cyan = 46
  • Blanco = 47

Para utilizarlo solo debemos seguir la siguiente sintaxis:

echo -e "\e[42mMuestra\e[49m"

Como se puede apreciar en la imagen que acompaña este post las combinaciones pueden ser bastante grandes y solo hace falta un poco de creatividad para crear resultados llamativos. Cabe destacar que el código \e[49m regresa el color de fondo al original.

Leer más

A veces no podemos utilizar nuestro servidor principal, ya que estamos cambiándolo, actualizándolo, peleándonos con dependencias o trabajando en configuración o plug-ins. Por lo que necesitamos algo para reemplazarlo momentáneamente.

Tampoco se quiere algo demasiado grande porque es para un apaño. Tal vez no tengamos nodeJs instalado, o python en los que nos podemos crear un servidor web con pocas líneas. Y tampoco queremos tener que instalar demasiadas cosas.

Como alternativa ligera podemos usar netcat el cual viene instalado por defecto en muchas distribuciones.

Sólo tenemos que ejecutar lo siguiente:

$ sudo -c sh 'while true; do nc -l -p 80 < respuesta.html; done'

Sin sudo y con usuario root si no disponemos de él en el sistema. Con esto, vamos a poner constantemente en escucha el puerto 80 y procesando todas las peticiones de la misma forma, devolviendo los contenidos de respuesta.html.

Las pruebas pueden realizarse como un usuario normal (no root) si utilizamos un puerto mayor de 1024, por ejemplo el 8000, 8080, 1234, etc:

$ while true; do nc -l -p 8000 < respuesta.html; done

Como la respuesta debe ser muy rápida, en principio no tenemos necesidad de algo más complicado (esperemos que no vengan demasiadas visitas mientras trabajamos). Pero este sistema no soportará usuarios concurrentes, recordemos que es sólo un servidor temporal y puede que a algún usuario le dé algún problema en conectar. Podemos guardar un registro de todo lo que ha pasado con:

$ sudo -c sh 'while true; do nc -l -p 80 < respuesta.html; done > log'

o como usuario:

$ while true; do nc -l -p 8000 < respuesta.html; done > log

Creando respuesta.html

Como habrás podido ver respuesta.html no es un archivo HTML normal, en realidad aquí hay que poner toda la respuesta completa (con cabeceras incluidas), podemos hacer algo sencillo primero:

HTTP/1.1 200 OK
Server: LittleServer
Content-Type: text/html;charset=UTF-8<html>
<body>
<h1>Lo sentimos, estamos de mantenimiento</h1>
Disculpe las molestias, en un momento estaremos con usted.

&lt;/body&gt;
&lt;/html&gt;

La página a partir de la etiqueta <html>, podemos poner el código HTML que queramos. Aunque ahora estaremos contestando con un código de salida exitoso, lo que significa que los usuarios no se cabrearán (bueno sí, pero al menos verán una explicación), pero los buscadores y robots sí que la tomarán con nosotros, porque se creerán que ésta es la página buena, es más todas las páginas del servidor responderán lo mismo.

Respondiendo para que los buscadores no nos tengan en cuenta

Para ello tenemos que poner en nuestra cabecera un error 503 (Servicio no disponible). Esto será bueno porque no devolveremos un 200 (OK) para las páginas temporales, ni devolveremos un 404 (Not found / No encontrado) para el resto de páginas que no estén en nuestro servidor pero si deberán estar y el buscador de turno lo sabe (esto último sería horrible para nuestro posicionamiento, porque el buscador se creería que esas páginas ya no existen y las desindexará).

Para ello, nuestro archivo de respuesta.html será el siguiente:

HTTP/1.1 503 Service Unavailable
Server: Maintenance
Retry-After: 3600
Content-Type: text/html;charset=UTF-8&lt;html&gt;
&lt;body&gt;
<h1>Lo sentimos, estamos de mantenimiento</h1>
Disculpe las molestias, en un momento estaremos con usted.

&lt;/body&gt;
&lt;/html&gt;

Además, añadiremos Retry-After para que vuelvan dentro de un rato a ver si todo está bien. No se garantiza que los buscadores vuelvan dentro de una hora (3600 segundos), pero es normal que vuelvan cuando tengan un rato después de una hora.

Queremos complicarnos la vida

Si has llegado hasta aquí, eres de los que le gustan complicarse la vida e inventar cosas, así que, para dejar un poco a la imaginación y para hacer un servidor web un poco más completo.

Vamos a crear un script que procesará la petición HTTP que se realice (tenemos que recordar que cuantas más cosas metamos, más vulnerable será nuestro sistema, y un script aquí es tremendamente vulnerable).

dispatcher.sh

#!/bin/bash
I=0
while read RAWINPUT; do
if [ ${#RAWINPUT} -le 1 ]
then
break
fi
INPUT[$I]=$RAWINPUT
I=$(($I+1))
doneread -a FIRSTLINE <<< ${INPUT[0]}
METHOD=${FIRSTLINE[0]}
REQUEST=${FIRSTLINE[1]}
HTTPVER=${FIRSTLINE[2]}

echo $HTTPVER 503 Service Unavailable
echo "Retry-After: 3600"
echo "Server: Bash-Maintenance"
case "$REQUEST" in
"/logo.jpg")
FILE="my-logo-file.jpg"
echo "Content-Type: image/jpeg"
echo "Content-Length: "$(stat -c%s "$FILE")
echo
cat $FILE
;;
"/fortune")
CONTENT=$(fortune)
echo "Content-Type: text/html; charset=utf-8"
echo "Content-Length: "${#CONTENT}
echo
echo $CONTENT
;;
*)
FILE="respuesta.html"
echo "Content-Type: text/html; charset=utf-8"
echo "Content-Length: "$(stat -c%s "$FILE")
echo
cat $FILE
;;
esac

Ahora tenemos 3 respuestas posibles:

  • Una para una imagen que llamaremos a través de http://nuestroservidor/logo.jpg y que llamará a la imagen my-logo-file.jpg
  • Otra que llamará al programa fortune, para que nos devuelva una frase aleatoria.
  • Otra que atenderá todas las demás peticiones (*) y servirá el archivo respuesta.html.

Para hacer que netcat utilice este archivo, depende de la versión, por un lado podemos llamar a:

$ sudo sh -c 'while true; do nc -v -l -p 80 -c dispatcher.sh; done'

como usuario:

$ while true; do nc -v -l -p 8000 -c dispatcher.sh; done

Aunque en muchas versiones de GNU/Linux viene otra versión instalada que no soporta -c, pero no todo está perdido:

$ rm /tmp/bashwebtmp; mkfifo /tmp/bashwebtmp; sudo -c sh 'while true; do cat /tmp/f | bash dispatcher.sh | nc -v -l -p 80 > /tmp/f; done';

como usuario:

$ rm /tmp/bashwebtmp; mkfifo /tmp/bashwebtmp; while true; do cat /tmp/f | bash dispatcher.sh | nc -v -l -p 8000 > /tmp/f; done;

No debemos olvidar borrar la pipe /tmp/bashwebtmp cuando terminemos de usar el programa.

Una cosa más, no debemos abusar de este script y no debemos enviar contenidos muy grandes, por ejemplo, no abusar de las imágenes, como decía antes, sólo soporta una conexión, si hacemos que esta conexión se extienda en el tiempo perderemos capacidad de atender más conexiones.

Visto en: Poesía Binaria

Leer más

En estos días me toco recuperar mi VPS vía consola remota, al revisar el /var/log/messages me di cuenta de el Out of Memory Killer (OOM Killer) había hecho de las suyas al quedarse sin memoria. Luego de analizar detenidamente los logs y me di cuenta que fue una combinación de factores, Google, Yahoo y Yandex me estaban indexando tanto este blog como unos foros de autos que alojo en este servidor al mismo tiempo.

El script para descargar torrents estaba corriendo al igual que el torrent tracker y alguien me estaba haciendo flood vía IRC en freenode puede había dejado irssi conectado.

El OOM Killer tiene un algoritmo que decide que procesos son los mejores para aniquilar sin embargo es posible manipular estos valores y dejarle saber al OOM Killer que procesos prefieres que mate primero. Para automatizar esta tarea hice un script que nos ayudara con esta tarea:

for programas in SCREEN irssi top
  do for pid_of_oomk_candidate in `pidof -x $programas`
    do echo 10 > /proc/$pid_of_oomk_candidate/oom_adj
    done
 done

Como ven el script anterior agrega 10 al OOMK score a los procesos que menos me interesan permanezcan vivos cuando me quede sin memoria mientras que el siguiente hará exactamente lo contrario, mantendrá vivo un poco mas estos procesos:

for programas in mysqld portsentry iptables
  do for pid_of_oomk_candidate in `pidof -x $programas`
    do echo -5 > /proc/$pid_of_oomk_candidate/oom_adj
  done
done

echo -17 > /proc/`pidof -s sshd`/oom_adj

En este ultimo mysql portsentry y iptables tendrán cinco puntos de ventaja en relación con el resto de los candidatos y si se fijan en la ultima linea estamos asegurándonos que sshd no sea candidato bajo ninguna circunstancia.


Automatizar el ajuste del score para el OOM Killer

Ahora unifiquemos estos dos scripts y demosle un poco mas de flexibilidad, estoy seguro que hay gente que prefiere asignarle a irssi un valor distinto de screen. Lo primero que necesitaremos es un script de configuración, vamos crearlo en /etc/candidatos_oomk.conf y el contenido se debería de ver algo así:

# Programas que queremos sacrificar, entre mas alto el valor
# mas peso tienen en la lista de candidatos.
irssi 4
SCREEN 3
smtpd 2
apache2 1

# Programas que queremos salvar, estos tendrán valores negativos
portsentry -2
mysqld -5
sshd -17

El script al que le puse de nombre oomk_adj_candidatos.sh se veria algo asi:

#!/bin/bash
CONFIGURACION="/etc/candidatos_oomk.conf"
while read programas
  do  proceso=`echo $programas |grep -v \# | grep [0-9]$| awk '{print $1}'`
  ajuste=`echo $programas |grep -v \# | grep [0-9]$| awk '{print $2}'`
  if [ -z "$proceso" ] then
    continue
  else
    echo $proceso
    for pids_proceso in `/bin/pidof $proceso`
      do echo "    echo $ajuste > /proc/$pids_proceso/oom_adj"
    done
  fi done < $CONFIGURACION

El script es simple, leemos el archivo de configuracion linea por linea separamos el nombre del proceso del ajuste que le vamos a hacer guardando cada valor en las variables $proceso y $ajuste. Evaluamos si la variable $proceso esta vacía, y de ser así seguimos con la próxima linea, de lo contrario continuamos procesando esa misma linea. Obtenemos el PID del proceso usando pidof y para cada PID vamos escribir el valor de $ajuste en su archivo oom_adj dentro de /proc.

Pueden colocar este script en su /etc/rc.local o en un cronjob y recuerden que si quieren consultar la lista de candidatos y ver como están sus scrores o saber un poco mas del tema, pueden consultar este articulo: El OOM Killer y manipulación de candidatos.

Leer más

Mas de una vez he intenten ejecutar sl cuando intentan ejecutar ls para listar archivos y directorios, es un error que todos cometemos pero ¿que pasaria si sl en realidad fuese un comando?. Afortunadamente para nuestro entretenimiento hay una aplicación de nombre sl y consiste en un tren ascii que sale en el terminal cada vez al momento de ejecutar sl. Perfecto para una broma practica, instalarlo en un servidor que muchas personas usan y esperar a escuchar los cuentos.

Aquí les dejo un video que muestra como instalarlo y como se ve al momento de ejecutarlo.


En caso de que no puedas ver el video, puedes instalar esta aplicación ejecutando:

su - yum install -y sl

Como ven es inofensivo, o por lo menos menos inofensivo que un ualias a rm -Rf /*, de hecho un compañero de trabajo fue el que me comento sobre esta broma practica. La aplicación sl esta disponible para OSX a través del manejador de paquetes brew.

Leer más

Solemos tener dispositivos montados que en un momento especifico debemos desmontarlo y alguien lo ocupa o esta usando alguno de los archivos dentro de estos.

algunos ejemplos seria con

#kill -9 PID
#showmount -a
#umount /dispositivo /puntodemontaje

existen numerosos metodos para desmontar  los dispositivos, en todo caso, cuando hay un dispositivo ocupado y que no puede desmontase, nos podemos preguntar.

Quien controla el dispositivo?
Que dispositivo es y que esta haciendo?
Desde donde esta accesdiendo el dispositivo?

UNIX no informa acerca de los dispositivos en uso por un usuario. Para identificar el proceso o el usuario que mantiene ocupado a un dispositivo tenemos mayormente que ejecutar una seride de comandos, comenzando con una busqueda local y despues exendiendola por toda una red, si aplica como en mi caso.

Intente con el comando umount desmontar el dispositivo /dev/sdc1 pero el STDOUT me dice “Resource Busy”

Busque si el dispositivo estaba ocupado po un proceso local y eliminarlo con kill

#ps -ef
root     10413     2  0 17:34 ?        00:00:00 [flush-8:16]
telecom  10428     1  0 17:34 ?        00:00:00 evince /media/DISPOSITIVO1/63243252-inecuaciones.pdf
telecom  10433     1  0 17:34 ?        00:00:00 /usr/lib/evince/evinced
root     10441  8466  0 17:35 pts/0    00:00:00 ps -ef

kill -9 10428

si esto no funciona y el numero de usuarios es reducido debemos buscar por cada usuario

#w | awk ‘{print $1}’ | finger -s
Login     Name              Tty      Idle  Login Time   Office     Office Phone
telecom   telecom venetur  *tty7     3:59  Mar 14 13:48 (:0)

esta linea de comando regoje informacion del comando w, exhibe las identificaciones de los usuaios
mediante el comando awk y ofrece un breve finger de cada una, Informa quien esta en el sistemam de manera
que se puede contactar al usuario y podra contactarlo directamente antes de tomar una accion.

en distribuciones basadas en debian debes instalar finger, este se encuentre en los respositoios, solo basta con un aptitude install finger y listo!

una vez conociendo los usuario podemos conectarnos por ssh preferiblemente o por telnet a ellos ver los dispositivos que tienen montados y tratar de desmontarlo en caso de que lo esten usando por la red y ejecutar un comando df -k

df -k
S.ficheros         Bloques de 1K   Usado    Dispon Uso% Montado en
/dev/sda3             78955032  60309912  14634268  81% /
tmpfs                     5120         0      5120   0% /lib/init/rw
udev                    959204         0    959204   0% /dev
tmpfs                   385444         0    385444   0% /var/run/shm
tmpfs                   192724       948    191776   1% /var/run
/dev/sr0                682094    682094         0 100% /media/Custom Live CD
/dev/sdc1              7806784   6455216   1351568  83% /media/DISPOSITIVO1

y seguimos buscando informacion util recorriendo los arboles de UNIX en busca de enlaces blandos

# ls -al /usr/ | grep ^l

otros comando que podemos usar en sistemas como Solaris o FreeBSD son dfmounts [-F nfs ] o showmount -a

en estos caso podemos usar el comodin unmount “lease bien” es distinto al umount de Linux pero con una sintaxis similar
y esto es algo asi como un “¡Te Despontare a como de Lugar!”

unmount -k nomb_sistema_archivos

Los dispositivos de almacenamiento se distinguen por provocar caidas de sistemas cuando su capacidad esta a punto de agotarse,
Si la unidad de vuelve “ruidosa” o envia mensajes de error de I/O a la consola, conviene respaldar lo mas pronto posible y desmontarla
para excluirla del sistema hasta reemplazarla.

Leer más

Tengo ya unos días tratando de recordar y averiguar cuando fue que empecé a usar Twitter y solo consigo paginas que no me inspiran mucha confianza, que se ofrecen para darte esta información.

Revisando la documentación de la API de esta red social, conseguí como hacerlo aunque no esta explícitamente documentado. Esta información del usuario se envía cada vez que uno hace una petición por su timeline usando grep, awk, tr y curl fácilmente se puede ver cuando se creó la cuenta.

cuando fue creada una cuenta en twitter

Este script muestra cuando fue creada la cuenta además de cuantas personas sigue, cuantos lo siguen y cuantos twits ha publicado:

#!/bin/bash
curl -s "https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=$1&count=0" | tr ',' '\n' | grep  \"created_at\" | tail -n 1
curl -s "https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=$1&count=0" | tr ',' '\n' | grep -m2 -E 'friends_count|statuses_count|followers_count'

Como ven el script acepta un parámetro que para que funcione correctamente debe de ser el handle que en mi caso es orvtech, para ver mi información pueden ejecutar:

./twitter-creado.sh orvtech "created_at":"Thu Apr 12 21:35:06 +0000 2007" "friends_count":236 "statuses_count":5065 "followers_count":251

Estoy seguro que se puede optimizar incluso remplazar esas dos peticiones web por una sola y remplazar el tr, grep y el tail con una sola instrucción de awk pero solo quería demostrar como hacerlo. Si quieren aprender mas del API de twitter pueden visitar https://dev.twitter.com/docs.

Leer más

Hoy resolvi como enviar procesos al fondo dentro de un loop en BASH, tal vez exista una forma mas limpia de hacerlo pero esta me funciono. Este será un tip mas para esa serie de post cortos pero que vale la pena agregar a los bookmarks.

Enviar procesos al fondo desde un loop en bash

El tip como tal realmente simple, solo tienes que incluir lo que quieras enviar al fondo dentro de llaves {}. Lo que quieras enviar al fondo debe lucir muy parecido a esto:

{ ping orvtech.com & }

Veamos este otro ejemplo.

for i in `echo $correos`
  do echo "trabajando en usuario $i"
  { crawler.sh -H $i run "grep $1 crawler.tmp" | awk -F\" '{print $2}' | awk -F\, '{print $1}' > usuarios.txt & }
done
jobs

Con el commando jobs puedes monitorear los procesos que se han enviado al fondo.

Leer más

creando esta semana algunas politicas de los servidores en esta oportunidad tanto proxy, dhcp como firewall me vi en la necesidad de hacer un inventario de las mac address de cada una de las redes existente en el edificio.. escribir este pequeño bash que haciendo ping a cada ip dentro de un rango, hace tambien una consulta arp para captura la mac y las almacena en un archivo de texto plano en el directorio donde se ejecuta.

#!/bin/bash

for i in `seq 1 30`; do ping -c 1 10.0.10.$i; arp -n 10.0.10.$i | grep -v Address | grep -v incomplete | awk ‘{print $1, $3}’ >> ip-mac.txt; done

lo guardo el bash bajo un nombre.sh en mi caso lo llame iparpmac.sh

le damos privilegios de ejecucion con chmod +x iparpmac.sh y lo corremos

./iparpmac.sh

El resultado segun el programa _seq_ que defino en la primera linea y la unica`seq 1 30` me dice quede átoda la red me capturará 30 direcciones ip, esto lo pueden adaptar segun las necesidad o la netmask de la red en donde de implemente.

El propocito inicial en mi caso fue para crear las ACL para el DNS y mayormente para proxy en  squid haciendo filtrado por MAC address mediante ACL’s.

tengo script q tambien crea las ACL para el squid.. pronto estaré actualizando el post..

Leer más

Mi presentación ante el Grupo de Usuarios de Linux de South MIami Dade

A finales del 2006 fue la ultima vez que asistí a una reunión del grupo de usuarios de Linux (LUG por su siglas en ingles) de Miami hasta este pasado fin de semana. El grupo es un poco mas pequeño de lo que recuerdo pero las intenciones y la motivación siguen siendo las mismas.

Mi participación este pasado 11 de Junio no se limito a ser oyente, por el contrario, di una corta charla que consistió en un recuento del FUDcon de Panamá, Un servidor casero económico y diagnosticar problemas usando strace.

El tema que mas genero preguntas fue el del "Un servidor casero económico" especialmente sobre un NSLU2 que lleve para que lo vieran, algunos de los participantes no podían creer que esa cosa tan pequeña con un costo menor de $30 pudiese convertirse en un servidor web. Parte de mi charla consistió en demostrar lo que es capaz de hacer este mini NAS hackeado a mini server, así que les mostré el blog http://www.linuxevolution.org que esta corriendo sobre mi NSLU2 y además les hice una demostración de transmisión de imágenes en vivo con fotos del evento.

La charla cerro con el tema de 'Diagnosticar problemas con strace' fue la siguiente y aunque cubrí todo lo básico, me hubiese gustado haber hecho una practica sobre este tema.

Aquí les dejo un video de parte de mi presentación donde le explico a un miembro del LUG sobre el NSLU2. Me despido muy agradecido con Jonathan Respeto del southdadelug.org por su invitación a este evento y pueden descargar aqui mi presentación en formato PDF.

Si te pareció interesante este articulo, tal vez este otro también te interese: Reunión de septiembre en el LUG de Miami

Leer más

El modo de single user (usuario individual) un modo en el cual un sistema operativo multi-usuarios es iniciado en modo de super usuario. Por lo general se usa para mantenimientos. En Linux es muy popular iniciar en este modo para cambiar el password del usuario.

Aquí les dejo los pasos para arrancar Fedora (y la mayoría de las distribuciones de linux) en modo single user.

  1. Al momento de arrancar presiona 'TAB' y seleccionamos el kernel desde el cual queremos arrancar en caso de que tengamos varios. deberías de ver una pantalla como esta: Seleccionamos la primera opción de arranque de Fedora Linux y presionamos la tecla e para editarla

  2. Presiona la tecla E para editar esta entrada en el menú de grub y selecciona la segunda linea, la que comienza con la palabra kernel.

    Es esta segunda linea que vamos a editar

  3. Presiona E para que puedas editar esa linea y agregar la palabra single al final de la linea.

    Asi se ve el inicio de la linea que vamos a editar en la configuración de grub

    Aquí vamos a editar los parámetros que se le pasa al kernel, podemos borrar quiet y rhgb

    Aquí vamos a editar los parámetros que se le pasa al kernel, podemos borrar quiet y rhgb

    Le pasamos el parámetro single al kernel en el grub

    Le pasamos el parámetro single al kernel en el grub

  4. Presiona ENTER para finalizar la edición de parámetros del kernel. Seguidamente presiona la tecla B para arrancar esa entrada del grub en modo single user. Como ven, ejecutando el comando who -r muestra en que nivel estamos, en este caso estamos en single.

    who -r nos muestra que estamos en single user mode

Una vez que iniciamos bajo modo single user, podemos iniciar el servicio de red ejecutando /etc/init.d/network start. Suficiente para usar fpaste y irssi y consultar cualquier duda que tengamos en el canal #fedora del servidor irc.freenode.net.

Supongamos que necesitamos soporte por que nuestra laptop no termina de iniciar. Algo que podemos hacer es iniciar en mode single user, arrancar el servicio de red y ejecutar cat /var/log/messages | fpaste luego ejecutamos irssi -c irc.freenode.net y nos unimos al canal de Fedora LATAM con el comando /j #fedora-latam, allí podemos compartir la URL que nos dio como resultado el comando fpaste.

Existe aun un nivel mas bajo que single user mode donde no se montan particiones en modo escritura. Es un nivel mucho mas básico. Para entrar en este nivel es necesario pasarle al kernel el parámetro init=/bin/bash en vez de pasarle single. Le pasamos el parámetro init con el valor /bin/bash al kernel en el grub

Un nivel mas bajo que single. Bajo init=/bin/bash el comando who no reporta en que nivel estamos. Un nivel mas bajo que single. Bajo /bin/bash el comando who no reporta en que nivel estamos

Leer más