Tabla de contenidos
Los extraños «documentos aquí» le permiten utilizar la redirección de entrada / salida dentro de los scripts Bash en Linux. Son una excelente manera de automatizar los comandos que necesita para ejecutar en una computadora remota.
Aquí Documentos
Muchos comandos en Linux tienen nombres de dos o tres letras. Esto es en parte lo que da lugar a la idea de que Linux es difícil de aprender y está lleno de comandos arcanos. Pero uno de los nombres más extraños en Linux no es uno de los crípticamente cortos. «Aquí los documentos» no son documentos, y tampoco está muy claro a qué se refiere el «aquí».
Son una construcción relativamente oscura, pero son útiles. Por supuesto, esto es Linux, por lo que hay más de una forma de despellejar a un gato. Algunas de las funciones proporcionadas por estos documentos se pueden reproducir de otras formas. Estos métodos alternativos suelen ser más complicados. En programación y scripting, «más complicado» también significa «más propenso a errores» y que su código es más difícil de mantener.
Donde aquí los documentos realmente sobresalen es en la automatización de comandos que desea enviar a una computadora remota desde una conexión establecida desde dentro de un script. Hacer la conexión es fácil, pero una vez que se ha realizado la conexión, ¿cómo «bombeas» tus comandos desde tu script al shell en la computadora remota? Aquí los documentos le permiten hacer eso de manera muy simple.
Principios básicos de los documentos Here
La representación idiomática de un documento aquí se ve así:
COMMAND << cadena_límite . . texto datos variables . . cadena_límite
- COMANDO : Puede ser cualquier comando de Linux que acepte entradas redirigidas. Tenga en cuenta que el
echo
comando no acepta entrada redirigida . Si necesita escribir en la pantalla, puede usar elcat
comando, que lo hace . - << : el operador de redirección.
- limit_string : esta es una etiqueta. Puede ser lo que quiera siempre que no aparezca en la lista de datos que está redirigiendo al comando. Se utiliza para marcar el final de la lista de texto, datos y variables.
- Lista de datos : una lista de datos que se enviarán al comando. Puede contener comandos, texto y variables. El contenido de la lista de datos se introduce en el comando una línea a la vez hasta que se encuentra _limit_string.
Probablemente verá ejemplos de aquí documentos que utilizan «EOF» como la cadena de límite. No favorecemos ese enfoque. Funciona, pero «EOF» significa «Fin de archivo». Aparte del raro caso en el que un documento de inicio es lo último en un archivo de secuencia de comandos, «EOF» se está utilizando erróneamente.
Hará que sus scripts sean mucho más legibles si usa una cadena de límite que se refiera a lo que está haciendo. Si está enviando una serie de comandos a una computadora remota a través de Secure Shell (SSH), una cadena de límite llamada algo como «_remote_commands» tendría mucho sentido. No es necesario que los inicie con un carácter de subrayado “ _
”. Lo hacemos porque los marca como algo fuera de lo común en su guión.
Ejemplos sencillos
Puede utilizar aquí documentos en la línea de comandos y en scripts. Cuando escribe lo siguiente en una ventana de terminal, verá un >
mensaje de continuación de línea » » cada vez que presione «Enter». Cuando escribe la cadena de límite «_end_of_text» y presiona «Enter», se pasa la lista de sitios web cat,
y se muestran en la ventana del terminal.
gato << _end_of_text How-To Geek Revisión Geek LifeSavvy CloudSavvy IT MindBounce _end_of_text
Ese no es el ejercicio más valioso, pero demuestra que no se envía nada al comando hasta que se recopila toda la lista de datos y se encuentra la cadena de límite. El cat
comando no recibe ninguna entrada hasta que ingresa la cadena de límite «_end_of_text» y presiona la tecla «Enter».
Podemos hacer lo mismo en un guión. Escriba o copie este ejemplo en un editor, guarde el archivo como «heredoc-1.sh» y cierre el editor.
#! / bin / bash gato << "_end_of_text" Su nombre de usuario es: $ (whoami) Su directorio de trabajo actual es: $ PWD Tu versión de Bash es: $ BASH_VERSION _end_of_text
A medida que sigue este artículo, cada vez que cree un script, deberá hacerlo ejecutable antes de que se ejecute. En cada caso, use el chmod
comando . Sustituya el nombre del script en cada ejemplo por el nombre del script utilizado aquí.
chmod + x heredoc-1.sh
Este script contiene dos variables de entorno $PWD
y $BASH_VERSION
. Los nombres de las variables de entorno se reemplazan por sus valores de datos (el directorio de trabajo actual y la versión de Bash) cuando se ejecuta el script.
El script también usa la sustitución de comandos en el whoami
comando . El nombre del comando se reemplaza por su propia salida. La salida de todo el script se escribe en la ventana de terminal mediante el comando cat. Ejecutamos el script llamándolo por su nombre:
./heredoc-1.sh
Si modifica la secuencia de comandos y envuelve la cadena de límite en la primera línea del documento aquí entre comillas » "
«, la lista de datos se pasa al comando aquí documento literalmente. Los nombres de las variables se muestran en lugar de los valores de las variables y no se realizará la sustitución de comandos.
#! / bin / bash cat << - "_end_of_text" Su nombre de usuario es: $ (whoami) Su directorio de trabajo actual es: $ PWD Tu versión de Bash es: $ BASH_VERSION _end_of_text
Manejo de caracteres de la pestaña
De forma predeterminada, los caracteres de tabulación en su lista de datos se conservarán y escribirán en la ventana del terminal. Copie y guarde este ejemplo como «heredoc-2.sh». Hágalo ejecutable usando el chmod
comando. Edite las líneas con sangría para asegurarse de que tengan uno o dos caracteres de tabulación al principio de la línea en lugar de una serie de espacios.
#! / bin / bash gato << _end_of_text Su nombre de usuario es: $ (whoami) Su directorio de trabajo actual es: $ PWD Tu versión de Bash es: $ BASH_VERSION _end_of_text
./heredoc-2.sh
Las pestañas se escriben en la ventana de la terminal.
Al agregar un guión » -
» al operador de redirección, el documento aquí ignorará los caracteres de tabulación iniciales. Guarde este ejemplo como «heredoc-3.sh» y hágalo ejecutable.
#! / bin / bash gato << - _end_of_text Su nombre de usuario es: $ (whoami) Su directorio de trabajo actual es: $ PWD Tu versión de Bash es: $ BASH_VERSION _end_of_text
./heredoc-3.sh
Las pestañas se ignoran. Esto puede parecer trivial, pero es una buena forma de lidiar con las pestañas iniciales debido a las secciones sangradas de los scripts.
Los bucles y otras construcciones lógicas suelen tener sangría. Si su documento aquí está contenido en una sección con sangría de un script, el uso de un guión “ -
” con el operador de redirección elimina los problemas de formato causados por los caracteres de tabulación iniciales.
#! / bin / bash si es verdad; luego cat << - _limit_string Línea 1 con tabulación inicial. Línea 2 con tabulación inicial. Línea 3 con una pestaña inicial. _limit_string fi
Redirigir a un archivo
La salida del comando utilizado con el documento aquí se puede redirigir a un archivo. Utilice los operadores de redirección “ >
” (crear el archivo) o “ >>
” (crear el archivo si no existe, anexarlo si existe) después de la cadena de límite en la primera línea del documento aquí.
Este script es «heredoc-4.sh». Redirigirá su salida a un archivo de texto llamado «session.txt».
#! / bin / bash cat << _end_of_text> session.txt Su nombre de usuario es: $ (whoami) Su directorio de trabajo actual es: $ PWD Tu versión de Bash es: $ BASH_VERSION _end_of_text
./heredoc-4.sh
gato sesión de texto
Canalizar la salida a otro comando
La salida del comando utilizado en un documento aquí se puede canalizar como entrada a otro comando. Utilice el |
operador de tubería » » después de la cadena de límite en la primera línea del documento aquí. Vamos a canalizar la salida del comando here document cat
, a sed
. Queremos sustituir todas las apariciones de la letra «a» con la letra «e».
Nombra este script «heredoc-5.sh».
#! / bin / bash gato << _end_of_text | sed 's / a / e / g' Cómo Para Gaak _end_of_text
./heredoc-5.sh
«Gaak» se corrige a «Geek».
Envío de parámetros a una función
El comando que se usa con un documento aquí puede ser una función en el script.
Este script pasa algunos datos del vehículo a una función. La función lee los datos como si los hubiera escrito un usuario. A continuación, se imprimen los valores de las variables. Guarde este script como «heredoc-6.sh».
#! / bin / bash # la función set_car_details () set_car_details () { leer hacer leer modelo leer new_used leer delivery_collect leer ubicación leer precio } # El documento aquí que pasa los datos a set_car_details () set_car_details << _mars_rover_data NASA Perseverance Rover Usado Recolectar Marte (largo, lat) 77.451865,18.445161 2,2 mil millones _mars_rover_data # Recupera los detalles del vehículo echo "Make: $ make" echo "Modelo: $ modelo" echo "Nuevo o Usado: $ new_used" echo "Entrega o recogida: $ delivery_collect" echo "Ubicación: $ ubicación" echo "Precio \ $: $ precio"
./heredoc-6.sh
Los detalles del vehículo se escriben en la ventana de la terminal.
Crear y enviar un correo electrónico
Podemos utilizar un documento aquí para redactar y enviar un correo electrónico. Tenga en cuenta que podemos pasar parámetros al comando delante del operador de redirección. Estamos usando el mail
comando de Linux para enviar un correo electrónico a través del sistema de correo local a la cuenta de usuario llamada «dave». La -s
opción (asunto) nos permite especificar el asunto del correo electrónico.
Este ejemplo forma el script «heredoc-7.sh».
#! / bin / bash artículo = "Aquí Documentos" mail -s 'Estado de carga de trabajo' dave << _project_report Nombre de usuario: $ (whoami) Ha completado la tarea: Artículo: $ artículo _informe del proyecto
./heredoc-7.sh
No hay salida visible de este script. Pero cuando revisamos nuestro correo, vemos que el correo electrónico fue redactado, enviado y entregado.
correo
Uso de documentos aquí con SSH
Aquí los documentos son una forma poderosa y conveniente de ejecutar algunos comandos en una computadora remota una vez que se ha establecido una conexión SSH. Si ha configurado claves SSH entre las dos computadoras, el proceso de inicio de sesión será completamente automático. En este ejemplo rápido y sucio, se le pedirá la contraseña para la cuenta de usuario en la computadora remota.
Este script es «heredoc-8.sh». Vamos a conectarnos a una computadora remota llamada «pc-remota». La cuenta de usuario se llama «dave». Estamos usando la -T
opción (deshabilitar la asignación de pseudo-terminal) porque no necesitamos que se nos asigne un pseudo-terminal interactivo.
En la sección «hacer algo de trabajo aquí» del script, podríamos pasar una lista de comandos, y estos se ejecutarían en la computadora remota. Por supuesto, podría simplemente llamar a un script que estaba en la computadora remota. El script remoto podría contener todos los comandos y rutinas que desea ejecutar.
Todo lo que nuestro script, heredoc-8.sh, va a hacer es actualizar un registro de conexión en la computadora remota. La cuenta de usuario y el sello de fecha y hora se registran en un archivo de texto.
#! / bin / bash ssh -T [email protected] << _comandos_remoto # trabaja un poco aquí # actualizar el registro de conexión echo $ USER "-" $ (fecha) >> /home/dave/conn_log/script.log _remote_commands
Cuando ejecutamos el comando, se nos solicita la contraseña de la cuenta en la computadora remota .
./heredoc-8.sh
Se muestra cierta información sobre la computadora remota y regresamos al símbolo del sistema.
En la computadora remota , podemos usar cat
para verificar el registro de conexión:
cat conn_log / script.log
Cada conexión está listada para nosotros.
Nombre extraño, características interesantes
Aquí los documentos son extravagantes pero poderosos, especialmente cuando se usan para enviar comandos a una computadora remota. Sería muy sencillo crear un script de una rutina de respaldo usando rsync
. Luego, el script podría conectarse a la computadora remota, verificar el espacio de almacenamiento restante y enviar un correo electrónico de alerta si el espacio se estaba agotando.