Skip to content

2. Componentes de trabajo

`## Ejecución Condicional

Argumentos variables y arrays

Argumentos

Al momento de trabajar con bash la ventaja que mas se puede aprovechar es la capacidad de pasarle argumentos desde ya, es decir a partir de la creación del archivo con e script ya tenemos se tiene la capacidad de pasarle argumentos, pero tiene un limite solo se permite pasar hasta solo 9 argumentos a la vez, la forma en com se asignan y son accedidos estos argumentos son ($1-$9)

Arguments, Variables, and Arrays
1i8n@htb[/htb]$ ./script.sh ARG1 ARG2 ARG3 ... ARG9
       ASSIGNMENTS:       $0      $1   $2   $3 ...   $9

suponiendo que se tenia un archivo script.sh al cual se le esta pasando argumentos con un total de 9 argumentos y la asignación es como sigue - ARG1$0 - ARG2$1 - ARG9$9 en caso de que el script necesite obligatoriamente argumentos, se le puede validar de la siguiente manera:

Code: bash
#!/bin/bash

# Check for given argument
if [ $# -eq 0 ]
then
    echo -e "You need to specify the target domain.\n"
    echo -e "Usage:"
    echo -e "\t$0 <domain>"
    exit 1
else
    domain=$1
fi

<SNIP>

Permisos de ejecución

Arguments, Variables, and Arrays
1i8n@htb[/htb]$ chmod +x cidr.sh

Variables Especiales

Las variables especiales utilizan el separador de campo interno (IFS) para identificar cuándo termina un argumento y comienza el siguiente. Bash ofrece varias variables especiales que ayudan durante la creación de scripts. Algunas de estas variables son:

IFS Descripción
$# Esta variable contiene el número de argumentos pasados ​​al script.
$@ Esta variable se puede utilizar para recuperar la lista de argumentos de la línea de comandos.
$n Cada argumento de la línea de comandos se puede recuperar de forma selectiva mediante su posición. Por ejemplo, el primer argumento se encuentra en $1.
$$ El ID del proceso que se está ejecutando actualmente.
$? Estado de salida del script. Esta variable es útil para determinar si un comando se ejecutó correctamente. El valor 0 representa una ejecución exitosa, mientras que 1 es el resultado de una falla.
De las que se muestran arriba, tenemos 3 variables especiales en nuestra condición if-else.
IFS Descripción
$# En este caso, necesitamos solo una variable que se debe asignar a la variable de dominio. Esta variable se utiliza para especificar el destino con el que queremos trabajar. Si proporcionamos solo un FQDN como argumento, la variable $# tendrá un valor de 1.
$0 A esta variable especial se le asigna el nombre del script ejecutado, que luego se muestra en el ejemplo "Uso:".
$1 Separado por un espacio, el primer argumento se asigna a esa variable especial.
### variables

Las variables son un conocimiento general, por lo que definirlo ya queda por demás, por tal razon pasaremos a las reglas especificas que se deben seguir al momento de declarar y asignar valores a dichas variables - El momento de la declaración de la variables no se utiliza el símbolo $ ya que esta solo es utilizado para acceder al valor de la variable - En la declaración no se permite espacios después del nombre de la variable y antes del valor de la variable - Declaración de una variable: error

Arguments, Variables, and Arrays
1i8n@htb[/htb]$ variable = "this will result with an error."

command not found: variable

- Declarar una variable sin errores
    <div class="window_container"><div class="window_content">
                  <div class="window_top">
                      <span class="window_dot bg-danger"></span>
                      <span class="window_dot bg-warning"></span>
                      <span class="window_dot bg-success"></span>
                      <span class="window_title">Arguments, Variables, and Arrays</span>
                  </div>
              <pre class=" language-shell-session" style="line-height: 0px;"><code class=" language-shell-session"><span class="token output"><span class="text-gray">1i8n@htb</span><span class="text-success">[/htb]</span></span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash"><span class="token assign-left variable">variable</span><span class="token operator">=</span><span class="token string">"Declared without an error."</span></span></span>

1i8n@htb[/htb]\(</span> <span class="token bash language-bash"><span class="token builtin class-name">echo</span> <span class="token variable">\)variable

Declared without an error.

Tipos de variables

  1. Variables de entorno: son aquellos que se definen a nivel de todo el sistema
  2. Variables de usuario: son aquellas que tienen un scope local, es decir a nivel de script o archivo

Arrays

los arrays son estructuras de datos lineales, por lo que su declaración en bash consiste en usar solo ("valoe1" "valor n")

Code: bash
#!/bin/bash

domains=(www.inlanefreight.com ftp.inlanefreight.com vpn.inlanefreight.com www2.inlanefreight.com)

echo ${domains[0]}
Code: bash
#!/bin/bash

domains=("www.inlanefreight.com ftp.inlanefreight.com vpn.inlanefreight.com" www2.inlanefreight.com)
echo ${domains[0]}
Arguments, Variables, and Arrays
1i8n@htb[/htb]$ ./Arrays.sh

www.inlanefreight.com ftp.inlanefreight.com vpn.inlanefreight.com

Operadores de comparación

Los operadores de comparación nos permiten comparar el como se comparan los valores de ciertas variables definidas. Para estos operadores, diferenciamos entre: - operadores string  - operadores integer  - operadores file  - operadores boolean 

Operadores String o relacionales

Operador Descripción
== es igual a
!= no es igual a
< es menor que en orden alfabético ASCII
> es mayor que en orden alfabético ASCII
-z Si la cadena está vacía (nula)
-n Si la cadena no es nula
<= | >= | !=
- $() se utiliza para ejecutar un comando y obtener su salida. files=$(ls) # Contenido del directorio de trabajo
  • $(()) se utiliza para evaluar expresiones numéricas en el dominio de los números enteros. result=$(( 1 + 1 )) # 2

Por lo tanto, al intentar evaluar $( 1 + 1) daría un error porque no es un comando válido.

💡
Es importante tener en cuenta aquí que ponemos la variable para el argumento dado ($1) entre comillas dobles ("$1"). Esto le indica a Bash que el contenido de la variable debe manejarse como una cadena. De lo contrario, obtendríamos un error.
Code: bash
#!/bin/bash

# Check the given argument
if [ "$1" != "HackTheBox" ]
then
    echo -e "You need to give 'HackTheBox' as argument."
    exit 1

elif [ $# -gt 1 ]
then
    echo -e "Too many arguments given."
    exit 1

else
    domain=$1
    echo -e "Success!"
fi

Los operadores de comparación de cadenas "< / >" funcionan únicamente dentro de los corchetes dobles [[[[ ]]]]. Podemos encontrar la tabla ASCII en Internet o utilizando el siguiente comando en la terminal. Más adelante veremos un ejemplo.

Comparison Operators
1i8n@htb[/htb]$ man ascii
💡
ASCII significa American Standard Code for Information Interchange y representa una codificación de caracteres de 7 bits. Como cada bit puede tomar dos valores, existen 128 patrones de bits diferentes, que también se pueden interpretar como los números enteros decimales 0 - 127 o en valores hexadecimales 00 - 7F. Los primeros 32 códigos de caracteres ASCII están reservados como los denominados caracteres de control.

Operadores enteros

Comparar números enteros puede resultarnos muy útil si sabemos qué valores queremos comparar. En consecuencia, definimos los siguientes pasos y ordenamos cómo debe manejar el script el valor correspondiente.

Operador Descripción
-eq es igual a
-ne no es igual a
-lt es menor que
-le es menor o igual a
-gt es mayor que
-ge es mayor o igual a
Code: bash
#!/bin/bash

# Check the given argument
if [ $# -lt 1 ]
then
    echo -e "Number of given arguments is less than 1"
    exit 1

elif [ $# -gt 1 ]
then
    echo -e "Number of given arguments is greater than 1"
    exit 1

else
    domain=$1
    echo -e "Number of given arguments equals 1"
fi

Operadores de archivos

Los operadores de archivos son útiles si queremos saber permisos específicos o si existen.

Operador Descripción
-e Si el archivo existe
-f Comprueba si es un archivo
-d Comprueba si es un directorio
-L Comprueba si es un link simbólico.
-N Comprueba si el archivo se modificó después de su última lectura.
-O Si el usuario actual es el propietario del archivo
-G Si el ID de grupo del archivo coincide con el del usuario actual.
-s Comprueba si el archivo tiene un tamaño mayor que 0
-r Comprueba si el archivo tiene permiso de lectura
-w Comprueba si el archivo tiene permiso de escritura
-x Comprueba si el archivo tiene permiso de ejecución
Code: bash
#!/bin/bash

# Check if the specified file exists
if [ -e "$1" ]
then
    echo -e "The file exists."
    exit 0

else
    echo -e "The file does not exist."
    exit 2
fi

Operadores booleanos y lógicos

Obtenemos un valor booleano "falso" o "verdadero" como resultado con operadores lógicos. Bash nos da la posibilidad de comparar cadenas usando corchetes dobles [[[[  ]]]]. Para obtener estos valores booleanos, podemos usar los operadores de cadena. Ya sea que la comparación coincida o no, obtenemos el valor booleano "falso" o "verdadero".

Code: bash
#!/bin/bash

# Check the boolean value
if [[ -z $1 ]]
then
    echo -e "Boolean value: True (is null)"
    exit 1

elif [[ $# > 1 ]]
then
    echo -e "Boolean value: True (is greater than)"
    exit 1

else
    domain=$1
    echo -e "Boolean value: False (is equal to)"
fi

Operadores lógicos

Con los operadores lógicos podemos definir varias condiciones dentro de una. Esto significa que todas las condiciones que definamos deben coincidir antes de que se pueda ejecutar el código correspondiente.

Operador Descripción
! negociación lógica NO
&& logical AND
\|\| logical OR
Code: bash
#!/bin/bash

# Check if the specified file exists and if we have read permissions
if [[ -e "$1" && -r "$1" ]]
then
    echo -e "We can read the file that has been specified."
    exit 0

elif [[ ! -e "$1" ]]
then
    echo -e "The specified file does not exist."
    exit 2

elif [[ -e "$1" && ! -r "$1" ]]
then
    echo -e "We don't have read permission for this file."
    exit 1

else
    echo -e "Error occured."
    exit 5
fi

Exercise Script

Code: bash
#!/bin/bash

var="8dm7KsjU28B7v621Jls"
value="ERmFRMVZ0U2paTlJYTkxDZz09Cg"

for i in {1..40}
do
        var=$(echo $var | base64)

        #<---- If condition here:
done
# Cree una condición "If-Else" en el bucle "For" que verifique si la variable denominada "var" contiene el contenido de la variable denominada "value". Además, la variable "var" debe contener más de 113.450 caracteres. Si se cumplen estas condiciones, el script debe imprimir los últimos 20 caracteres de la variable "var". Envíe estos últimos 20 caracteres como respuesta.

Operadores aritméticos

En Bash, tenemos siete operadores aritméticos diferentes con los que podemos trabajar. Estos se utilizan para realizar diferentes operaciones matemáticas o para modificar ciertos números enteros.

Arithmetic Operators

Operator Description
+ Addition
- Subtraction
* Multiplication
/ Division
% Modulus
variable++ Increase the value of the variable by 1
variable-- Decrease the value of the variable by 1
Code: bash
#!/bin/bash

increase=1
decrease=1

echo "Addition: 10 + 10 = $((10 + 10))"
echo "Subtraction: 10 - 10 = $((10 - 10))"
echo "Multiplication: 10 * 10 = $((10 * 10))"
echo "Division: 10 / 10 = $((10 / 10))"
echo "Modulus: 10 % 4 = $((10 % 4))"

((increase++))
echo "Increase Variable: $increase"

((decrease--))
echo "Decrease Variable: $decrease"

También podemos calcular la longitud de la variable. Con esta función ${#variable}, se cuentan todos los caracteres y obtenemos el número total de caracteres de la variable.

Code: bash
#!/bin/bash

htb="HackTheBox"

echo ${#htb}