Scripts de shell útiles en calquera programa

Bater É un programa de ordenador cuxa función é interpretar ordes. Está baseado no shell de Unix e foi escrito para o proxecto GNU sendo o shell predeterminado na maioría das distribucións de GNU / Linux. O seu nome é un acrónimo de Bourne-Again Shell (outro shell bourne), facendo un xogo de palabras (renacer significa renacer) en Bourne shell (sh), que foi un dos primeiros grandes intérpretes de Unix.

Hoxe imos amosar algúns scripts de shell que poden ser moi útiles para os desenvolvedores. A maioría traballa en calquera shell Unix, aínda que algúns requiren que sexan executados especificamente por Bater.

Evitar que os usuarios non privilexiados executen o script

Algúns scripts realizan tarefas administrativas, polo que é posible que só que o usuario root o execute. Nese caso podemos usar algo así:

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Este script debe ser ejecutado por el usuario root" 1>&2
exit 1
fi

Permitir a execución de script só a un usuario específico

De xeito semellante ao código anterior, é posible que só que un usuario específico execute o script. Facémolo así:

#!/bin/bash
AUTHORIZED_USER="usuario_permitido"
if [ $USER != $AUTHORIZED_USER ]; then
echo "Este script debe ser ejecutado por el usuario $AUTHORIZED_USER" 1>&2
exit 1
fi

Verifique que se está executando un servizo / proceso

Se queremos saber se hai procesos dalgún servizo ou programa en execución, poderemos usar este script (neste caso verifica que o demo de Apache está en execución):

#!/bin/sh
SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
echo "El servicio $SERVICE esta ejecutandose"
else
echo "Chanfle! El servicio $SERVICE esta detenido"
fi

Crea un ficheiro de bloqueo

Ás veces temos que asegurarnos de que o script non se executa dúas ou máis veces simultaneamente. Para iso podemos facer uso dos ficheiros de bloqueo. Esta é unha versión sinxela dun script que nos permite facer isto:

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if [ ! -e $lockfile ]; then
touch $lockfile
echo "hago muchas cosas importantes aqui"
rm $lockfile
else
echo "ya hay otro proceso corriendo"
fi

Neste caso, compróbase que o ficheiro o que sexa.lock existir. No caso de que exista, o script NON executa as súas tarefas. Se non existe, crea o ficheiro, executa as tarefas que precisa executar e elimínao. Pero isto non é totalmente fiable. Que pasaría se mentres se executa o noso script péchase bruscamente?

Nese caso o ficheiro de bloqueo non se eliminaría e, polo tanto, non nos permitiría executar de novo o script. Para cubrir eses casos, poderiamos facer uso do comando trap que nos permite executar comandos no caso de que o noso script remate inesperadamente. Esta é unha versión máis avanzada que tamén garda o PID do script que o executa dentro do ficheiro de bloqueo:

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
echo "hago muchas cosas aqui tranquilamente"
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Ya hay otro proceso de este script ejecutandose"
echo "corriendo con el PID: $(cat $lockfile)"
fi

Comprendamos un pouco mellor o comando trampa. A súa sintaxe é basicamente esta: sinal de comando trap [sinal ...]; onde o sinal é o sinal de terminación que desexa capturar. Se desexa ver unha lista de sinais dispoñibles, pode executar o comando kill -l. Para o caso anterior, empregáronse os sinais INT (captura a terminación producida por un Ctrl + c), PRAZO (terminación producida polo comando kill) e EXIT (terminación normal dun script, ben porque xa non hai máis liñas que executar ou porque se atopa co comando exit).

Menú de opcións

Para facer un menú onde permitamos ao usuario seleccionar unha serie de opcións podemos usar o seguinte esquema:

#!/bin/bash
clear
while :
do
echo " Escoja una opcion "
echo "1. quien soy?"
echo "2. cuanto espacio tengo"
echo "3. que es esto?"
echo "4. Salir"
echo -n "Seleccione una opcion [1 - 4]"
read opcion
case $opcion in
1) echo "este eres:";
whoami;;
2) echo "tienes esto";
df;;
3) uname -r;;
4) echo "chao";
exit 1;;
*) echo "$opc es una opcion invalida. Es tan dificil?";
echo "Presiona una tecla para continuar...";
read foo;;
esac
done

Solicite confirmación antes de executar un script

Ás veces é útil que o usuario confirme a execución dun lote de instrucións, é dicir, a mensaxe típica que lle pide ao usuario que escriba si ou non. Podemos facelo así:

#!/bin/bash
while true; do
echo
read -p "esta seguro de hacer lo que sea que vaya a hacer " yn
case $yn in
yes ) break;;
no ) exit;;
* ) echo "por favor responda yes o no";;
esac
done
echo "si se ejecuta esto es que aceptaste"

Fin do artigo. Simplemente xenial 😀

Editar: Hai que ter coidado cos espazos e as lapelas, que por algún motivo non saen ¬¬


O contido do artigo adhírese aos nosos principios de ética editorial. Para informar dun erro faga clic en aquí.

22 comentarios, deixa os teus

Deixa o teu comentario

Enderezo de correo electrónico non será publicado. Os campos obrigatorios están marcados con *

*

*

  1. Responsable dos datos: Miguel Ángel Gatón
  2. Finalidade dos datos: controlar SPAM, xestión de comentarios.
  3. Lexitimación: o seu consentimento
  4. Comunicación dos datos: os datos non serán comunicados a terceiros salvo obrigación legal.
  5. Almacenamento de datos: base de datos aloxada por Occentus Networks (UE)
  6. Dereitos: en calquera momento pode limitar, recuperar e eliminar a súa información.

  1.   KZKG ^ Gaara dixo

    Carallo son xeniais O_O ... axudará moito ás miñas pequenas cousas que fago en Bash 😀

  2.   ren434 dixo

    Os guións son estupendos. Que gran contribución en serio, só o que estaba a buscar.

    PD: o foro está caído.

    1.    KZKG ^ Gaara dixo

      Si, o servidor no que está montado o foro está fóra de liña, nin idea de por que ... escribimos un correo electrónico ao amigo que se encarga diso, para ver que nos responde 🙂

      Saúdos.

  3.   ren434 dixo

    Ben, esperemos que non sexa nada grave.

  4.   zurdo dixo

    Esa "palla" tamén se incluíu en Code Ninja? XD

  5.   taregón dixo

    Gústame o poder de bash they e dixéronme para que servía a linguaxe C ... ben, no script de shell hai moitos comandos familiares.

  6.   Christopher dixo

    Grazas, gustoume moito

  7.   folla de anxo dixo

    A validación dos parámetros de entrada é moi útil. Non sabía como facer os menús =)

  8.   Hyuuga_Neji dixo

    Estupendo ... agora podo darlle algo de "dureza" ao meu guión churros jejeje

  9.   corvo dixo

    Un gran pracer ver como o noso humilde traballo en CodeNinja serve á comunidade internacional de Linux

    1.    KZKG ^ Gaara dixo

      Por suposto! 🙂
      Todo é para axudar e contribuír xuntos, e non para crear lapas, non? 😉

  10.   Diego dixo

    O script de proceso que se está executando podería mellorarse un pouco poñendo a opción de escoller o proceso que desexa saber, sería algo así:

    #! / bin / bash
    eco "Escolla un servizo"
    ler SERVIZO
    # SERVICE = 'MySQL'
    se ps ax | grep -v grep | grep $ SERVIZO> / dev / null
    logo
    echo "O servizo $ SERVICE está en execución"
    outro
    echo "O servizo $ SERVICE está parado"

  11.   Xua Carlos C dixo

    Son moi práctico cos teus scripts, pero estou a buscar un script especial para solucionar un problema que teño, que é o seguinte: Temos un servidor de aplicacións na empresa que os usuarios internos acceden a el por telnet e executan unha aplicación especial iso é limitado Para as licenzas, os usuarios abusan e abren máis dunha telnet para facerse con dúas ou máis licenzas, entón o script que pensei é que, mediante algún método, comprobar que proceso de telnet está inactivo durante máis de 2 horas e, polo tanto, envíe unha matanza a ese pid, poderíasme axudar?

    1.    Diego dixo

      Instale o seguinte programa

      aptitude instalar autolog

      E o ficheiro de configuración que tes en /etc/autolog.conf

  12.   Tito dixo

    Estupendo, amigo, podo facerche unha pregunta, necesito un script de shell con opcións e baseino nas túas e funciona moi ben, pero unha das opcións é enviar correos electrónicos (usando postifix), pide asunto, texto e destinatarios na pantalla e que se envía e comprobo que se enviou correctamente, co mailq podo ver a cola e ver se se enviou, pero como envío os correos electrónicos por comando usando as variables que recibiron asunto, texto e destinatarios ? 🙁

    1.    KZKG ^ Gaara dixo

      Escribe ao meu correo electrónico (kzkggaara [en] desdelinux [punto] net) para falar con máis tranquilidade, axudareiche con pracer 🙂

      1.    Tito dixo

        Moitas grazas amigo, pasaches!

  13.   Fer dixo

    Ola ben.
    Atopei estes excelentes exemplos xusto cando precisaba un menú.
    Comeceino e non podo facelo funcionar (nos pasos anteriores).
    Teño 247 elementos, que se refiren aos diferentes dominios territoriais.
    O que necesito é un menú onde escoller o país:
    #! / bin / bash
    limpar
    mentres:
    do
    eco »Escolla o país para probar»
    eco «1. Afganistán (AF) »
    eco «2. Albania (AL) »
    eco «3. Alemaña (DE) »
    eco «5. Angola (AO) »
    eco «6. Anguilla (AI) »
    .. e continúa ata o 247

    echo -n "Selecciona unha opción [1 - 247]"
    opción de ler
    case $ opción en
    1) fai eco de "este es ti:"; whoami ;;
    2) fai eco "tes isto"; df ;;
    3) eco ""; uname -r ;;
    4) eco "bye"; saída 1 ;;
    5) fai eco de "este es ti:"; whoami ;;
    6) fai eco de "este es ti:"; whoami ;;
    ... E continúa ata o 247
    *) echo «$ opc é unha opción non válida. É tan difícil? ";
    eco "Preme unha tecla para continuar ...";
    ler foo ;;
    que C
    feito

    O comportamento é o seguinte:
    Calquera opción excepto 4, que é a saída, elimina o número introducido e agarda por un novo número.
    A entrada 4 sae.
    Se poño o código 4 en calquera outra liña (digamos 150) sae igual sen problemas.
    Tamén tente poñer o código neste formato:
    151) fai eco de "isto que es:";
    quen son ;;
    co mesmo resultado.
    Pregúntome se hai mellores opcións para un menú tan longo e por suposto tamén o estou facendo mal.
    Unha axuda sería moi agradecida, grazas

  14.   Só Raúl dixo

    excelente ... paréceme moi ben meterse na cuncha

    grazas

  15.   marcos dixo

    xenial, ei como podo facer que o meu bash funcione cun ficheiro
    exemplo:

    upload.sh fotodelavecina.jpg

    pensando que o meu script bash "upload.sh" ten a información de acceso ao meu ftp

    saúdos e grazas 😀

  16.   Netzulo ntx dixo

    Bo home, moitas grazas por todos os scripts, montei un servidor CentOS e non sabes o ben que me chegan estes modelos, ponte en contacto comigo por correo electrónico. Quero propoñerche algo

  17.   Gabriel Balderramos dixo

    Por que usas read foo cando fas un menú? respostas rápidas que necesito