En este artículo de la serie de depuración de secuencias de comandos de shell, explicaremos el modo de depuración del tercer script de shell, que es el rastreo de shell, y veremos algunos ejemplos para demostrar cómo funciona y cómo se puede utilizar.
La parte anterior de esta serie arroja luz sobre los otros dos modos de depuración de scripts de shell: modo detallado y comprobación de sintaxis modo con ejemplos fáciles de entender de cómo habilitar la depuración de scripts de shell en estos modos.
El rastreo de shell simplemente significa rastrear la ejecución de los comandos en un script de shell. Para activar el rastreo de shell, use el -X
opción de depuración.
Esto indica al shell que muestre todos los comandos y sus argumentos en el terminal a medida que se ejecutan.
Usaremos el sys_info.sh
shell script a continuación, que imprime brevemente la fecha y hora de su sistema, el número de usuarios conectados y el tiempo de actividad del sistema. Sin embargo, contiene errores de sintaxis que debemos encontrar y corregir.
#! / bin / bash. #script para imprimir información breve del sistema ROOT_ID = "0" DATE = `date` NO_USERS = `quién | wc -l` UPTIME = `uptime` check_root () {if [" $ UID "-ne" $ ROOT_ID "]; luego repita "¡No está autorizado a ejecutar este programa!" salida 1; } print_sys_info () {echo "Hora del sistema: $ DATE" echo "Número de usuarios: $ NO_USERS" echo "Tiempo de actividad del sistema: $ UPTIME. } check_root. print_sys_info salir 0.
Guarde el archivo y haga que el script sea ejecutable. El script solo puede ser ejecutado por root, por lo tanto, utilice el comando sudo para ejecutarlo de la siguiente manera:
$ chmod + x sys_info.sh. $ sudo bash -x sys_info.sh.
De la salida anterior, podemos observar que, primero se ejecuta un comando antes de que su salida se sustituya como el valor de una variable.
Por ejemplo, el fecha se ejecutó por primera vez y su salida se sustituyó como el valor de la variable FECHA.
Podemos realizar una verificación de sintaxis para mostrar solo los errores de sintaxis de la siguiente manera:
$ sudo bash -n sys_info.sh
Si miramos críticamente el script de shell, nos daremos cuenta de que el si declaración
falta un cierre fi
palabra. Por lo tanto, vamos a agregarlo y la nueva secuencia de comandos debería verse a continuación:
#! / bin / bash. #script para imprimir información breve del sistema ROOT_ID = "0" DATE = `date` NO_USERS = `quién | wc -l` UPTIME = `uptime` check_root () {if [" $ UID "-ne" $ ROOT_ID "]; luego repita "¡No está autorizado a ejecutar este programa!" salida 1; fi} print_sys_info () {echo "Hora del sistema: $ DATE" echo "Número de usuarios: $ NO_USERS" echo "Tiempo de actividad del sistema: $ UPTIME. } check_root. print_sys_info salir 0.
Guarde el archivo nuevamente e invocalo como root y verifique la sintaxis:
$ sudo bash -n sys_info.sh.
El resultado de nuestra operación de verificación de sintaxis anterior todavía muestra que hay un error más en nuestro script en línea 21. Entonces, todavía tenemos algunas correcciones de sintaxis por hacer.
Si miramos analíticamente el script una vez más, el error en línea 21 se debe a que faltan comillas dobles de cierre (”)
en el último comando de eco dentro de print_sys_info
función.
Agregaremos la comilla doble de cierre en el eco comando y guarde el archivo. El guión modificado está a continuación:
#! / bin / bash. #script para imprimir información breve del sistema ROOT_ID = "0" DATE = `date` NO_USERS = `quién | wc -l` UPTIME = `uptime` check_root () {if [" $ UID "-ne" $ ROOT_ID "]; luego repita "¡No está autorizado a ejecutar este programa!" salida 1; fi. } print_sys_info () {echo "Hora del sistema: $ DATE" echo "Número de usuarios: $ NO_USERS" echo "Tiempo de actividad del sistema: $ UPTIME" } check_root. print_sys_info salir 0.
Ahora revise sintácticamente el script una vez más.
$ sudo bash -n sys_info.sh.
El comando anterior no producirá ningún resultado porque nuestro script ahora es sintácticamente correcto. También podemos rastrear la ejecución del script por segunda vez y debería funcionar bien:
$ sudo bash -x sys_info.sh.
Ahora ejecute el script.
$ sudo ./sys_info.sh.
El rastreo de scripts de shell nos ayuda a identificar errores de sintaxis y, lo que es más importante, errores lógicos. Tomemos, por ejemplo, el check_root
función en el sys_info.sh
script de shell, que está destinado a determinar si un usuario es root o no, ya que el script solo puede ser ejecutado por el superusuario.
check_root () {if ["$ UID" -ne "$ ROOT_ID"]; luego repita "¡No está autorizado a ejecutar este programa!" salida 1; fi. }
La magia aquí está controlada por el si declaración
expresión ["$ UID" -ne "$ ROOT_ID"]
, una vez que no usamos el operador numérico adecuado (-nordeste
en este caso, lo que significa no igual), terminamos con un posible error lógico.
Asumiendo que usamos -eq
(significa igual a), esto permitiría a cualquier usuario del sistema, así como al usuario root, ejecutar el script, por lo tanto, un error lógico.
check_root () {if ["$ UID" -eq "$ ROOT_ID"]; luego repita "¡No está autorizado a ejecutar este programa!" salida 1; fi. }
Nota: Como vimos antes al comienzo de esta serie, el comando integrado set shell puede activar la depuración en una sección particular de un script de shell.
Por lo tanto, la siguiente línea nos ayudará a encontrar este error lógico en la función rastreando su ejecución:
El script con un error lógico:
#! / bin / bash. #script para imprimir información breve del sistema ROOT_ID = "0" DATE = `date` NO_USERS = `quién | wc -l` UPTIME = `uptime` check_root () {if [" $ UID "-eq" $ ROOT_ID "]; luego repita "¡No está autorizado a ejecutar este programa!" salida 1; fi. } print_sys_info () {echo "Hora del sistema: $ DATE" echo "Número de usuarios: $ NO_USERS" echo "Tiempo de actividad del sistema: $ UPTIME" } # activar y desactivar la depuración de la función check_root. set -x; check_root; establecer + x; print_sys_info salir 0.
Guarde el archivo e invoque el script, podemos ver que un usuario normal del sistema puede ejecutar el script sin sudo como en la salida a continuación. Esto se debe a que el valor de USER_ID es 100 que no es igual a root ROOT_ID cual es 0.
$ ./sys_info.sh.
Bueno, eso es todo por ahora, hemos llegado al final del serie de depuración de secuencias de comandos de shell, el formulario de respuesta a continuación se puede utilizar para dirigirnos cualquier pregunta o comentario relacionado con esta guía o toda la serie de 3 partes.