Más sobre el sistema Linux, Bash y Perl
En un sistema Linux, hay varios scripts y archivos escritos en Bash que se utilizan para diversas tareas de configuración y automatización. Aquí tienes una lista de algunos de los archivos y scripts más comunes, junto con una breve explicación de su propósito:
Archivos de Configuración y Scripts Comunes en Bash:
- ~/.bashrc:
- Ubicación: Directorio de inicio del usuario.
- Propósito: Configura el entorno del usuario cuando se abre una nueva terminal interactiva. Aquí puedes definir alias, funciones y variables de entorno.
- ~/.bash_profile o ~/.profile:
- Ubicación: Directorio de inicio del usuario.
- Propósito: Se ejecuta al iniciar una sesión de login. Se usa para configurar el entorno del usuario, establecer variables de entorno y ejecutar scripts al inicio de sesión.
- /etc/bash.bashrc:
- Ubicación: Sistema global.
- Propósito: Archivo de configuración que se aplica a todos los usuarios. Se ejecuta cada vez que un usuario abre una nueva terminal interactiva.
- /etc/profile:
- Ubicación: Sistema global.
- Propósito: Se ejecuta al iniciar una sesión de login para todos los usuarios. Configura el entorno y aplica ajustes globales para todas las sesiones de usuario.
- /etc/profile.d/:
- Ubicación: Sistema global.
- Propósito: Contiene scripts adicionales que se ejecutan al iniciar una sesión de login. Permite modularizar configuraciones globales en múltiples archivos.
- ~/.bash_logout:
- Ubicación: Directorio de inicio del usuario.
- Propósito: Se ejecuta cuando un usuario cierra una sesión de login. Se usa para realizar tareas de limpieza al salir, como borrar archivos temporales.
- /etc/rc.local:
- Ubicación: Sistema global.
- Propósito: Archivo de script que se ejecuta al final del proceso de arranque del sistema. Se utiliza para ejecutar comandos y scripts específicos al inicio del sistema.
- /etc/init.d/:
- Ubicación: Sistema global.
- Propósito: Contiene scripts de inicio y parada de servicios del sistema. Los scripts aquí son utilizados por el sistema init para administrar servicios y demonios.
- /etc/crontab:
- Ubicación: Sistema global.
- Propósito: Archivo de configuración para tareas programadas (cron jobs). Permite especificar comandos o scripts que deben ejecutarse en momentos específicos.
- /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/:
- Ubicación: Sistema global.
- Propósito: Directorios que contienen scripts que se ejecutan diariamente, semanalmente o mensualmente mediante el servicio cron.
Ejemplo de Uso:
Para añadir un alias en el archivo ~/.bashrc
, podrías añadir la siguiente línea:
bash
alias ll='ls -lah'
Esto define el alias ll
para ejecutar ls -lah
, que lista los archivos en un formato largo y detallado, incluyendo archivos ocultos.
Estos son algunos de los archivos y scripts más comunes escritos en Bash en un sistema Linux. Cada uno juega un papel importante en la configuración y automatización del sistema, permitiendo tanto a usuarios como a administradores personalizar su entorno y realizar tareas repetitivas de manera eficiente.
~/.bashrc:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
# make less more friendly for non-text input files, see lesspipe(1)
#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
# The following block is surrounded by two delimiters.
# These delimiters must not be modified. Thanks.
# START KALI CONFIG VARIABLES
PROMPT_ALTERNATIVE=twoline
NEWLINE_BEFORE_PROMPT=yes
# STOP KALI CONFIG VARIABLES
if [ "$color_prompt" = yes ]; then
# override default virtualenv indicator in prompt
VIRTUAL_ENV_DISABLE_PROMPT=1
prompt_color='\[\033[;32m\]'
info_color='\[\033[1;34m\]'
prompt_symbol=㉿
if [ "$EUID" -eq 0 ]; then # Change prompt colors for root user
prompt_color='\[\033[;94m\]'
info_color='\[\033[1;31m\]'
# Skull emoji for root terminal
#prompt_symbol=💀
fi
case "$PROMPT_ALTERNATIVE" in
twoline)
PS1=$prompt_color'┌──${debian_chroot:+($debian_chroot)──}${VIRTUAL_ENV:+(\[\033[0;1m\]$(basename $VIRTUAL_ENV)'$prompt_color')}('$info_color'\u'$prompt_symbol'\h'$prompt_color')-[\[\033[0;1m\]\w'$prompt_color']\n'$prompt_color'└─'$info_color'\$\[\033[0m\] ';;
oneline)
PS1='${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV)) }${debian_chroot:+($debian_chroot)}'$info_color'\u@\h\[\033[00m\]:'$prompt_color'\[\033[01m\]\w\[\033[00m\]\$ ';;
backtrack)
PS1='${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV)) }${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ';;
esac
unset prompt_color
unset info_color
unset prompt_symbol
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*|Eterm|aterm|kterm|gnome*|alacritty)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
[ "$NEWLINE_BEFORE_PROMPT" = yes ] && PROMPT_COMMAND="PROMPT_COMMAND=echo"
# enable color support of ls, less and man, and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
export LS_COLORS="$LS_COLORS:ow=30;44:" # fix ls color for folders with 777 permissions
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias diff='diff --color=auto'
alias ip='ip --color=auto'
export LESS_TERMCAP_mb=$'\E[1;31m' # begin blink
export LESS_TERMCAP_md=$'\E[1;36m' # begin bold
export LESS_TERMCAP_me=$'\E[0m' # reset bold/blink
export LESS_TERMCAP_so=$'\E[01;33m' # begin reverse video
export LESS_TERMCAP_se=$'\E[0m' # reset reverse video
export LESS_TERMCAP_us=$'\E[1;32m' # begin underline
export LESS_TERMCAP_ue=$'\E[0m' # reset underline
fi
# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
# some more ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
Desglosando y explicando el contenido de .bashrc:
Vamos a desglosar y explicar el contenido de tu archivo .bashrc
paso a paso:
Introducción
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) for examples
Este archivo es ejecutado por bash
para shells no interactivos (cuando no inicias sesión directamente).
No hacer nada si no es interactivo
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Este bloque verifica si el shell es interactivo (contiene ‘i’ en -
). Si no es interactivo, sale del script.
Vamos a desglosar estos conceptos para que queden claros.
Ese fragmento de código que aparece en .bashrc
es una pequeña joya de la shell scripting, y tiene una función muy concreta: verificar si la sesión actual es interactiva. Vamos a desmenuzarlo paso a paso:
🧠 ¿Qué significa $-
?
$-
es una variable especial en Bash que contiene los flags actuales de la shell.- Si la shell es interactiva, uno de esos flags será la letra
i
.
Por ejemplo:
echo $-
Podría devolver algo como himBH
si es interactiva, o simplemente hB
si no lo es.
🔍 ¿Qué hace case $- in
?
Este bloque evalúa el contenido de $-
usando una estructura case
, que es como un switch
en otros lenguajes.
case $- in
*i*) ;; # Si contiene 'i', no hace nada
*) return ;; # Si no contiene 'i', ejecuta 'return'
esac
Detalle de cada línea:
*i*) ;;
Si el valor de$-
contiene la letrai
en cualquier posición (*i*
es un patrón comodín), significa que la shell es interactiva.
Entonces, no se hace nada (;;
es el final del bloque).*) return ;;
Si no contienei
, entonces la shell no es interactiva (por ejemplo, si se está ejecutando como parte de un script).
En ese caso, se ejecutareturn
, que sale del script actual sin continuar ejecutando el resto del.bashrc
.
🎯 ¿Por qué es útil esto en .bashrc
?
El archivo .bashrc
está pensado para configuraciones interactivas: alias, funciones, colores, etc.
Si se carga en una shell no interactiva, podría causar errores o comportamientos no deseados.
Este fragmento evita eso: protege el entorno asegurándose de que .bashrc
solo se ejecute cuando tiene sentido.
¿Quieres que te lo reformule en tono más didáctico para incluirlo en tu artículo? También puedo ayudarte a mostrar un ejemplo práctico para que tus lectores lo vean en acción.
¡Qué buena pregunta, David! Vamos a meternos de lleno en los flags de la shell y en los conceptos de interactividad, porque entender esto te da una visión mucho más profunda de cómo funciona Bash por debajo del capó.
🏁 ¿Qué son los flags en $-
?
La variable especial $-
contiene una cadena de letras, cada una representando un modo o comportamiento que tiene activado la shell en ese momento. Estos son los flags más comunes:
Flag | Significado |
---|---|
i | Shell interactiva |
h | Activación del historial (history ) |
B | Activación de brace expansion ({a,b} ) |
H | Activación del historial con ! |
m | Job control habilitado (fg , bg ) |
s | Shell ejecutada desde stdin |
t | Shell ejecuta un solo comando y termina |
x | Modo debug: muestra comandos ejecutados |
v | Modo verbose: muestra líneas leídas |
c | Shell ejecutando un comando con -c |
⚠️ No todos los flags aparecen siempre. Solo los que están activos en ese momento.
🧪 Ejemplo práctico
Si ejecutas:
echo $-
Podrías ver algo como:
himBH
→ Shell interactiva con historial, job control, brace expansion, etc.hB
→ Shell no interactiva, pero con historial y brace expansion.s
→ Shell ejecutada desdestdin
, como cuando se hacebash < script.sh
.
🧭 ¿Qué es una shell interactiva?
Una shell es interactiva cuando:
- Está conectada a un terminal.
- Espera que el usuario escriba comandos.
- Muestra un prompt (
$
,#
, etc.). - Permite usar funciones como
read
,alias
,history
,fg
,bg
, autocompletado, etc.
Ejemplos:
- Abrir una terminal y escribir comandos.
- Usar
bash
directamente desde consola.
🧱 ¿Y una shell no interactiva?
Una shell es no interactiva cuando:
- Se ejecuta como parte de un script.
- No espera entrada del usuario.
- No muestra prompt.
- No necesita funciones como
alias
,read
, ni historial.
Ejemplos:
- Ejecutar
bash script.sh
. - Usar
#!/bin/bash
en la primera línea de un script.
🎯 ¿Por qué importa esto?
Porque muchos archivos como .bashrc
están diseñados solo para shells interactivas. Si se ejecutan en una shell no interactiva, pueden causar errores o ralentizar el script innecesariamente. Por eso se usa el truco:
case $- in
*i*) ;; # Si es interactiva, continúa
*) return ;; # Si no lo es, sal del script
esac
Shell Interactivo vs. Shell No Interactivo
Shell Interactivo
- Definición: Un shell interactivo es aquel en el que un usuario está directamente ingresando comandos y esperando respuestas. Se inicia cuando abres una terminal y comienza una sesión en la que puedes escribir y ejecutar comandos manualmente.
- Características: Permite la entrada de comandos del usuario, muestra resultados y generalmente incluye un prompt (como
$
o#
).
Shell No Interactivo
- Definición: Un shell no interactivo se utiliza normalmente para ejecutar scripts o comandos automatizados sin intervención directa del usuario. No espera a que el usuario ingrese comandos manualmente.
- Características: Ejecuta un script o un conjunto de comandos y luego termina sin necesidad de entrada del usuario.
Estructura de Control case
La estructura de control case
en Bash es similar a switch
en otros lenguajes de programación. Permite la ejecución de diferentes bloques de código según el valor de una variable.
Ejemplo y Explicación
case $- in
*i*) ;;
*) return;;
esac
$-
: Es una variable especial que contiene las opciones actuales del shell. Si el shell es interactivo, esta variable incluirá la letrai
.*i*
: Es un patrón de búsqueda que significa «cualquier cosa que contengai
«. Específicamente, busca sii
está presente en las opciones del shell.;;
: Finaliza una opción encase
.*) return;;
:*)
significa «cualquier cosa que no coincida con los patrones anteriores». Si$-
no contienei
, ejecutareturn
, lo que causa que el script termine inmediatamente.
¿Cómo Verifica si el Shell es Interactivo?
El bloque case
está verificando si la opción i
está presente en la variable $-
. Si i
está presente, el shell es interactivo y no hace nada (;;
). Si i
no está presente, significa que el shell no es interactivo y el script debe terminar (return
).
Resumen
- Shell Interactivo: Ingresas comandos manualmente.
- Shell No Interactivo: Ejecuta scripts sin intervención manual.
- Estructura
case
:- Verifica si el shell es interactivo buscando
i
en$-
. - Si es interactivo, no hace nada.
- Si no es interactivo, termina el script.
- Verifica si el shell es interactivo buscando
$ echo $-
himBHs
La variable especial $-
contiene un conjunto de indicadores que describen el estado del shell y las opciones que están habilitadas. Cada letra en la cadena tiene un significado específico:
- h: Habilita el historial (history).
- i: Indica que el shell es interactivo.
- m: Habilita el monitoreo de tareas (job control).
- B: Permite el uso de brace expansion.
- H: Habilita la búsqueda en el historial (history expansion).
- s: Indica que el shell está leyendo comandos de un script (cuando se usa con
-s
).
Cuando $-
No Contendría i
Para que la variable $-
no contenga la letra i
, el shell debe ser no interactivo. Esto ocurre típicamente cuando se ejecutan scripts en lugar de ingresar comandos directamente en una terminal. Aquí hay algunos ejemplos de situaciones en las que $-
no contendría i
:
- Ejecución de Scripts: Si ejecutas un script Bash, el shell que se inicia para ejecutar ese script es no interactivo.
./mi_script.sh
2. Comandos Pasados Directamente al Shell: Si ejecutas un comando directamente en el shell sin iniciar una sesión interactiva.
bash -c 'echo $-'
Cuando inicias un terminal en un sistema basado en Unix/Linux, generalmente estás utilizando Bash sin opciones explícitas. Esto significa que Bash está funcionando con sus configuraciones predeterminadas. Vamos a desglosar lo que esto significa y cómo funciona:
Bash sin Opciones Explícitas
Shell Interactivo por Defecto
Al abrir una terminal y escribir comandos directamente, estás utilizando un shell interactivo. Aquí están algunos aspectos clave de este modo:
- Lectura de Archivos de Inicio:
~/.bashrc
: Si es un shell interactivo no de login (como una terminal gráfica), Bash leerá este archivo para cargar configuraciones y funciones definidas por el usuario./etc/bash.bashrc
: Este archivo global también puede ser leído, dependiendo de la configuración de tu sistema.~/.bash_profile
,~/.bash_login
,~/.profile
: Si es un shell de login (cuando inicias sesión en modo texto, por ejemplo), estos archivos se leen en lugar de~/.bashrc
.
- Comportamiento Predeterminado:
- Historial de comandos: Se almacena en
~/.bash_history
. - Variables de entorno: Se cargan desde los archivos mencionados anteriormente.
- Alias y funciones: Definidos en los archivos de configuración del usuario.
- Historial de comandos: Se almacena en
Opciones y Parámetros de Bash
Cuando inicias un shell interactivo sin opciones específicas, Bash asume sus configuraciones predeterminadas:
- Interactividad: El shell espera y procesa comandos del usuario.
- Historial: Registra los comandos en el archivo de historial.
- Prompt: Muestra un prompt (como
$
) esperando la entrada del usuario.
Comando bash
sin Opciones
Cuando ejecutas el comando bash
sin ningún parámetro, simplemente inicias una nueva instancia de Bash con sus configuraciones predeterminadas. Ejemplo:
bash
Esto iniciará un nuevo shell interactivo. Puedes verificar esto escribiendo exit
para salir del nuevo shell y regresar al shell original.
Parámetros y Opciones de Bash
Además de -c
, aquí hay un resumen de algunas otras opciones útiles de Bash:
Opción | Descripción |
---|---|
-l | Inicia un shell de login |
-i | Inicia un shell interactivo |
-s | Lee comandos desde la entrada estándar |
--version | Muestra la versión de Bash |
--help | Muestra una ayuda corta con las opciones disponibles |
-n | Revisa la sintaxis del script sin ejecutarlo |
-v | Muestra cada línea del script mientras se lee |
-x | Muestra cada comando y sus argumentos mientras se ejecutan |
Resumen
- Shell Interactivo: Por defecto, al abrir una terminal, usas Bash sin opciones explícitas.
- Archivos de Inicio: Bash lee archivos como
~/.bashrc
y~/.bash_profile
para cargar configuraciones. - Configuraciones Predeterminadas: Incluyen el manejo del historial, variables de entorno, alias, y prompt.
- Iniciar Bash sin Opciones: Simplemente ejecuta
bash
para iniciar una nueva instancia del shell con configuraciones predeterminadas.
Estas configuraciones aseguran que tengas una experiencia de usuario coherente y predecible al trabajar en la línea de comandos de Bash.
Configuración del historial
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
HISTCONTROL=ignoreboth
: No guarda líneas duplicadas o que comiencen con espacio en el historial.
shopt -s histappend
: Añade al archivo de historial en lugar de sobrescribirlo.
HISTSIZE=1000
y HISTFILESIZE=2000
: Establecen el tamaño del historial en 1000 comandos y el archivo de historial en 2000 líneas.
Vamos a profundizar en la configuración del historial en Bash, específicamente la variable HISTCONTROL
y cómo afecta al historial de comandos.
HISTCONTROL
y sus Valores
La variable HISTCONTROL
controla cómo se manejan ciertos tipos de comandos en el historial. Vamos a desglosar sus valores y efectos.
ignoreboth
HISTCONTROL=ignoreboth
- Efecto: Equivale a combinar
ignoredups
yignorespace
.ignoredups
: Evita guardar líneas duplicadas consecutivas en el historial.ignorespace
: No guarda en el historial las líneas que comienzan con un espacio.
- Resultado: Con
ignoreboth
, el historial no guardará comandos duplicados consecutivos ni comandos que comiencen con un espacio.
Otros Valores de HISTCONTROL
- ignoredups
HISTCONTROL=ignoredups
2. ignorespace
HISTCONTROL=ignorespace
3. ignoreboth
HISTCONTROL=ignoreboth
4. erasedups
HISTCONTROL=erasedups
Efecto: Si ingresas un comando que ya existe en el historial, elimina la entrada anterior y guarda el comando en la posición más reciente.
Resultado: Solo la última instancia de un comando estará en el historial, eliminando cualquier duplicado anterior.
Ejemplos Prácticos
Usando ignoredups
HISTCONTROL=ignoredups
echo "Hello"
echo "Hello"
history
- Historial: Solo aparecerá una línea con
echo "Hello"
.
Usando ignorespace
HISTCONTROL=ignorespace
echo "This will not be saved"
history
- Historial: La línea con
echo "This will not be saved"
no se guarda porque comienza con un espacio.
Usando ignoreboth
HISTCONTROL=ignoreboth
echo "Not saved"
echo "Saved"
echo "Saved"
history
- Historial:
echo "Not saved"
no se guarda y solo una instancia deecho "Saved"
aparece en el historial.
Usando erasedups
HISTCONTROL=erasedups
echo "Repeat"
echo "Repeat"
history
- Historial: Solo la última línea de
echo "Repeat"
se guarda en el historial.
Resumen
ignoredups
: Evita duplicados consecutivos.ignorespace
: Ignora líneas que comienzan con un espacio.ignoreboth
: Combinaignoredups
yignorespace
.erasedups
: Elimina duplicados anteriores y mantiene solo la última instancia.
El archivo de historial, generalmente llamado .bash_history
, contiene los comandos ejecutados en la terminal y es controlado por estas configuraciones. Modificando HISTCONTROL
, puedes personalizar cómo se maneja tu historial de comandos para mejorar tu experiencia en la línea de comandos.
El comportamiento del historial en Bash es controlado internamente por el propio shell. Bash está diseñado para observar el valor de la variable HISTCONTROL
y ajustar su comportamiento en consecuencia. Cuando cambias el valor de HISTCONTROL
, le estás dando instrucciones al shell sobre cómo debe manejar ciertos tipos de entradas de comando en el historial.
Mecanismo Interno
- Monitoreo del Historial:
- Bash tiene un mecanismo interno que monitorea cada comando ingresado por el usuario. Después de la ejecución de cada comando, este mecanismo determina si el comando debe ser guardado en el historial.
- Revisión del Valor de
HISTCONTROL
:- Inmediatamente después de la ejecución de un comando, Bash revisa el valor de
HISTCONTROL
para decidir si debe guardar o no el comando en el historial. Dependiendo de los valores asignados aHISTCONTROL
(ignoredups
,ignorespace
, etc.), el shell aplica las reglas pertinentes.
- Inmediatamente después de la ejecución de un comando, Bash revisa el valor de
- Aplicación de las Reglas de
HISTCONTROL
:ignoredups
: Si esta opción está activa, Bash verifica si el comando ingresado es idéntico al último comando guardado en el historial. Si es así, no guarda el comando duplicado.ignorespace
: Si esta opción está activa, Bash revisa si el comando ingresado comienza con un espacio. Si es así, omite guardar el comando en el historial.ignoreboth
: Combina las reglas deignoredups
yignorespace
.erasedups
: Si esta opción está activa, Bash busca el comando ingresado en el historial. Si ya existe, elimina la entrada anterior y guarda el comando como la entrada más reciente.
- Guardado en el Archivo de Historial:
- Una vez que Bash ha decidido si debe guardar o no un comando basado en
HISTCONTROL
, actualiza el archivo de historial (.bash_history
), si corresponde, aplicando las reglas configuradas.
- Una vez que Bash ha decidido si debe guardar o no un comando basado en
Ejemplo de Funcionamiento Interno
Imaginemos que tienes la siguiente configuración en tu .bashrc
:
HISTCONTROL=ignoreboth
- Ingresas un Comando:
ls -l
- Bash Revisa
HISTCONTROL
:- Verifica
ignoreboth
y determina que no debe guardar comandos duplicados consecutivos ni comandos que comiencen con espacio.
- Verifica
- Aplicación de Reglas:
- No duplicados: Si el comando
ls -l
fue el último comando ingresado, no lo guarda de nuevo. - No espacio: Si el comando no comienza con un espacio, puede ser guardado (si no es duplicado).
- No duplicados: Si el comando
- Guardar en el Historial:
- Si pasa las verificaciones anteriores,
ls -l
se guarda en el archivo.bash_history
.
- Si pasa las verificaciones anteriores,
Resumen
- Bash monitorea cada comando y revisa
HISTCONTROL
después de la ejecución de cada comando. - Reglas de
HISTCONTROL
:ignoredups
,ignorespace
,ignoreboth
, yerasedups
dictan cómo se maneja el historial. - Proceso de verificación: Bash aplica las reglas configuradas antes de guardar el comando en el historial.
Así, cambiando el valor de HISTCONTROL
, le dices a Bash cómo quieres que maneje el historial, aplicando estas reglas cada vez que ingresas un comando.
Comando shopt
en Bash
El comando shopt
en Bash se utiliza para habilitar o deshabilitar varias opciones del shell. Este comando permite ajustar el comportamiento de Bash a través de diferentes opciones. Aquí tienes una explicación más detallada sobre cómo funciona y qué opciones puedes configurar.
Sintaxis Básica de shopt
- Habilitar una opción:
shopt -s opción
El parámetro -s
habilita la opción especificada.
- Deshabilitar una opción:
shopt -u opción
- El parámetro
-u
deshabilita la opción especificada.
Opción histappend
shopt -s histappend
- Función: Cuando habilitas
histappend
conshopt -s histappend
, le indicas a Bash que debe añadir (append) los nuevos comandos al archivo de historial (.bash_history
) en lugar de sobrescribirlo. - Uso:
shopt -s histappend
- Sin esta opción: Si
histappend
no está habilitado, cada vez que inicias una nueva sesión de shell, los comandos de la sesión anterior pueden ser sobrescritos en el archivo de historial.
Otras Opciones de shopt
shopt
tiene muchas opciones útiles que puedes habilitar o deshabilitar para personalizar el comportamiento de tu shell. Aquí tienes algunas opciones comunes y sus descripciones:
checkwinsize
:- Función: Ajusta automáticamente los valores de
LINES
yCOLUMNS
después de cada comando para reflejar el tamaño actual de la ventana del terminal. - Habilitar:
- Función: Ajusta automáticamente los valores de
shopt -s checkwinsize
2. dotglob
:
- Función: Incluye archivos y directorios que comienzan con un punto (
.
) en el proceso de globbing. - Habilitar:
shopt -s dotglob
3. extglob
:
- Función: Habilita globbing extendido, permitiendo patrones complejos en coincidencias de nombres de archivos.
- Habilitar:
shopt -s extglob
4. nullglob
:
- Función: Hace que los patrones de globbing que no coinciden con ningún archivo se expandan a una cadena vacía en lugar de ellos mismos.
- Habilitar:
shopt -s nullglob
5. nocaseglob
:
- Función: Hace que el globbing no distinga entre mayúsculas y minúsculas.
- Habilitar:
shopt -s nocaseglob
6. cdspell
:
- Función: Corrige errores tipográficos menores en los nombres de directorios en los comandos
cd
. - Habilitar:
shopt -s cdspell
7. globstar
:
- Función: Habilita la coincidencia del patrón
**
para que coincida con cualquier número de directorios y subdirectorios en una expansión de nombre de ruta. - Habilitar:
shopt -s globstar
Ejemplo Completo
Aquí hay un ejemplo de cómo puedes usar shopt
para habilitar varias opciones:
shopt -s histappend
shopt -s checkwinsize
shopt -s dotglob
shopt -s extglob
shopt -s nullglob
shopt -s nocaseglob
shopt -s cdspell
shopt -s globstar
Resumen
shopt -s
: Habilita una opción del shell.shopt -u
: Deshabilita una opción del shell.histappend
: Añade comandos al historial en lugar de sobrescribirlo.- Otras opciones útiles:
checkwinsize
,dotglob
,extglob
,nullglob
,nocaseglob
,cdspell
,globstar
.
Estas opciones permiten personalizar el comportamiento de Bash para adaptarse mejor a tus necesidades.
Las opciones que habilita el comando shopt
son configuraciones internas del shell Bash que controlan su comportamiento. No son scripts ni funciones independientes, sino que son características internas que Bash puede habilitar o deshabilitar según sea necesario. Aquí te explico cómo funcionan y dónde se encuentran:
Opciones Internas de Bash
- Configuraciones Internas: Las opciones que
shopt
habilita o deshabilita son configuraciones internas del intérprete de comandos Bash. Están codificadas dentro del propio código fuente de Bash. - Control del Comportamiento: Estas opciones permiten a los usuarios personalizar y ajustar el comportamiento del shell para satisfacer diferentes necesidades y preferencias. Cada opción de
shopt
se refiere a una funcionalidad específica que Bash puede manejar de manera diferente cuando está activada o desactivada.
Dónde se Configuran
- Código Fuente de Bash: Las definiciones de estas opciones están en el código fuente de Bash. Cuando instalas Bash, estas opciones ya están disponibles como parte del intérprete de comandos.
- Archivos de Configuración del Usuario: Los usuarios pueden habilitar o deshabilitar estas opciones en sus archivos de configuración, como
.bashrc
o.bash_profile
, utilizando el comandoshopt
.
Ejemplo de Configuración en .bashrc
# Habilitar histappend para añadir al historial en lugar de sobrescribir
shopt -s histappend
# Ajustar el tamaño de la ventana automáticamente
shopt -s checkwinsize
# Incluir archivos y directorios que comienzan con un punto en el globbing
shopt -s dotglob
# Habilitar globbing extendido
shopt -s extglob
# Hacer que los patrones de globbing que no coinciden se expandan a una cadena vacía
shopt -s nullglob
# Hacer que el globbing no distinga entre mayúsculas y minúsculas
shopt -s nocaseglob
# Corregir errores tipográficos menores en los nombres de directorios en los comandos cd
shopt -s cdspell
# Habilitar el globbing de doble asterisco (**)
shopt -s globstar
Consultar las Opciones Disponibles
Puedes listar todas las opciones disponibles de shopt
y ver su estado actual (habilitado o deshabilitado) utilizando el comando sin argumentos:
shopt
O para ver solo las opciones habilitadas:
shopt -s
Documentación
La documentación oficial de Bash, que viene con el paquete o se puede acceder en línea, describe todas estas opciones en detalle. Puedes consultar la página del manual (man bash
) para obtener información específica sobre cada opción de shopt
.
man bash
Busca la sección sobre shopt
y las opciones que se pueden configurar para obtener una descripción más técnica y detallada.
Resumen
- Opciones de
shopt
: Son configuraciones internas de Bash que controlan su comportamiento. - No son scripts ni funciones: Están codificadas en el propio Bash y se pueden habilitar o deshabilitar con
shopt
. - Configuración: Los usuarios configuran estas opciones en sus archivos de configuración como
.bashrc
. - Consulta de opciones: Usa
shopt
para listar y ver el estado de las opciones.
Estas opciones permiten personalizar y ajustar la experiencia del usuario en la línea de comandos de Bash.
Tamaño de la ventana y expansión de globos
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
shopt -s checkwinsize
: Ajusta el tamaño de la ventana después de cada comando.
#shopt -s globstar
: Si se activa (descomentando), permite el uso de **
para coincidir con directorios y subdirectorios.
Tamaño de la Ventana (checkwinsize
)
¿Qué significa el tamaño de la ventana?
El tamaño de la ventana se refiere a las dimensiones de tu terminal en términos de filas (líneas) y columnas (caracteres por línea). Cuando cambias el tamaño de tu ventana de terminal, el sistema necesita ajustar los valores de estas dimensiones para que los comandos y la salida se rendericen correctamente.
¿Por qué ajustar el tamaño de la ventana después de cada comando?
La opción checkwinsize
ajusta automáticamente las variables LINES
y COLUMNS
después de cada comando para reflejar el tamaño actual de la ventana del terminal. Esto es útil porque, sin esta opción, si cambias el tamaño de tu ventana (por ejemplo, al redimensionar la terminal), los valores de LINES
y COLUMNS
no se actualizan automáticamente, lo que puede causar problemas de visualización.
Activar checkwinsize
shopt -s checkwinsize
Con esta opción habilitada, Bash verificará el tamaño de la ventana después de cada comando y actualizará las variables LINES
y COLUMNS
en consecuencia.
Expansión de Globos (globstar
)
¿Qué es la expansión de globos?
La expansión de globos (globbing) en Bash se refiere al uso de caracteres comodín para coincidir con nombres de archivos y directorios. Los caracteres comodín más comunes son *
(que coincide con cero o más caracteres) y ?
(que coincide con un solo carácter).
¿Qué hace globstar
?
Cuando activas la opción globstar
, Bash permite el uso del patrón **
en una expansión de globos. Este patrón coincide recursivamente con todos los archivos y directorios en el árbol de directorios.
Ejemplo de Uso de globstar
- Sin
globstar
:
ls *
Esto listará todos los archivos y directorios en el directorio actual, pero no recursivamente.
2. Con globstar
:
shopt -s globstar
ls **
- Esto listará todos los archivos y directorios en el directorio actual y en todos los subdirectorios, recursivamente.
Activar globstar
shopt -s globstar
Ejemplo de Uso Práctico
Supongamos que tienes una estructura de directorios como esta:
/mi_directorio
/subdir1
archivo1.txt
/subdir2
archivo2.txt
Sin globstar
:
ls *
Esto listará solo los archivos y directorios en mi_directorio
, pero no entrará en subdir1
o subdir2
.
Con globstar
:
ls **
- Esto listará
archivo1.txt
yarchivo2.txt
también, porque está buscando recursivamente en todos los subdirectorios.
Resumen
checkwinsize
: Ajusta automáticamente los valores deLINES
yCOLUMNS
después de cada comando para reflejar el tamaño actual de la ventana del terminal.- Activar:
shopt -s checkwinsize
- Activar:
globstar
: Permite el uso del patrón**
en la expansión de globos para coincidir recursivamente con todos los archivos y directorios en el árbol de directorios.- Activar:
shopt -s globstar
- Activar:
Verificar si globstar
está activado actualmente en tu shell Bash. Puedes usar el comando shopt
para listar todas las opciones del shell y ver su estado actual. Aquí te muestro cómo hacerlo:
Verificar el Estado de globstar
Usando shopt
shopt globstar
Este comando mostrará si globstar
está habilitado (on
) o deshabilitado (off
).
Ejemplo de Salida
globstar on
o
globstar off
Esta salida te indicará si la opción globstar
está actualmente activada o no.
Verificar Todas las Opciones de shopt
Si deseas ver el estado de todas las opciones del shell, puedes usar shopt
sin argumentos:
shopt
Esto mostrará una lista completa de todas las opciones y sus estados (on/off).
Comprobación en un Script
Si estás escribiendo un script y necesitas comprobar si globstar
está habilitado, puedes hacerlo de la siguiente manera:
if shopt -q globstar; then
echo "globstar está habilitado"
else
echo "globstar no está habilitado"
fi
Resumen
- Para verificar una sola opción:
shopt globstar
- Para listar todas las opciones:
shopt
- Para usar en un script:
Estos métodos te permitirán verificar si globstar
(o cualquier otra opción de shopt
) está activado en tu shell Bash.
Te explico primero qué es la brace expansion, luego qué significa que esté activada, y después te doy ejemplos claros de shells con los flags s
, t
y c
, que son menos conocidos pero muy útiles para entender cómo Bash se comporta en distintos contextos.
🧩 ¿Qué es brace expansion?
La brace expansion (expansión de llaves) es una característica de Bash que permite generar múltiples cadenas a partir de una sola expresión con llaves {}
.
🔧 Ejemplos:
echo file{1,2,3}.txt
➡️ Resultado:
file1.txt file2.txt file3.txt
Otro ejemplo:
mkdir {enero,febrero,marzo}
➡️ Crea tres carpetas: enero
, febrero
, marzo
.
✅ ¿Qué significa que esté activada?
La expansión de llaves está activada por defecto en Bash. El flag B
en $-
indica que esta característica está disponible.
Si por alguna razón se desactiva (lo cual es raro), Bash no interpretaría las llaves como expansión, sino como texto literal.
🧪 Ejemplos de shells con flags s
, t
y c
Ahora vamos con los tres flags que mencionas. Estos no se activan manualmente, sino que aparecen en $-
dependiendo de cómo se invoca la shell.
🔹 Flag s
→ Shell desde stdin
Esto ocurre cuando Bash se ejecuta leyendo desde la entrada estándar, por ejemplo:
bash < script.sh
Aquí no se pasa el script como argumento, sino que se redirige su contenido. Bash lo interpreta como entrada estándar (stdin
), y el flag s
aparece en $-
.
🔹 Flag t
→ Shell que ejecuta un solo comando
Esto sucede cuando se usa Bash para ejecutar una sola instrucción y luego salir. Ejemplo:
bash -t <<< 'echo Hola'
O más comúnmente:
bash -c 'echo Hola'
Aunque el flag t
es más técnico y menos usado directamente, puede aparecer en shells que ejecutan comandos temporales o desde ciertos entornos automatizados.
🔹 Flag c
→ Shell con comando vía -c
Este es más claro. Se activa cuando usas Bash con la opción -c
para ejecutar un comando directamente:
bash -c 'echo Hola David'
Aquí Bash no carga ningún archivo de configuración como .bashrc
, y ejecuta solo lo que se le pasa con -c
. En este caso, el flag c
aparece en $-
.
🧠 ¿Se pueden usar sin estar en $-
?
Los flags no se usan directamente como opciones. $-
simplemente refleja el estado actual de la shell. Tú no activas el flag i
o c
manualmente, sino que Bash lo incluye en $-
dependiendo de cómo se ha iniciado la shell.
¡Perfecto, David! Vamos a seguir desgranando este fragmento del .bashrc
con lupa, y te explico también el comando eval
, que suele generar confusión pero tiene un papel muy interesante en Bash.
🧩 shopt -s globstar
Este comando (comentado en tu archivo) activa la opción globstar
, que mejora la expansión de rutas con comodines.
- Cuando está activado, puedes usar
**
para que coincida con todos los archivos y subdirectorios recursivamente.
🔍 Ejemplo:
shopt -s globstar
ls **/*.txt
➡️ Buscaría todos los archivos .txt
en el directorio actual y en todos los subdirectorios, sin importar la profundidad.
🧠 ¿Qué hace eval
?
eval
es un comando interno de Bash que evalúa y ejecuta una cadena como si fuera un comando de shell.
- Sintaxis:
eval "comando_en_forma_de_texto"
- ¿Para qué sirve?
- Cuando tienes una cadena que contiene comandos,
eval
la interpreta y la ejecuta. - Es útil cuando el comando se genera dinámicamente o proviene de otra fuente.
- Cuando tienes una cadena que contiene comandos,
🔍 Ejemplo simple:
cmd="ls -l"
eval $cmd
➡️ Ejecuta ls -l
como si lo hubieras escrito directamente.
📦 [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
Este fragmento mejora el comportamiento del comando less
para archivos no puramente de texto (como .tar
, .zip
, etc.).
[ -x /usr/bin/lesspipe ]
: comprueba si el scriptlesspipe
existe y es ejecutable.eval "$(SHELL=/bin/sh lesspipe)"
: ejecuta el scriptlesspipe
en una subshell con/bin/sh
, y luego evalúa su salida como comandos Bash.
🧠 ¿Por qué usar eval
aquí?
- Porque
lesspipe
devuelve una serie de configuraciones que deben ser interpretadas como comandos. eval
permite que esas configuraciones se apliquen correctamente en el entorno actual.
🏗️ debian_chroot
y entorno chroot
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
Este bloque detecta si estás trabajando dentro de un entorno chroot (una especie de jaula virtual para aislar procesos).
-z "${debian_chroot:-}"
: comprueba si la variable está vacía.-r /etc/debian_chroot
: verifica si el archivo existe y es legible.- Si ambas condiciones se cumplen, se asigna el contenido del archivo a la variable
debian_chroot
.
🧭 ¿Para qué sirve?
- Esta variable se usa más adelante para modificar el prompt, indicando que estás dentro de un entorno chroot.
🎨 Prompt con color
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
Este bloque detecta si el terminal soporta colores:
- Si el tipo de terminal (
$TERM
) esxterm-color
o termina en-256color
, se activacolor_prompt=yes
.
🎛️ force_color_prompt=yes
Este ajuste fuerza el uso de colores en el prompt, aunque el terminal no lo detecte automáticamente.
- Está comentado por defecto para no distraer al usuario.
- Si lo descomentas, el prompt se verá más vistoso, pero puede no funcionar bien en terminales sin soporte de color.
Muy bien, David. Vamos a aclarar todas esas piezas, porque aunque están relacionadas, cada una tiene su matiz. Empecemos por lo que parece más confuso: la diferencia entre eval
y $(...)
.
🧠 ¿Es eval
lo mismo que $(...)
?
No, no son lo mismo, aunque a veces se usan juntos. Aquí va la diferencia clave:
Expresión | ¿Qué hace? |
---|---|
$(...) | Ejecuta un comando y devuelve su salida como texto |
eval | Ejecuta una cadena como si fuera un comando de Bash |
🔍 Ejemplo comparativo:
# Esto ejecuta el comando y devuelve su salida
fecha=$(date)
echo $fecha
➡️ Muestra algo como: Fri 29 Aug 2025 12:21:00 CEST
# Esto ejecuta la cadena como si fuera un comando
cmd="ls -l"
eval $cmd
➡️ Ejecuta ls -l
como si lo hubieras escrito directamente.
🧪 ¿Y qué pasa con esto?
eval "$(SHELL=/bin/sh lesspipe)"
Aquí se combinan ambos:
$(...)
ejecuta el comandolesspipe
con la variableSHELL
definida temporalmente.- La salida de ese comando (que probablemente sea una serie de configuraciones) se pasa a
eval
, que la interpreta como comandos Bash.
🏗️ ¿Qué es un entorno chroot
?
chroot
significa «change root», y es una técnica en sistemas Unix/Linux para aislar un entorno dentro del sistema de archivos.
- Se crea una especie de jaula virtual donde el sistema operativo cree que
/
empieza en otro directorio. - Muy útil para pruebas, recuperación de sistemas, o entornos de desarrollo seguros.
🔧 Ejemplo:
sudo chroot /mnt/sistema_rescate
➡️ A partir de ahí, todos los comandos se ejecutan como si /mnt/sistema_rescate
fuera el sistema raíz.
📦 ¿Qué contiene debian_chroot
?
La variable debian_chroot
suele contener una etiqueta o nombre identificativo del entorno chroot en el que estás trabajando.
- Por ejemplo:
"rescate"
,"dev"
,"sandbox"
… - Se usa para mostrar en el prompt que estás dentro de ese entorno, como medida de seguridad o claridad.
📁 ¿Qué hace /etc/debian_chroot
?
Este archivo, si existe, contiene el nombre del entorno chroot. El .bashrc
lo lee así:
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
-z "${debian_chroot:-}"
: comprueba si la variable está vacía.:-
es un operador de expansión por defecto en Bash.
🔍 ¿Qué significa ${debian_chroot:-}
?
Esto es una forma de expansión de parámetros en Bash. El operador :-
significa:
“Si la variable está vacía o no está definida, usa un valor por defecto.”
En este caso:
${debian_chroot:-}
➡️ No se da ningún valor por defecto, pero se usa para evitar errores si la variable no está definida.
🔧 Ejemplo con valor por defecto:
echo ${nombre:-"Invitado"}
➡️ Si nombre
no está definida, imprime "Invitado"
.
Perfecto, David. Vamos a meternos de lleno en el fascinante mundo de los operadores de expansión de parámetros en Bash, que son una joya para escribir scripts más inteligentes, seguros y flexibles.
🧩 ¿Qué es un operador de expansión?
En Bash, la expansión de parámetros permite manipular el contenido de variables directamente en línea, sin necesidad de estructuras condicionales o funciones adicionales.
Se usa con la sintaxis ${variable}
y se puede extender con operadores como :-
, :+
, :?
, etc., para controlar qué pasa si la variable está vacía, no definida, o si quieres modificar su contenido.
🛠️ Tabla de operadores de expansión en Bash
Aquí tienes una tabla con los operadores más útiles, sus funciones y ejemplos:
Operador | Función | Ejemplo | Resultado |
---|---|---|---|
${var} | Expande el valor de var | echo ${USER} | david (por ejemplo) |
${var:-default} | Usa default si var está vacía o no definida | echo ${nombre:-"Invitado"} | Invitado si nombre no está definida |
${var:=default} | Asigna default a var si está vacía o no definida | echo ${nombre:=Juan} | Asigna Juan si nombre no existe |
${var:+alt} | Usa alt solo si var está definida y no vacía | echo ${nombre:+Presente} | Presente si nombre tiene valor |
${var:?mensaje} | Muestra error si var está vacía o no definida | echo ${nombre:?"Falta nombre"} | Error: Falta nombre |
${#var} | Longitud del valor de var | echo ${#nombre} | 4 si nombre=Juan |
${var:pos} | Extrae desde posición pos | echo ${nombre:1} | uan si nombre=Juan |
${var:pos:len} | Extrae len caracteres desde pos | echo ${nombre:1:2} | ua |
${var/pat/repl} | Sustituye primera coincidencia de pat por repl | echo ${texto/foo/bar} | bar.txt si texto=foo.txt |
${var//pat/repl} | Sustituye todas las coincidencias | echo ${texto//o/a} | faa.txt |
${var/#pat/repl} | Sustituye si pat está al inicio | echo ${texto/#foo/bar} | bar.txt |
${var/%pat/repl} | Sustituye si pat está al final | echo ${texto/%txt/dat} | foo.dat |
${var^} | Convierte primera letra a mayúscula | echo ${nombre^} | Juan |
${var^^} | Convierte todo a mayúsculas | echo ${nombre^^} | JUAN |
${var,} | Convierte primera letra a minúscula | echo ${nombre,} | juan |
${var,,} | Convierte todo a minúsculas | echo ${nombre,,} | juan |
🧠 ¿Por qué son útiles?
- Evitan errores por variables no definidas.
- Simplifican scripts al no requerir estructuras
if
. - Permiten manipular texto directamente.
- Mejoran la legibilidad y la robustez del código.
🧪 Bonus: Combinaciones inteligentes
# Asignar valor si no existe y mostrarlo
echo "Hola, ${nombre:=David}"
# Mostrar error si falta variable crítica
echo "Usuario: ${USER:?"No se ha definido el usuario"}"
# Formatear nombre
nombre="david"
echo "Bienvenido, ${nombre^}" # → David
Muy buena observación, David. La variable $TERM
es una pieza clave en el entorno de Bash y otras shells, y tiene implicaciones tanto funcionales como estratégicas, especialmente en contextos como el hacking o la administración remota. Vamos a desmenuzarla en profundidad.
🧠 ¿Qué es $TERM
?
$TERM
es una variable de entorno que indica el tipo de terminal que estás usando. Le dice a las aplicaciones cómo deben comportarse para mostrar correctamente texto, colores, cursor, etc.
Es como decirle al sistema: “Estoy usando este tipo de pantalla, así que adapta la salida a ella”.
🎯 ¿Para qué se utiliza?
- Para que programas como
vim
,less
,top
,htop
,tmux
, etc., sepan cómo dibujar en pantalla. - Para habilitar o deshabilitar colores, movimiento del cursor, borrado de líneas, etc.
- Para que el sistema interprete correctamente las secuencias de escape ANSI (las que controlan el formato del texto).
🧪 Ejemplos de valores comunes de $TERM
Valor de $TERM | ¿Qué representa? | ¿Soporta color? |
---|---|---|
xterm | Terminal tipo X11 | ✅ Sí |
xterm-color | Xterm con soporte básico de color | ✅ Sí |
xterm-256color | Xterm con 256 colores | ✅ Sí |
linux | Consola virtual de Linux | ✅ Sí |
vt100 | Terminal antiguo tipo VT100 | ❌ No |
screen | Terminal dentro de screen | ✅ Sí |
tmux | Terminal dentro de tmux | ✅ Sí |
dumb | Terminal sin capacidades especiales | ❌ No |
🕵️♂️ ¿Por qué lo usa Savitar (o cualquier pentester)?
Cuando un hacker consigue acceso a una máquina remota (por ejemplo, mediante una shell reversa o una terminal limitada), el entorno puede ser rudimentario o incompleto. En ese caso:
$TERM
puede estar mal configurado o no definido.- Esto impide usar herramientas como
vim
,less
,nano
, o incluso ver colores correctamente. - El hacker puede exportar
$TERM
manualmente para mejorar la experiencia:
export TERM=xterm-256color
➡️ Esto le permite usar editores, ver colores, y ejecutar comandos con mejor salida visual.
🧪 Ejemplo práctico
Supón que Savitar obtiene una shell básica en una máquina remota y ejecuta:
echo $TERM
Si la salida es dumb
o está vacía, sabrá que el entorno es limitado. Entonces puede hacer:
export TERM=xterm
Y de repente, comandos como top
, htop
, vim
, o incluso ls --color
empiezan a funcionar correctamente.
🧱 ¿Cómo se establece $TERM
?
- Lo define el emulador de terminal (como GNOME Terminal, Konsole, PuTTY, etc.).
- También puede venir heredado por SSH,
screen
,tmux
, o incluso por scripts de login.
🧭 ¿Cómo afecta al .bashrc
?
Como vimos antes, el .bashrc
puede usar $TERM
para decidir si activar colores en el prompt:
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
¡Perfecto, David! Aquí tienes una sección extensa y bien estructurada sobre las variables de entorno críticas en Bash, ideal para incluir en tu web o como referencia para pentesting, administración de sistemas, scripting avanzado o simplemente para entender mejor cómo funciona el entorno de una shell.
🧬 Variables de Entorno Críticas en Bash
Las variables de entorno en Bash son fundamentales para definir el comportamiento del sistema, la shell, los programas y el entorno del usuario. Algunas son esenciales para el funcionamiento básico, otras son útiles para personalización, y muchas son clave en contextos de hacking y automatización.
🧭 1. $PATH
– El Camino hacia los Ejecutables
¿Qué es?
Define los directorios donde Bash busca los comandos ejecutables.
Ejemplo:
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Usos:
- Permite ejecutar comandos sin especificar su ruta completa.
- En hacking, modificar
$PATH
puede permitir ejecutar binarios maliciosos antes que los legítimos.
Ejemplo de ataque:
export PATH=/tmp/malware:$PATH
👤 2. $USER
– Nombre del Usuario Actual
¿Qué es?
Contiene el nombre del usuario que ha iniciado sesión.
Ejemplo:
echo $USER
# david
Usos:
- Scripts que se adaptan al usuario.
- Verificación de privilegios (
if [ "$USER" = "root" ]
).
🏠 3. $HOME
– Directorio Personal
¿Qué es?
Ruta al directorio home del usuario.
Ejemplo:
echo $HOME
# /home/david
Usos:
- Scripts que guardan archivos en el entorno del usuario.
- Configuración de herramientas como
ssh
,git
, etc.
🐚 4. $SHELL
– Shell Predeterminada
¿Qué es?
Indica qué shell está usando el usuario (bash, zsh, sh, etc.).
Ejemplo:
echo $SHELL
# /bin/bash
Usos:
- Scripts que se adaptan al tipo de shell.
- En pentesting, saber si estás en una shell limitada (
sh
) o interactiva (bash
).
🎨 5. $TERM
– Tipo de Terminal
¿Qué es?
Define el tipo de terminal que se está usando.
Ejemplo:
echo $TERM
# xterm-256color
Usos:
- Activar colores, cursor, y formato en la salida.
- En hacking, mejorar shells limitadas exportando
$TERM
.
Ejemplo:
export TERM=xterm
📂 6. $PWD
– Directorio Actual
¿Qué es?
Contiene la ruta del directorio actual.
Ejemplo:
echo $PWD
# /home/david/scripts
Usos:
- Scripts que operan en el directorio actual.
- Navegación y control de contexto.
📁 7. $OLDPWD
– Directorio Anterior
¿Qué es?
Ruta del último directorio antes del cambio con cd
.
Ejemplo:
cd /etc
echo $OLDPWD
# /home/david/scripts
Usos:
- Volver rápidamente con
cd -
.
🧪 8. $?
– Código de Salida del Último Comando
¿Qué es?
Contiene el código de salida del último comando ejecutado.
Ejemplo:
ls /noexiste
echo $?
# 2
Usos:
- Control de flujo en scripts (
if [ $? -eq 0 ]
). - Detección de errores.
🧵 9. $PS1
– Prompt Principal
¿Qué es?
Define cómo se ve el prompt de Bash.
Ejemplo:
echo $PS1
# \u@\h:\w\$
Usos:
- Personalización del entorno.
- En pentesting, puede revelar si estás en una shell limitada.
📜 10. $IFS
– Internal Field Separator
¿Qué es?
Define el separador de campos usado por Bash (por defecto, espacio, tabulación y salto de línea).
Ejemplo:
echo $IFS | cat -v
# ^I (tabulación)
Usos:
- Manipulación de texto en scripts.
- Técnicas de evasión en parsing de comandos.
🧨 11. $RANDOM
– Número Aleatorio
¿Qué es?
Genera un número aleatorio entre 0 y 32767.
Ejemplo:
echo $RANDOM
# 18342
Usos:
- Scripts que requieren aleatoriedad.
- Generación de nombres temporales o contraseñas.
🧭 12. $UID
– ID Numérico del Usuario
¿Qué es?
Número que identifica al usuario (0 para root).
Ejemplo:
echo $UID
# 1000
Usos:
- Verificación de privilegios.
- Scripts que requieren ejecución como root.
🧰 13. $BASH_VERSION
– Versión de Bash
¿Qué es?
Muestra la versión actual de Bash.
Ejemplo:
echo $BASH_VERSION
# 5.1.8(1)-release
Usos:
- Compatibilidad en scripts.
- Detección de entornos vulnerables.
🧩 14. $0
, $1
, $2
, … – Argumentos Posicionales
¿Qué es?
Variables que representan los argumentos pasados a un script.
Ejemplo:
./script.sh archivo.txt
echo $1
# archivo.txt
Usos:
- Procesamiento de argumentos.
- Automatización flexible.
🧼 15. $ENV
– Archivo de Configuración de Entorno
¿Qué es?
Define qué archivo se carga al iniciar una shell no interactiva.
Usos:
- Personalización avanzada.
- En hacking, puede usarse para persistencia si se modifica maliciosamente.
🧠 Bonus: Variables de Entorno en Pentesting
En contextos de hacking, estas variables pueden revelar información sensible, permitir persistencia, evasión o mejorar el entorno de trabajo:
$PATH
: para inyectar binarios maliciosos.$TERM
: para mejorar shells reversas.$PS1
: para detectar si estás en una shell limitada.$UID
: para saber si tienes privilegios de root.$HOME
: para encontrar archivos de configuración (.bashrc
,.ssh
, etc.).
¡Vamos allá, David! Aquí tienes una sección extensa, clara y bien estructurada sobre las variables de entorno críticas en Bash, ideal para tu web o como referencia para scripting, administración de sistemas, pentesting o formación técnica.
🧬 Variables de Entorno Críticas en Bash
Las variables de entorno en Bash definen el comportamiento del sistema, el entorno del usuario y el funcionamiento de la shell. Algunas son esenciales para que el sistema opere correctamente, otras permiten personalización, y muchas son clave en contextos como automatización, depuración o hacking.
🧭 1. $PATH
– Rutas de búsqueda de comandos
- Función: Define los directorios donde Bash busca ejecutables.
- Ejemplo:
echo $PATH # /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
- Usos:
- Ejecutar comandos sin ruta completa.
- En pentesting, modificar
$PATH
para priorizar binarios maliciosos.
👤 2. $USER
– Usuario actual
- Función: Nombre del usuario que ha iniciado sesión.
- Ejemplo:
echo $USER # david
- Usos:
- Scripts personalizados por usuario.
- Verificación de privilegios (
if [ "$USER" = "root" ]
).
🏠 3. $HOME
– Directorio personal
- Función: Ruta al directorio home del usuario.
- Ejemplo:
echo $HOME # /home/david
- Usos:
- Guardar archivos de configuración.
- Acceder a
.bashrc
,.ssh
,.profile
, etc.
🐚 4. $SHELL
– Shell predeterminada
- Función: Ruta al ejecutable de la shell usada.
- Ejemplo:
echo $SHELL # /bin/bash
- Usos:
- Scripts adaptados a Bash, Zsh, etc.
- Detección de entornos limitados en hacking.
🎨 5. $TERM
– Tipo de terminal
- Función: Define las capacidades del terminal (colores, cursor, etc.).
- Ejemplo:
echo $TERM # xterm-256color
- Usos:
- Activar colores en el prompt.
- Mejorar shells reversas en pentesting (
export TERM=xterm
).
📂 6. $PWD
– Directorio actual
- Función: Ruta del directorio donde estás ubicado.
- Ejemplo:
echo $PWD # /home/david/scripts
- Usos:
- Scripts que operan en el contexto actual.
- Navegación dinámica.
📁 7. $OLDPWD
– Directorio anterior
- Función: Ruta del directorio anterior al último
cd
. - Ejemplo:
cd /etc echo $OLDPWD # /home/david/scripts
- Usos:
- Volver rápidamente con
cd -
.
- Volver rápidamente con
🧪 8. $?
– Código de salida del último comando
- Función: Indica si el último comando fue exitoso (
0
) o falló. - Ejemplo:
ls /noexiste echo $? # 2
- Usos:
- Control de flujo en scripts.
- Detección de errores.
🧵 9. $PS1
– Prompt principal
- Función: Define cómo se ve el prompt de Bash.
- Ejemplo:
echo $PS1 # \u@\h:\w\$
- Usos:
- Personalización visual.
- Detección de shells limitadas en hacking.
🧼 10. $IFS
– Separador interno de campos
- Función: Define cómo Bash separa palabras (por defecto: espacio, tabulación, salto de línea).
- Ejemplo:
echo $IFS | cat -v # ^I (tabulación)
- Usos:
- Manipulación de texto.
- Parsing de comandos.
🎲 11. $RANDOM
– Número aleatorio
- Función: Genera un número entre 0 y 32767.
- Ejemplo:
echo $RANDOM # 18342
- Usos:
- Generación de nombres únicos.
- Simulación y pruebas.
🧭 12. $UID
– ID numérico del usuario
- Función: Identificador numérico del usuario (0 para root).
- Ejemplo:
echo $UID # 1000
- Usos:
- Verificación de privilegios.
- Condicionales en scripts.
🧬 13. $BASH_VERSION
– Versión de Bash
- Función: Muestra la versión actual de Bash.
- Ejemplo:
echo $BASH_VERSION # 5.1.8(1)-release
- Usos:
- Compatibilidad de scripts.
- Detección de entornos vulnerables.
🧩 14. $0
, $1
, $2
, … – Argumentos posicionales
- Función: Representan los argumentos pasados a un script.
- Ejemplo:
./script.sh archivo.txt echo $1 # archivo.txt
- Usos:
- Automatización.
- Procesamiento flexible de entradas.
🧰 15. $ENV
– Archivo de configuración de entorno
- Función: Define qué archivo se carga al iniciar una shell no interactiva.
- Usos:
- Personalización avanzada.
- Persistencia maliciosa si se manipula indebidamente.
🧠 Bonus: Variables útiles en pentesting
Variable | Utilidad en hacking |
---|---|
$PATH | Inyección de binarios falsos |
$TERM | Mejora de shells reversas |
$PS1 | Detección de shell limitada |
$UID | Verificación de privilegios |
$HOME | Acceso a archivos sensibles |
Resumen del archivo .bashrc
- Verifica si el shell es interactivo y sale si no lo es.
- Configura el historial de comandos, incluyendo cómo se almacenan y su tamaño.
- Ajusta el tamaño de la ventana después de cada comando.
- Configura el prompt (PS1), incluyendo colores y formato según las capacidades de la terminal.
- Configura el título de la ventana del terminal.
- Define aliases para comandos comunes como
ls
,grep
,diff
, etc., y habilita el soporte de colores. - Incluye alias adicionales desde el archivo
~/.bash_aliases
si existe. - Habilita características de autocompletado programable si los archivos necesarios existen.
- Carga NVM y su autocompletado si están instalados.
Este archivo .bashrc
está bien configurado para mejorar la experiencia en la línea de comandos con funcionalidades adicionales, colores, y una personalización del prompt para hacer el uso del terminal más eficiente y agradable.
Ya dominas Bash y quieres ir más allá en el control del sistema, Perl es una herramienta brutal. Vamos a desmenuzarlo a fondo: qué es, cómo funciona, por qué es tan potente, y cómo puedes usarlo para tareas de administración, automatización, análisis de logs, y más.
🧠 ¿Qué es Perl?
Perl (Practical Extraction and Report Language) es un lenguaje de programación interpretado, creado por Larry Wall en 1987. Su propósito inicial fue facilitar la manipulación de texto y generación de informes, pero evolucionó hasta convertirse en una herramienta multiparadigma, multiplataforma y extremadamente flexible.
🔧 Características Clave
Característica | Descripción |
---|---|
🧬 Multiparadigma | Soporta programación imperativa, funcional y orientada a objetos. |
🧪 Potente en texto | Su motor de expresiones regulares es uno de los más avanzados. |
📦 Modularidad | Usa módulos (CPAN ) para extender funcionalidades sin reinventar la rueda. |
🖥️ Multiplataforma | Corre en Linux, Windows, macOS, BSD, Solaris, etc. |
🧩 Tipado dinámico | No necesitas declarar tipos de variables. |
🧠 Reflexivo | Puede inspeccionar y modificar su propia estructura en tiempo de ejecución. |
🛠️ ¿Para qué se usa Perl?
- Administración de sistemas: automatización de backups, gestión de usuarios, monitoreo.
- Procesamiento de logs: análisis de archivos enormes con expresiones regulares.
- Seguridad informática: escaneo de puertos, análisis de vulnerabilidades, fuzzing.
- Web scraping: extracción de datos de páginas web.
- Desarrollo web: con frameworks como Catalyst o Dancer.
- Bioinformática y ciencia de datos: por su capacidad de manejar grandes volúmenes de texto.
📚 Sintaxis Básica
#!/usr/bin/perl
use strict;
use warnings;
print "Hola, David\n";
my $nombre = "Perl";
if ($nombre eq "Perl") {
print "¡Estás usando Perl!\n";
}
use strict;
yuse warnings;
ayudan a evitar errores comunes.$variable
es una escalar (número o cadena).@array
y%hash
son estructuras de datos muy potentes.
🔍 Expresiones Regulares
Una de las joyas de Perl:
my $texto = "Usuario: david";
if ($texto =~ /Usuario: (\w+)/) {
print "Nombre capturado: $1\n";
}
=~
es el operador de coincidencia.(\w+)
captura una palabra.$1
accede al primer grupo capturado.
📦 CPAN – El Tesoro de Perl
CPAN (Comprehensive Perl Archive Network) es un repositorio con más de 250,000 módulos listos para usar.
cpan install Net::SSH
Ejemplos útiles:
Net::SSH
para conexiones remotas.DBI
para bases de datos.LWP::UserAgent
para hacer peticiones HTTP.
🧠 Comparativa con Bash
Aspecto | Bash | Perl |
---|---|---|
🧠 Complejidad lógica | Limitado | Avanzado |
📄 Manejo de texto | Básico | Muy potente |
🔁 Bucles y condicionales | Simples | Flexibles y anidados |
📦 Librerías externas | Escasas | CPAN con miles de módulos |
🧪 Expresiones regulares | Limitadas | Extremadamente avanzadas |
🧪 Ejemplo: Script para analizar logs
#!/usr/bin/perl
use strict;
use warnings;
open my $fh, '<', '/var/log/auth.log' or die "No se puede abrir: $!";
while (my $line = <$fh>) {
if ($line =~ /Failed password for (\w+)/) {
print "Intento fallido para usuario: $1\n";
}
}
close $fh;
Este script escanea el log de autenticación y extrae intentos fallidos de login. Ideal para tareas de seguridad.
📚 Bibliografía y Recursos
Aquí tienes fuentes confiables para seguir profundizando:
- 📘 Introducción a Perl para administradores de sistemas
- 📘 Artículo completo en Wikipedia sobre Perl
- 📘 KeepCoding: ¿Qué es Perl y para qué sirve?
- 📘 Programming Perl (el famoso “Libro del Camello”) – Larry Wall, Tom Christiansen, Jon Orwant.
- 📘 Perl Best Practices – Damian Conway.
- 📘 Modern Perl – chromatic (libro gratuito en línea).
Aquí tienes una guía práctica de Perl para que puedas dominarlo desde cero y aprovechar todo su poder en administración de sistemas, automatización, análisis de texto y más. Vamos paso a paso, cubriendo desde lo básico hasta estructuras más avanzadas como objetos y clases.
🧪 Guía Práctica de Perl para Administradores y Hackers Curiosos
🧱 1. Estructura básica de un script
#!/usr/bin/perl
use strict;
use warnings;
print "¡Hola, Perl!\n";
#!/usr/bin/perl
: indica que el script se ejecuta con Perl.use strict;
: obliga a declarar variables, evitando errores.use warnings;
: muestra advertencias útiles.
🔢 2. Variables escalares ($
)
my $nombre = "David";
my $edad = 42;
my $activo = 1;
$
indica una variable escalar (cadena, número, booleano).my
declara la variable con alcance local.
📚 3. Arrays (@
)
my @frutas = ("manzana", "pera", "plátano");
print $frutas[0]; # manzana
@
define un array.- Los elementos se acceden con índice:
$frutas[1]
.
🔁 Recorrer un array:
foreach my $fruta (@frutas) {
print "$fruta\n";
}
🗂️ 4. Hashes o diccionarios (%
)
my %usuario = (
nombre => "David",
edad => 42,
admin => 1
);
print $usuario{nombre}; # David
🔁 Recorrer un hash:
while (my ($clave, $valor) = each %usuario) {
print "$clave: $valor\n";
}
🔁 5. Bucles
for
for (my $i = 0; $i < 5; $i++) {
print "$i\n";
}
foreach
foreach my $item (@lista) {
print "$item\n";
}
while
my $x = 0;
while ($x < 3) {
print "$x\n";
$x++;
}
🔀 6. Condicionales
if ($edad > 18) {
print "Mayor de edad\n";
} elsif ($edad == 18) {
print "Justo 18\n";
} else {
print "Menor de edad\n";
}
📦 7. Cargar librerías (módulos)
use File::Find;
use LWP::UserAgent;
use Net::SSH2;
- Se instalan desde CPAN:
cpan install File::Find
- También puedes usar
use lib
para cargar módulos personalizados:use lib '/ruta/a/mis/modulos'; use MiModulo;
🧱 8. Subrutinas (funciones)
sub saludar {
my ($nombre) = @_;
print "Hola, $nombre\n";
}
saludar("David");
- Los argumentos se reciben en
@_
. - Puedes devolver valores con
return
.
🧬 9. Programación orientada a objetos
Definir una clase:
package Persona;
sub new {
my ($class, $nombre) = @_;
my $self = { nombre => $nombre };
bless $self, $class;
return $self;
}
sub saludar {
my ($self) = @_;
print "Hola, soy $self->{nombre}\n";
}
1;
Usar la clase:
use Persona;
my $p = Persona->new("David");
$p->saludar();
🧠 10. Expresiones regulares
my $texto = "Usuario: david42";
if ($texto =~ /Usuario: (\w+)/) {
print "Nombre capturado: $1\n";
}
=~
es el operador de coincidencia.$1
accede al primer grupo capturado.
📚 Recursos recomendados
- 📘 Guía Introductoria al Lenguaje Perl (PDF)
- 📘 Tutorial de Perl en ibiblio.org
- 📘 Prácticas de Perl – UAM
- 📘 Programming Perl – Larry Wall (el “Libro del Camello”)
- 📘 Modern Perl – chromatic (libro gratuito en línea)
Your point of view caught my eye and was very interesting. Thanks. I have a question for you.
Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.
I don’t think the title of your article matches the content lol. Just kidding, mainly because I had some doubts after reading the article.
acheter spedra: PharmaDirecte – prix cialis 5mg
https://snabbapoteket.shop/# köpa på nätet
medicijnen online Medicijn Punt apteka online holandia
viata online apotheek: online apotheek nederland – onl8ne drogist
apotheek bestellen: apotheek recept – apotheke holland
https://tryggmed.com/# resept apotek
gurkemeie apotek: blodtypetest apotek – glidemiddel apotek
sykehus apotek Trygg Med apotek lГёrdag
https://snabbapoteket.shop/# internetapotek
online apotheek goedkoper: online apotheek nederland met recept – medicijn bestellen apotheek
I don’t think the title of your article matches the content lol. Just kidding, mainly because I had some doubts after reading the article.
https://zorgpakket.com/# apteka holandia
online medicijnen bestellen met recept: medicine online – apotheken
medicijn recept apotheke holland medicijnen zonder recept
nГ¤r ska man sluta sova pГҐ rygg gravid: conditioner svenska – Г¶rter naturens eget apotek
https://snabbapoteket.com/# boka fransar
niederlande apotheke: apteka nl online – online pharmacy
apotek online recept Snabb Apoteket apotek jour
https://zorgpakket.com/# apotheek winkel 24 review
dusjolje apotek: TryggMed – urinprГёve narkotika apotek
https://tryggmed.shop/# åpent apotek i påsken
apotek fraktfritt: SnabbApoteket – pcr-test apotek
medicijnen bestellen online pharma apotheek internetapotheek spanje
hansker apotek: renset parafin apotek – lavendelolje apotek
https://zorgpakket.shop/# pharmacy online
proteinbars billigt: Snabb Apoteket – svinkoppor gravid
http://tryggmed.com/# slankepulver apotek
recept medicijnen MedicijnPunt med apotheek
angrepille apotek: berberine apotek – selolje apotek
https://snabbapoteket.shop/# probiotika apotek
niederlande apotheke: online apotheek zonder recept ervaringen – online apotheek recept
http://medimexicorx.com/# mexico drug stores pharmacies
ExpressCareRx: ExpressCareRx – Nootropil
IndiaMedsHub п»їlegitimate online pharmacies india india pharmacy mail order
https://expresscarerx.online/# ExpressCareRx
https://medimexicorx.com/# MediMexicoRx
ExpressCareRx: buy ambien from us pharmacy – envision rx pharmacy
MediMexicoRx MediMexicoRx MediMexicoRx
best prices on finasteride in mexico: buy cheap meds from a mexican pharmacy – MediMexicoRx
http://expresscarerx.org/# ExpressCareRx
IndiaMedsHub: cheapest online pharmacy india – Online medicine order
ExpressCareRx Sinemet propecia online pharmacy no prescription
http://indiamedshub.com/# india online pharmacy
best india pharmacy: IndiaMedsHub – IndiaMedsHub
http://medimexicorx.com/# mexican online pharmacies prescription drugs
top 10 pharmacies in india IndiaMedsHub IndiaMedsHub
sildenafil mexico online: MediMexicoRx – zithromax mexican pharmacy
https://expresscarerx.org/# animal pharmacy online
reputable indian pharmacies: IndiaMedsHub – indian pharmacy
IndiaMedsHub online pharmacy india best india pharmacy
https://indiamedshub.com/# indian pharmacy
web rx pharmacy palace: tesco pharmacy viagra cost – italian pharmacy online
MediMexicoRx: MediMexicoRx – generic drugs mexican pharmacy
https://medimexicorx.shop/# mexican rx online
indian pharmacies safe IndiaMedsHub IndiaMedsHub
https://indiamedshub.shop/# IndiaMedsHub
finpecia from inhouse pharmacy: compounding pharmacy viagra – 24 store pharmacy
MediMexicoRx: buy modafinil from mexico no rx – trusted mexico pharmacy with US shipping
MediMexicoRx MediMexicoRx MediMexicoRx
https://expresscarerx.org/# how much does cialis cost at the pharmacy
my pharmacy online: online pharmacy retin a – nexium online pharmacy no prescription
indian pharmacies safe: top 10 online pharmacy in india – п»їlegitimate online pharmacies india
https://indiamedshub.com/# india pharmacy
https://expresscarerx.org/# Ponstel
top online pharmacy india IndiaMedsHub IndiaMedsHub
indian pharmacy paypal: top online pharmacy india – IndiaMedsHub
ExpressCareRx: ExpressCareRx – target pharmacy refills online
https://indiamedshub.shop/# best india pharmacy
buy antibiotics from mexico buy viagra from mexican pharmacy MediMexicoRx
best online pharmacy india: IndiaMedsHub – online shopping pharmacy india
https://indiamedshub.com/# india online pharmacy
https://expresscarerx.online/# ExpressCareRx
Hello there, I discovered you siye viia Google att the same time ass looking for a related subject,
your website came up, it looks good. I’ve bookmarked itt iin my googl bookmarks.
Hllo there, simplly becokme alert too your webglog through Google, annd located that it iis trul informative.
I am going tto waatch oout for brussels.
I wiill bbe grrateful shkuld yyou continue this in future.
Loots off other folks wikll bbe benefited ouut of youur writing.
Cheers!
Finasteride From Canada: Finasteride From Canada – propecia sale
buy Zoloft online without prescription USA buy Zoloft online without prescription USA purchase generic Zoloft online discreetly
I read this article fully on tthe topic of the comparison of latest and earlkier technologies, it’s awesdome article.
Lexapro for depression online: lexapro generic – Lexapro for depression online
https://tadalafilfromindia.com/# Tadalafil From India
Lexapro for depression online: Lexapro for depression online – Lexapro for depression online
lexapro 0.5 mg lexapro online Lexapro for depression online
Your article helped me a lot, is there any more related content? Thanks!
Zoloft online pharmacy USA: generic sertraline – sertraline online
https://lexapro.pro/# Lexapro for depression online
generic Cialis from India: Cialis without prescription – buy tadalafil online usa
tadalafil online no rx cheap Cialis Canada tadalafil 10mg generic
https://isotretinoinfromcanada.shop/# isotretinoin online
tadalafil online no rx: buy Cialis online cheap – tadalafil online no rx
https://zoloft.company/# generic sertraline
order isotretinoin from Canada to US: order isotretinoin from Canada to US – buy Accutane online
cheap Zoloft cheap Zoloft generic sertraline
https://lexapro.pro/# lexapro generic 20 mg
cheap Propecia Canada: cheap Propecia Canada – generic Finasteride without prescription
Lexapro for depression online: lexapro drug – lexapro coupon
generic Finasteride without prescription generic Finasteride without prescription generic Finasteride without prescription
https://zoloft.company/# generic sertraline
cheap Propecia Canada: propecia medication – Finasteride From Canada
http://finasteridefromcanada.com/# buying cheap propecia prices
Isotretinoin From Canada: order isotretinoin from Canada to US – isotretinoin online
generic Finasteride without prescription generic Finasteride without prescription cheap Propecia Canada
https://zoloft.company/# Zoloft Company
pharmacy price for lexapro 20 mg: generic brand for lexapro – lexapro price comparison
https://lexapro.pro/# lexapro coupon
tadalafil 5mg cost: Tadalafil From India – tadalafil online no rx
https://tadalafilfromindia.shop/# Tadalafil From India
Lexapro for depression online: lexapro 0.5 mg – can you buy lexapro over the counter
https://zoloft.company/# Zoloft online pharmacy USA
isotretinoin online: order isotretinoin from Canada to US – isotretinoin online
USA-safe Accutane sourcing isotretinoin online Accutane for sale
USA-safe Accutane sourcing: cheap Accutane – Accutane for sale
https://lexapro.pro/# Lexapro for depression online
https://finasteridefromcanada.shop/# Propecia for hair loss online
Zoloft online pharmacy USA: buy Zoloft online – Zoloft Company
buy Zoloft online without prescription USA Zoloft for sale generic sertraline
tadalafil online no rx: cheap Cialis Canada – buy tadalafil online without a prescription
https://isotretinoinfromcanada.shop/# cheap Accutane
Isotretinoin From Canada: buy Accutane online – generic isotretinoin
Lexapro for depression online Lexapro for depression online generic lexapro canada pharmacy
tadalafil online 10mg: tadalafil online no rx – Tadalafil From India
https://tadalafilfromindia.shop/# tadalafil online no rx
https://lexapro.pro/# lexapro prescription price
Lexapro for depression online: generic lexapro canada pharmacy – lexapro 5 mg tablet price
where can i buy lexapro online lexapro brand name Lexapro for depression online
https://lexapro.pro/# Lexapro for depression online
buy Accutane online: USA-safe Accutane sourcing – Accutane for sale
Propecia for hair loss online cost of cheap propecia without a prescription generic Finasteride without prescription
Isotretinoin From Canada: Accutane for sale – Isotretinoin From Canada
cheap Accutane: buy Accutane online – isotretinoin online
Lexapro for depression online Lexapro for depression online Lexapro for depression online
sertraline online: generic sertraline – generic sertraline
generic Finasteride without prescription: Propecia for hair loss online – generic Finasteride without prescription
buy lexapro online without prescription Lexapro for depression online Lexapro for depression online
tadalafil online no rx: cheap tadalafil tablets – tadalafil online no rx
buy Cialis online cheap: generic Cialis from India – tadalafil online no rx
https://isotretinoinfromcanada.com/# buy Accutane online
cheap Accutane Isotretinoin From Canada Isotretinoin From Canada
Zoloft for sale: Zoloft online pharmacy USA – buy Zoloft online
cheap Accutane: cheap Accutane – USA-safe Accutane sourcing
I don’t think the title of your article matches the content lol. Just kidding, mainly because I had some doubts after reading the article.
isotretinoin online: order isotretinoin from Canada to US – cheap Accutane
http://finasteridefromcanada.com/# cheap Propecia Canada
buy Cialis online cheap: buy Cialis online cheap – Tadalafil From India
Tadalafil From India: generic Cialis from India – buy Cialis online cheap
generic isotretinoin: purchase generic Accutane online discreetly – Accutane for sale
NeuroRelief Rx: NeuroRelief Rx – gabapentin tramadol dosage
https://clearmedsdirect.shop/# low-cost antibiotics delivered in USA
order corticosteroids without prescription order corticosteroids without prescription 54 prednisone
can you buy amoxicillin over the counter in canada: order amoxicillin without prescription – ClearMeds Direct
40 mg daily prednisone: ReliefMeds USA – anti-inflammatory steroids online
Relief Meds USA: cheapest prednisone no prescription – prednisone 2.5 mg daily
Clomid Hub Clomid Hub Pharmacy cheap clomid without a prescription
Modafinil for ADHD and narcolepsy: Wake Meds RX – smart drugs online US pharmacy
Relief Meds USA: can you buy prednisone online uk – ReliefMeds USA
https://wakemedsrx.shop/# buy Modafinil online USA
anti-inflammatory steroids online: ReliefMeds USA – prednisone prescription for sale
Clomid Hub Pharmacy: get clomid tablets – where to get generic clomid without prescription
Relief Meds USA order corticosteroids without prescription order corticosteroids without prescription
Clear Meds Direct: Clear Meds Direct – order amoxicillin without prescription
order corticosteroids without prescription: anti-inflammatory steroids online – Relief Meds USA
gabapentin another name NeuroRelief Rx fluoxetine buy
anti-inflammatory steroids online: ReliefMeds USA – Relief Meds USA
https://clearmedsdirect.shop/# Clear Meds Direct
Clomid Hub: how can i get clomid for sale – can i get clomid without dr prescription
nootropic Modafinil shipped to USA: affordable Modafinil for cognitive enhancement – Modafinil for focus and productivity
anti-inflammatory steroids online prednisone sale anti-inflammatory steroids online
NeuroRelief Rx: gabapentin withdrawal webmd – fluoxetine without a prescription
Modafinil for focus and productivity: prescription-free Modafinil alternatives – smart drugs online US pharmacy
anti-inflammatory steroids online buy prednisone without prescription paypal Relief Meds USA
affordable Modafinil for cognitive enhancement wakefulness medication online no Rx WakeMedsRX
order corticosteroids without prescription: ReliefMeds USA – order corticosteroids without prescription
Clear Meds Direct: buy amoxicillin 250mg – Clear Meds Direct
antibiotic treatment online no Rx: low-cost antibiotics delivered in USA – Clear Meds Direct
amoxicillin capsule 500mg price ClearMeds Direct Clear Meds Direct
order corticosteroids without prescription: order corticosteroids without prescription – ReliefMeds USA
https://neuroreliefrx.shop/# NeuroRelief Rx
low-cost antibiotics delivered in USA: order amoxicillin without prescription – where can i buy amoxicillin over the counter
anti-inflammatory steroids online: prednisone steroids – order corticosteroids without prescription
affordable Modafinil for cognitive enhancement: prescription-free Modafinil alternatives – WakeMeds RX
Relief Meds USA: prednisone 10mg – anti-inflammatory steroids online
prednisone 20 mg prices: cost of prednisone in canada – prednisone medicine
antibiotic treatment online no Rx: amoxicillin 500mg capsules uk – amoxicillin brand name
order amoxicillin without prescription: Clear Meds Direct – Clear Meds Direct
https://clearmedsdirect.com/# Clear Meds Direct
Clomid Hub how to get clomid without insurance Clomid Hub Pharmacy
prednisone 20 mg without prescription: ReliefMeds USA – anti-inflammatory steroids online
antibiotic treatment online no Rx: where to get amoxicillin over the counter – antibiotic treatment online no Rx
buying amoxicillin in mexico Clear Meds Direct antibiotic treatment online no Rx
Relief Meds USA: order corticosteroids without prescription – ReliefMeds USA
order amoxicillin without prescription: can i buy amoxicillin over the counter – Clear Meds Direct
order Provigil without prescription: where to buy Modafinil legally in the US – safe Provigil online delivery service
NeuroRelief Rx gabapentin 300 mg capsule gre NeuroRelief Rx
https://wakemedsrx.shop/# Modafinil for focus and productivity
30mg prednisone: cheap generic prednisone – order corticosteroids without prescription
CanadRx Nexus: pharmacies in canada that ship to the us – CanadRx Nexus
CanadRx Nexus: pharmacy canadian superstore – legit canadian online pharmacy
IndiGenix Pharmacy: IndiGenix Pharmacy – IndiGenix Pharmacy
northwest pharmacy canada maple leaf pharmacy in canada canadian pharmacy no scripts
IndiGenix Pharmacy: india pharmacy – mail order pharmacy india
safe online pharmacies in canada: reputable canadian online pharmacies – CanadRx Nexus
IndiGenix Pharmacy: Online medicine order – IndiGenix Pharmacy
get viagra without prescription from mexico gabapentin mexican pharmacy sildenafil mexico online
https://mexicarerxhub.shop/# mexican pharmaceuticals online
top 10 online pharmacy in india: pharmacy website india – cheapest online pharmacy india
CanadRx Nexus: CanadRx Nexus – canadian drug pharmacy
canadian pharmacy prices: canadian pharmacy meds – canadian pharmacy price checker
pharmacy website india IndiGenix Pharmacy world pharmacy india
canada drug pharmacy: CanadRx Nexus – canada drugstore pharmacy rx
canadian world pharmacy canadian pharmacy CanadRx Nexus
mexico drug stores pharmacies: mexican pharmaceuticals online – mexican pharmaceuticals online
https://indigenixpharm.com/# top online pharmacy india
indianpharmacy com: Online medicine home delivery – IndiGenix Pharmacy
mail order pharmacy india: indian pharmacy online – IndiGenix Pharmacy
MexiCare Rx Hub isotretinoin from mexico safe mexican online pharmacy
canadian pharmacy uk delivery: ed meds online canada – CanadRx Nexus
legit mexican pharmacy without prescription: zithromax mexican pharmacy – MexiCare Rx Hub
MexiCare Rx Hub: best prices on finasteride in mexico – MexiCare Rx Hub
gabapentin mexican pharmacy order azithromycin mexico safe place to buy semaglutide online mexico
MexiCare Rx Hub: mexico drug stores pharmacies – MexiCare Rx Hub
http://mexicarerxhub.com/# MexiCare Rx Hub
CanadRx Nexus: pet meds without vet prescription canada – legitimate canadian online pharmacies
canada pharmacy online: canadian pharmacy 365 – CanadRx Nexus
canadian pharmacy drugs online: canadian pharmacy antibiotics – best rated canadian pharmacy
legit mexico pharmacy shipping to USA: MexiCare Rx Hub – MexiCare Rx Hub
indian pharmacy: online shopping pharmacy india – reputable indian pharmacies
IndiGenix Pharmacy IndiGenix Pharmacy online shopping pharmacy india
MexiCare Rx Hub: mexican border pharmacies shipping to usa – reputable mexican pharmacies online
Online medicine order: online shopping pharmacy india – indian pharmacy online
https://canadrxnexus.com/# CanadRx Nexus
CanadRx Nexus: canada pharmacy online – canadian pharmacy no scripts
CanadRx Nexus canadian compounding pharmacy CanadRx Nexus
indian pharmacy: IndiGenix Pharmacy – IndiGenix Pharmacy
CanadRx Nexus: canadian pharmacy service – reliable canadian pharmacy
IndiGenix Pharmacy: IndiGenix Pharmacy – IndiGenix Pharmacy
Online medicine order pharmacy website india IndiGenix Pharmacy
CanadRx Nexus: canadian pharmacy ed medications – online pharmacy canada
MexiCare Rx Hub: MexiCare Rx Hub – MexiCare Rx Hub
world pharmacy india pharmacy website india india pharmacy mail order
https://indigenixpharm.com/# best india pharmacy
top 10 pharmacies in india: IndiGenix Pharmacy – IndiGenix Pharmacy
purple pharmacy mexico price list: mexico drug stores pharmacies – mexico pharmacies prescription drugs
reputable canadian online pharmacy: CanadRx Nexus – CanadRx Nexus
MexiCare Rx Hub mexican pharmacy for americans MexiCare Rx Hub
IndiGenix Pharmacy: best online pharmacy india – indian pharmacies safe
MexiCare Rx Hub: MexiCare Rx Hub – MexiCare Rx Hub
pharmacy website india: IndiGenix Pharmacy – IndiGenix Pharmacy
AsthmaFree Pharmacy AsthmaFree Pharmacy AsthmaFree Pharmacy
http://glucosmartrx.com/# semaglutide average weight loss
ivermectin trials: IverCare Pharmacy – ivermectin treatment
safe online source for Tizanidine: cheap muscle relaxer online USA – Zanaflex medication fast delivery
FluidCare Pharmacy lasix generic name furosemide 40 mg
ivermectin for snakes: IverCare Pharmacy – IverCare Pharmacy
semaglutide dosage chart units: AsthmaFree Pharmacy – AsthmaFree Pharmacy
FluidCare Pharmacy FluidCare Pharmacy lasix dosage
https://fluidcarepharmacy.com/# FluidCare Pharmacy
equine ivermectin paste: stromectol dosing – IverCare Pharmacy
ivermectin overdose: IverCare Pharmacy – ivermectin 6 mg tablets
stromectol 15 mg: ivermectin for snake mites – ivermectin dose for scabies in humans
cheap muscle relaxer online USA safe online source for Tizanidine safe online source for Tizanidine
AsthmaFree Pharmacy: AsthmaFree Pharmacy – AsthmaFree Pharmacy
lasix tablet: FluidCare Pharmacy – lasix 40 mg
AsthmaFree Pharmacy do you need a prescription for semaglutide AsthmaFree Pharmacy
https://ivercarepharmacy.shop/# Stromectol
Tizanidine tablets shipped to USA: buy Zanaflex online USA – cheap muscle relaxer online USA
IverCare Pharmacy: IverCare Pharmacy – IverCare Pharmacy
AsthmaFree Pharmacy AsthmaFree Pharmacy can you take metformin jardiance and rybelsus together
rybelsus out of pocket cost: does semaglutide cause diarrhea – weight loss with rybelsus
Tizanidine tablets shipped to USA prescription-free muscle relaxants muscle relaxants online no Rx
lasix uses: FluidCare Pharmacy – lasix online
cheap muscle relaxer online USA: buy Zanaflex online USA – RelaxMeds USA
https://fluidcarepharmacy.com/# FluidCare Pharmacy
Tizanidine 2mg 4mg tablets for sale Tizanidine 2mg 4mg tablets for sale Tizanidine tablets shipped to USA
AsthmaFree Pharmacy: ventolin buy canada – can i buy ventolin over the counter australia
buy ventolin online australia: ventolin pharmacy singapore – AsthmaFree Pharmacy
AsthmaFree Pharmacy ventolin rx ventolin usa over the counter
Zanaflex medication fast delivery: Tizanidine 2mg 4mg tablets for sale – buy Zanaflex online USA
https://glucosmartrx.shop/# AsthmaFree Pharmacy
IverCare Pharmacy IverCare Pharmacy ivermectin 2mg
ventolin australia price: ventolin cost – AsthmaFree Pharmacy
FluidCare Pharmacy: lasix dosage – FluidCare Pharmacy
FluidCare Pharmacy furosemida 40 mg lasix uses
furosemide 100mg: FluidCare Pharmacy – buy lasix online
lasix 40 mg: FluidCare Pharmacy – furosemide 100 mg
Tizanidine tablets shipped to USA prescription-free muscle relaxants affordable Zanaflex online pharmacy
AsthmaFree Pharmacy: AsthmaFree Pharmacy – ventolin prescription canada
http://fluidcarepharmacy.com/# furosemida
rybelsus not working for weight loss: AsthmaFree Pharmacy – AsthmaFree Pharmacy
AsthmaFree Pharmacy: can you cut rybelsus in half – open rybelsus bottle
lasix 100mg FluidCare Pharmacy lasix generic
stromectol xl: IverCare Pharmacy – IverCare Pharmacy
ivermectin 500mg: IverCare Pharmacy – ivermectin pills human
AsthmaFree Pharmacy semaglutide for weight loss in non diabetics AsthmaFree Pharmacy
AsthmaFree Pharmacy: ventolin discount coupon – AsthmaFree Pharmacy
http://glucosmartrx.com/# AsthmaFree Pharmacy
FluidCare Pharmacy: FluidCare Pharmacy – lasix online
AsthmaFree Pharmacy AsthmaFree Pharmacy AsthmaFree Pharmacy
AsthmaFree Pharmacy: AsthmaFree Pharmacy – AsthmaFree Pharmacy
lasix uses: FluidCare Pharmacy – furosemide
oral semaglutide vs injection glp-1 vs semaglutide AsthmaFree Pharmacy
where can i buy ventolin online: can i buy ventolin over the counter in canada – no prescription ventolin inhaler
semaglutide online prescription: semaglutide tablets vs injection – semaglutide alcohol
AsthmaFree Pharmacy AsthmaFree Pharmacy generic ventolin medication
http://relaxmedsusa.com/# buy Zanaflex online USA
Swerte99 casino walang deposit bonus para sa Pinoy: Swerte99 slots – Swerte99 bonus
Tro choi n? hu GK88 Ca cu?c tr?c tuy?n GK88 Casino online GK88
Trò choi n? hu GK88: Link vào GK88 m?i nh?t – Rút ti?n nhanh GK88
Yeni az?rbaycan kazino sayt?: Canl? krupyerl? oyunlar – Pinco il? real pul qazan
https://mandiwinindo.site/# Judi online deposit pulsa
Pinco il? real pul qazan: Onlayn kazino Az?rbaycan – Pinco casino mobil t?tbiq
Live casino Mandiribet: Mandiribet login – Mandiribet login
Promo slot gacor hari ini: Link alternatif Beta138 – Situs judi resmi berlisensi
Jackpot togel hari ini Situs togel online terpercaya Jackpot togel hari ini
Link alternatif Abutogel: Bandar togel resmi Indonesia – Abutogel
Bonus new member 100% Mandiribet: Slot jackpot terbesar Indonesia – Slot gacor hari ini
Link alternatif Abutogel: Bandar togel resmi Indonesia – Jackpot togel hari ini
Link vao GK88 m?i nh?t: Ca cu?c tr?c tuy?n GK88 – Tro choi n? hu GK88
https://mandiwinindo.site/# Link alternatif Mandiribet
Khuy?n mai GK88 Slot game d?i thu?ng Ca cu?c tr?c tuy?n GK88
jollibet casino: Jollibet online sabong – 1winphili
Live casino Indonesia: Live casino Indonesia – Withdraw cepat Beta138
Jiliko bonus: Jiliko login – Jiliko slots
Slot game d?i thu?ng Khuy?n mai GK88 Khuy?n mai GK88
Slot gacor hari ini: Link alternatif Mandiribet – Mandiribet login
Slot jackpot terbesar Indonesia: Situs judi resmi berlisensi – Link alternatif Mandiribet
Qeydiyyat bonusu Pinco casino: Canl? krupyerl? oyunlar – Etibarl? onlayn kazino Az?rbaycanda
https://betawinindo.top/# Situs judi resmi berlisensi
Slot oyunlari Pinco-da: Pinco kazino – Pinco kazino
Bonus new member 100% Beta138 Link alternatif Beta138 Withdraw cepat Beta138
Pinco casino mobil t?tbiq: Onlayn kazino Az?rbaycan – Uduslar? tez c?xar Pinco il?
Pinco r?smi sayt: Slot oyunlar? Pinco-da – Pinco r?smi sayt
jollibet casino: jollibet app – jollibet login
Slot gacor hari ini: Situs judi resmi berlisensi – Slot jackpot terbesar Indonesia
Judi online deposit pulsa: Slot jackpot terbesar Indonesia – Bonus new member 100% Mandiribet
Link alternatif Abutogel: Abutogel login – Abutogel
https://mandiwinindo.site/# Situs judi resmi berlisensi
Swerte99 Swerte99 app Swerte99
Link vao GK88 m?i nh?t: Dang ky GK88 – Khuy?n mai GK88
Situs togel online terpercaya: Situs togel online terpercaya – Abutogel login
jollibet casino: Online gambling platform Jollibet – Online gambling platform Jollibet
Etibarl? onlayn kazino Az?rbaycanda: Qeydiyyat bonusu Pinco casino – Onlayn rulet v? blackjack
Canl? krupyerl? oyunlar: Kazino bonuslar? 2025 Az?rbaycan – Pinco kazino
Nha cai uy tin Vi?t Nam Slot game d?i thu?ng Tro choi n? hu GK88
Slot gacor hari ini: Situs judi resmi berlisensi – Link alternatif Mandiribet
Mandiribet: Link alternatif Mandiribet – Situs judi online terpercaya Indonesia
https://jilwin.pro/# Jiliko login
Pinco casino mobil t?tbiq: Pinco casino mobil t?tbiq – Kazino bonuslar? 2025 Az?rbaycan
Promo slot gacor hari ini: Live casino Indonesia – Live casino Indonesia
Onlayn kazino Az?rbaycan Etibarl? onlayn kazino Az?rbaycanda Pinco casino mobil t?tbiq
Swerte99 casino: Swerte99 bonus – Swerte99 online gaming Pilipinas
Link alternatif Beta138: Situs judi resmi berlisensi – Promo slot gacor hari ini
Mexican Pharmacy Hub Mexican Pharmacy Hub Mexican Pharmacy Hub
MediDirect USA: MediDirect USA – MediDirect USA
mexico pharmacy: trusted mexico pharmacy with US shipping – rybelsus from mexican pharmacy
online pharmacy cialis review: MediDirect USA – online pharmacy price checker
http://mexicanpharmacyhub.com/# mexico drug stores pharmacies
Indian Meds One: Online medicine home delivery – world pharmacy india
Indian Meds One: Indian Meds One – Indian Meds One
Mexican Pharmacy Hub order from mexican pharmacy online Mexican Pharmacy Hub
MediDirect USA: MediDirect USA – medplus pharmacy store locator
Mexican Pharmacy Hub: tadalafil mexico pharmacy – buy modafinil from mexico no rx
Indian Meds One: Indian Meds One – indian pharmacy paypal
https://medidirectusa.shop/# MediDirect USA
buy medicines online in india: best india pharmacy – Indian Meds One
Indian Meds One Indian Meds One Indian Meds One
Mexican Pharmacy Hub: prescription drugs mexico pharmacy – online mexico pharmacy USA
MediDirect USA: MediDirect USA – tretinoin online pharmacy
top 10 pharmacies in india: Online medicine order – indian pharmacy online
Mexican Pharmacy Hub: legit mexican pharmacy without prescription – Mexican Pharmacy Hub
Indian Meds One indian pharmacy indian pharmacy online
Indian Meds One: top 10 online pharmacy in india – best online pharmacy india
https://indianmedsone.com/# buy prescription drugs from india
amoxicillin mexico online pharmacy: Mexican Pharmacy Hub – п»їmexican pharmacy
india pharmacy: Online medicine order – buy prescription drugs from india
top online pharmacy india: Indian Meds One – best india pharmacy
Indian Meds One Indian Meds One Indian Meds One
Mexican Pharmacy Hub: buy antibiotics over the counter in mexico – order kamagra from mexican pharmacy
top 10 pharmacies in india: mail order pharmacy india – Indian Meds One
sav-rx pharmacy: kamagra 365 pharmacy – MediDirect USA
https://indianmedsone.shop/# Indian Meds One
generic drugs mexican pharmacy Mexican Pharmacy Hub Mexican Pharmacy Hub
Indian Meds One: best india pharmacy – Indian Meds One
india online pharmacy: MediDirect USA – MediDirect USA
Indian Meds One: Online medicine order – indianpharmacy com
depakote er online pharmacy: MediDirect USA – MediDirect USA
MediDirect USA: depakote pharmacy – real rx pharmacy
nolvadex australia pharmacy MediDirect USA viagra kuwait pharmacy
online pharmacy ratings: MediDirect USA – MediDirect USA
reputable indian pharmacies: Indian Meds One – reputable indian pharmacies
24 hour online pharmacy: MediDirect USA – rx online pharmacy
https://medidirectusa.shop/# MediDirect USA
mexican pharmaceuticals online: mexico drug stores pharmacies – Mexican Pharmacy Hub
express scripts online pharmacy MediDirect USA cabergoline online pharmacy
Mexican Pharmacy Hub: Mexican Pharmacy Hub – Mexican Pharmacy Hub
order azithromycin mexico: best prices on finasteride in mexico – Mexican Pharmacy Hub
Mexican Pharmacy Hub: mexican rx online – buying prescription drugs in mexico online
Men’s sexual health solutions online: Affordable sildenafil citrate tablets for men – Online sources for Kamagra in the United States
viagra 100 cost: viagra for women online – SildenaPeak
Tadalify Tadalify canadian pharmacy tadalafil 20mg
https://tadalify.shop/# Tadalify
Safe access to generic ED medication: Affordable sildenafil citrate tablets for men – Sildenafil oral jelly fast absorption effect
cialis free: Tadalify – how long does cialis stay in your system
cialis 20mg review cialis where can i buy cialis 5mg price walmart
cialis canadian purchase: Tadalify – Tadalify
SildenaPeak: viagra canada otc – SildenaPeak
viagra online without prescription: SildenaPeak – canadian online pharmacy sildenafil
https://kamameds.com/# Online sources for Kamagra in the United States
Compare Kamagra with branded alternatives: Kamagra reviews from US customers – Compare Kamagra with branded alternatives
Sildenafil oral jelly fast absorption effect Online sources for Kamagra in the United States Affordable sildenafil citrate tablets for men
Men’s sexual health solutions online: Men’s sexual health solutions online – Men’s sexual health solutions online
Tadalify: cialis pills online – cialis tadalafil cheapest online
Online sources for Kamagra in the United States: Kamagra oral jelly USA availability – Kamagra oral jelly USA availability
cialis uses: Tadalify – what are the side effects of cialis
Tadalify tadalafil tablets side effects Tadalify
Tadalify: Tadalify – what does cialis cost
https://kamameds.shop/# Online sources for Kamagra in the United States
Non-prescription ED tablets discreetly shipped: Online sources for Kamagra in the United States – Safe access to generic ED medication
Compare Kamagra with branded alternatives: Affordable sildenafil citrate tablets for men – KamaMeds
Safe access to generic ED medication: Kamagra oral jelly USA availability – Affordable sildenafil citrate tablets for men
Sildenafil oral jelly fast absorption effect: Online sources for Kamagra in the United States – Affordable sildenafil citrate tablets for men
buying cialis without a prescription: Tadalify – Tadalify
ED treatment without doctor visits Safe access to generic ED medication Affordable sildenafil citrate tablets for men
https://tadalify.com/# Tadalify
Men’s sexual health solutions online: KamaMeds – Kamagra reviews from US customers
SildenaPeak: SildenaPeak – SildenaPeak
SildenaPeak: buy generic viagra with paypal – SildenaPeak
Affordable sildenafil citrate tablets for men Kamagra oral jelly USA availability Affordable sildenafil citrate tablets for men
SildenaPeak: viagra mexico – SildenaPeak
SildenaPeak: sildenafil 20mg coupon discount – viagra without rx
Tadalify: Tadalify – Tadalify
http://tadalify.com/# Tadalify
viagra 100mg tablet online: over the counter viagra india – prescription viagra online usa
Kamagra reviews from US customers Non-prescription ED tablets discreetly shipped Non-prescription ED tablets discreetly shipped
cialis patent expiration 2016: too much cialis – Tadalify
Fast-acting ED solution with discreet packaging: Compare Kamagra with branded alternatives – Affordable sildenafil citrate tablets for men
Affordable sildenafil citrate tablets for men: KamaMeds – Men’s sexual health solutions online
cialis on sale buy cialis tadalafil Tadalify
Tadalify: Tadalify – cialis and blood pressure
https://sildenapeak.shop/# SildenaPeak
how much is sildenafil 20 mg: SildenaPeak – viagra cheapest prices
SildenaPeak: australia viagra prescription – SildenaPeak
Tadalify: cialis website – Tadalify
Tadalify cialis free sample Tadalify
Tadalify: Tadalify – trusted online store to buy cialis
female viagra buy: viagra non prescription – how much is generic viagra
Tadalify: cialis professional vs cialis super active – Tadalify
http://kamameds.com/# Men’s sexual health solutions online
Tadalify: how to take cialis – Tadalify
viagra australia pharmacy cheap viagra free shipping sildenafil 50 coupon
cheapest cialis: buy cialis in toronto – what is tadalafil made from
SildenaPeak: viagra 50 mg generic – sildenafil 100mg canada pharmacy
is there a generic cialis available in the us: Tadalify – Tadalify
viagra 25 mg order: sildenafil 50mg brand name – canadian pharmacy viagra 100 mg
SildenaPeak best viagra over the counter SildenaPeak
Men’s sexual health solutions online: Safe access to generic ED medication – Non-prescription ED tablets discreetly shipped
https://sildenapeak.com/# sildenafil cheapest price
Tadalify: order cialis from canada – Tadalify
Tadalify: Tadalify – Tadalify
Kamagra oral jelly USA availability Non-prescription ED tablets discreetly shipped Compare Kamagra with branded alternatives
best generic sildenafil: SildenaPeak – generic viagra paypal
SildenaPeak: prescription viagra for sale – SildenaPeak
SildenaPeak: sildenafil 100mg without a prescription – SildenaPeak
tadalafil 20mg Tadalify safest and most reliable pharmacy to buy cialis
Online sources for Kamagra in the United States: Kamagra reviews from US customers – Sildenafil oral jelly fast absorption effect
https://kamameds.com/# Compare Kamagra with branded alternatives
Tadalify: cialis overnight deleivery – tadalafil 5mg once a day
Tadalify: Tadalify – where to buy cialis cheap
guinea pig ivermectin: ivermectin 1.87 dosage for cats – ivermectin medication
FertiCare Online: how can i get generic clomid – FertiCare Online
half life of ivermectin IverGrove ivermectin for ear mites in dogs
TrustedMeds Direct: over the counter amoxicillin – TrustedMeds Direct
CardioMeds Express: CardioMeds Express – CardioMeds Express
can i get clomid no prescription: can you buy clomid – FertiCare Online
TrustedMeds Direct: TrustedMeds Direct – amoxicillin 825 mg
furosemide 100 mg: buy furosemide online – CardioMeds Express
how to get cheap clomid prices: can i purchase generic clomid pills – FertiCare Online
does ivermectin kill ringworm in cattle: stromectol demodex – IverGrove
SteroidCare Pharmacy: prednisone online sale – prednisone cream
pyrantel vs ivermectin: IverGrove – IverGrove
https://ivergrove.com/# ivermectin 5ml
lasix 100 mg: CardioMeds Express – lasix pills
FertiCare Online: where to buy generic clomid prices – how to buy clomid
how to use ivermectin for dogs: ivermectin for swine oral – IverGrove
IverGrove: ivermectin for ringworm in cattle – IverGrove
ivermectin applicator gun IverGrove ivermectin tablet price
SteroidCare Pharmacy: SteroidCare Pharmacy – SteroidCare Pharmacy
amoxicillin 250 mg: amoxicillin brand name – medicine amoxicillin 500mg
https://ferticareonline.shop/# FertiCare Online
furosemida 40 mg: furosemide 40mg – lasix generic name
TrustedMeds Direct: amoxicillin 500 mg online – TrustedMeds Direct
how to get cheap clomid tablets FertiCare Online FertiCare Online
FertiCare Online: FertiCare Online – can you buy cheap clomid for sale
CardioMeds Express: lasix side effects – CardioMeds Express
CardioMeds Express: CardioMeds Express – lasix 20 mg
migliori farmacie online 2024 trattamenti per la salute sessuale senza ricetta Farmacie online sicure
alternativa al viagra senza ricetta in farmacia: PotenzaFacile – viagra naturale
Farmacia online miglior prezzo: farmacia online Italia – comprare farmaci online con ricetta
farmacia online più conveniente: acquistare cialis generico online – acquistare farmaci senza ricetta
Farmacie on line spedizione gratuita farmacia online Italia farmacia online piГ№ conveniente
Farmacia online piГ№ conveniente: ForzaIntima – Farmacia online piГ№ conveniente
http://farmacidiretti.com/# Farmacia online piГ№ conveniente
pillole per erezione immediata: consegna discreta viagra in Italia – viagra online spedizione gratuita
farmacie online affidabili kamagra online Italia migliori farmacie online 2024
farmacia online piГ№ conveniente: pillole per la potenza con consegna discreta – comprare farmaci online con ricetta
http://farmacidiretti.com/# farmacia online senza ricetta
cerco viagra a buon prezzo: viagra generico a basso costo – viagra generico sandoz
farmacie online sicure farmacia online cialis Italia farmaci senza ricetta elenco
farmacia online senza ricetta: consegna rapida in tutta Italia – Farmacia online piГ№ conveniente
Farmacie on line spedizione gratuita: trattamenti per la salute sessuale senza ricetta – farmacie online sicure
farmaci senza ricetta elenco PilloleSubito farmacia online senza ricetta
http://farmacidiretti.com/# Farmacie online sicure
BorderMeds Express tadalafil mexico pharmacy buy antibiotics over the counter in mexico
medication from mexico pharmacy: BorderMeds Express – mexican drugstore online
MapleMeds Direct: herbals – buy concerta online pharmacy
BharatMeds Direct: buy prescription drugs from india – п»їlegitimate online pharmacies india
Online medicine home delivery BharatMeds Direct india online pharmacy
MapleMeds Direct: MapleMeds Direct – MapleMeds Direct
pharmacy online 365 reviews: methotrexate prices pharmacy – MapleMeds Direct
fry’s food store pharmacy hours: rohypnol pharmacy – mobic online pharmacy
https://bordermedsexpress.com/# mexico drug stores pharmacies
BharatMeds Direct: BharatMeds Direct – online shopping pharmacy india
buy prescription drugs from india BharatMeds Direct Online medicine order
MapleMeds Direct: clopidogrel online pharmacy – us pharmacy viagra
MapleMeds Direct: MapleMeds Direct – compounding pharmacy
http://bharatmedsdirect.com/# india pharmacy
phendimetrazine online pharmacy: MapleMeds Direct – MapleMeds Direct
BharatMeds Direct indian pharmacy BharatMeds Direct
india pharmacy: BharatMeds Direct – BharatMeds Direct
mexican pharmacy: MapleMeds Direct – celebrex northwest pharmacy
buy medicines online in india: reputable indian pharmacies – BharatMeds Direct
BharatMeds Direct top online pharmacy india п»їlegitimate online pharmacies india
MapleMeds Direct: MapleMeds Direct – MapleMeds Direct
BharatMeds Direct: BharatMeds Direct – BharatMeds Direct
https://bordermedsexpress.shop/# BorderMeds Express
world pharmacy india: indianpharmacy com – cheapest online pharmacy india
BharatMeds Direct buy medicines online in india BharatMeds Direct
buy antibiotics from mexico: buy cheap meds from a mexican pharmacy – low cost mexico pharmacy online
MapleMeds Direct: MapleMeds Direct – h-e-b pharmacy
Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.
Online medicine order: BharatMeds Direct – BharatMeds Direct
MapleMeds Direct viagra usa online pharmacy viagra pharmacy reviews
india online pharmacy: indian pharmacy paypal – indian pharmacy online
Tenoretic 100mg: rite aid pharmacy abilify – MapleMeds Direct
preferred plus pharmacy ibuprofen: overseas pharmacy cialis – tretinoin online pharmacy
https://maplemedsdirect.shop/# valacyclovir hcl online pharmacy
seconal online pharmacy MapleMeds Direct MapleMeds Direct
top online pharmacy india: BharatMeds Direct – india pharmacy
BharatMeds Direct: world pharmacy india – indianpharmacy com
online pharmacy reviews ultram: MapleMeds Direct – rx pharmacy online
MapleMeds Direct viagra online pharmacy usa MapleMeds Direct
MapleMeds Direct: MapleMeds Direct – robaxin online pharmacy
pharmacy website india: india pharmacy mail order – india pharmacy
preman69 slot preman69 login slot gacor hari ini preman69
preman69: 1win69 – preman69
giri gratis Book of Ra Deluxe: recensioni Book of Ra Deluxe slot – Book of Ra Deluxe slot online Italia
book of ra deluxe: Book of Ra Deluxe soldi veri – bonus di benvenuto per Book of Ra Italia
permainan slot gacor hari ini garuda888 game slot RTP tinggi daftar garuda888 mudah dan cepat
preman69 login: preman69 slot – preman69 login
migliori casino online con Starburst: giocare da mobile a Starburst – casino online sicuri con Starburst
recensioni Book of Ra Deluxe slot: Book of Ra Deluxe slot online Italia – recensioni Book of Ra Deluxe slot
https://1wbona.com/# bonaslot situs bonus terbesar Indonesia
preman69 login preman69 login preman69 slot
Book of Ra Deluxe slot online Italia: Book of Ra Deluxe slot online Italia – giri gratis Book of Ra Deluxe
giocare a Starburst gratis senza registrazione: Starburst giri gratis senza deposito – Starburst giri gratis senza deposito
bonaslot link resmi mudah diakses: bonaslot jackpot harian jutaan rupiah – bonaslot kasino online terpercaya
garuda888 login resmi tanpa ribet: garuda888 login resmi tanpa ribet – situs judi online resmi Indonesia
giri gratis Book of Ra Deluxe: migliori casino online con Book of Ra – giri gratis Book of Ra Deluxe
http://1win888indonesia.com/# garuda888 login resmi tanpa ribet
bonaslot link resmi mudah diakses: bonaslot – bonaslot
migliori casino online con Book of Ra recensioni Book of Ra Deluxe slot Book of Ra Deluxe slot online Italia
giocare da mobile a Starburst: bonus di benvenuto per Starburst – Starburst giri gratis senza deposito
casino online sicuri con Starburst: giocare a Starburst gratis senza registrazione – casino online sicuri con Starburst
link alternatif garuda888 terbaru: garuda888 – garuda888 slot online terpercaya
Starburst slot online Italia Starburst slot online Italia bonus di benvenuto per Starburst
https://1win69.shop/# preman69 login tanpa ribet
preman69 slot: preman69 situs judi online 24 jam – preman69 login tanpa ribet
giocare a Starburst gratis senza registrazione: Starburst slot online Italia – casino online sicuri con Starburst
daftar garuda888 mudah dan cepat: daftar garuda888 mudah dan cepat – garuda888 slot online terpercaya
migliori casino online con Book of Ra book of ra deluxe recensioni Book of Ra Deluxe slot
book of ra deluxe: Book of Ra Deluxe soldi veri – recensioni Book of Ra Deluxe slot
garuda888 live casino Indonesia: garuda888 – garuda888 game slot RTP tinggi
VitalCore: VitalCore Pharmacy – ed pills
TrueMeds 24 hr pharmacy near me TrueMeds Pharmacy
https://truemedspharm.shop/# reputable online pharmacy reddit
online ed medications: VitalCore – ed medicine online
https://vitalcorepharm.shop/# VitalCore
TrueMeds Pharmacy: TrueMeds – TrueMeds Pharmacy
buy antibiotics buy antibiotics online
VitalCore: online erectile dysfunction – erection pills online
http://vitalcorepharm.com/# VitalCore Pharmacy
VitalCore: VitalCore – VitalCore
https://truemedspharm.shop/# TrueMeds
ed pills VitalCore Pharmacy ed pills
TrueMeds: TrueMeds Pharmacy – prescription drugs online
VitalCore: ed pills – where can i buy erectile dysfunction pills
https://vitalcorepharm.shop/# VitalCore Pharmacy
buy antibiotics for tooth infection buy antibiotics online for uti
VitalCore: ed pills online – ed pills
buy antibiotics for tooth infection: ClearMeds Pharmacy – buy antibiotics for tooth infection
http://clearmedspharm.com/#
https://truemedspharm.com/# top online pharmacy
TrueMeds TrueMeds TrueMeds
buy antibiotics online: ClearMeds – ClearMeds Pharmacy
buy erectile dysfunction medication VitalCore Pharmacy discount ed meds
pharmacie en ligne france: commander médicaments livraison rapide – pharmacie en ligne pas cher
acheter medicaments en ligne pas cher: pharmacie en ligne sans ordonnance – trouver un mГ©dicament en pharmacie
https://pharmaexpressfrance.com/# vente de mГ©dicament en ligne
viagra 100 mg prix abordable France BluePharma pilule bleue en ligne