Mostrando entradas con la etiqueta bash. Mostrar todas las entradas
Mostrando entradas con la etiqueta bash. Mostrar todas las entradas

sábado, 18 de febrero de 2012

Expulsar usuarios del sistema

En el caso de ser administrador de sistemas en Linux puede resultar útil un comando que permita expulsar a un usuario del sistema y, al mismo tiempo, bloquear accesos posteriores. Después de buscar de manera infructuosa si existía tal comando en el sistema, decidí crear un script que se adaptase a lo que necesitaba. Posteriormente encontré el comando slay, aunque sólo permitía eliminar los procesos de un usuario del sistema, no imperdirle el acceso. De todos modos, cuando lo descubrí ya había hecho el script que os dejo a continuación.


#!/bin/bash

set -u

#Comprobamos que se le pasa un parámetro al script (el nombre de usuario a expulsar)
if [ $# -eq 1 ]; then
  uid=`id -u $1 2> /dev/null`

  #Si el usuario existe en el sistema
  if [ -n $uid ]; then
    if [ $1 != "root" ]; then
      pkill -KILL -U $uid
      sed -i "s/$1/#$1/g"  /etc/passwd
      echo "Usuario $1 expulsado del sistema y bloqueado"
    else
      #Si intentamos expulsar al root
      echo  "¿Seguro que quieres abandonar el sistema? (s/n)"
      read salir
    
      if [ $salir = "s" ] || [ $salir = "S" ]; then
        #Expulsamos el usuario root
        pkill -KILL -U $uid
        sed -i "s/$1/#$1/q" /etc/passwd
      else
        #Terminamos el programa
        exit 0
      fi
    fi
  fi
fi

viernes, 8 de julio de 2011

Proyecto biblioteca (en Linux bash)


Para aprovechar algún tiempo que me sobró durante la realización del proyecto de la biblioteca, decidí realizar el mismo proyecto sobre la consola de un sistema Linux utilizando bash. Esto me ha permitido recordar un poco la sintaxis de este lenguaje de scripting, del que ya tenía algo de conocimientos. Además, hay que decir que la potencia de los lenguajes de script en la consola de Linux son mucho más potentes que la de MS-DOS.
Para ahorrar tiempo he tratado de traducir directamente los scripts de un lenguaje a otro. En algunos casos la semejanza entre los dos códigos es evidente pero en otros es completamente inexistente. Sin embargo, la lógica es la misma en los dos casos y por tanto los diagramas serían aplicables en los dos casos.


COMPROBAR EXISTENCIA DE DIRECTORIOS
#!/bin/bash
if [ ! -d "LIBROS" ]
then
mkdir LIBROS
fi
if [ ! -d "PRESTAMOS" ]
then
mkdir PRESTAMOS
fi
if [ ! -d "LISTADOS" ]
then
mkdir LISTADOS
fi

MENÚ
#!/bin/bash
./ComprobarDirs.sh

while [ false ]; do

clear
echo "1) Añadir libro"
echo "2) Prestar libro"
echo "3) Listar todos (ordenados por signatura)"
echo "4) Listar todos (ordenados alfabéticamente)"
echo "5) Listar prestados"
echo "6) Listar amigos con préstamos"
echo "7) Devolver libros"
echo "8) Buscar libro"
echo "9) Salir"

echo -e "Elija una opción: \c"
read opcion
echo "La opción elegida es: $opcion"

if [ $opcion -eq 1 ]; then
./AnadirLibro.sh
fi
if [ $opcion -eq 2 ]; then
./PrestarLibro.sh
fi
if [ $opcion -eq 3 ]; then
./ListarLibSig.sh
fi
if [ $opcion -eq 4 ]; then
./ListarLibAlf.sh
fi
if [ $opcion -eq 5 ]; then
./ListarLibPrest.sh
fi
if [ $opcion -eq 6 ]; then
./ListarAmigosPrest.sh
fi
if [ $opcion -eq 7 ]; then
./DevolverLibros.sh
fi
if [ $opcion -eq 8 ]; then
./BuscarLibro.sh
fi
if [ $opcion -eq 9 ]; then
exit
fi

done

AÑADIR LIBROS
#!/bin/bash

echo -e "\nIntroduzca la signatura del libro: "
read signatura
echo -e "\nIntroduzca el título: "
read titulo
echo -e "\nIntroduzca el nombre del autor: "
read autor

fichero="$signatura.lib"
echo -e "$titulo - $autor" > "LIBROS/$fichero"
echo -e "El libro ha sido incluido en la biblioteca"

read -p "Pulse para continuar..."


PRESTAR LIBROS
#!/bin/bash
echo -e "Introduzca el título del libro: "
read titulo
echo -e "Introduzca el nombre del autor: "
read nombreAutor
echo -e "Introduzca el nombre de su amigo: "
read nombreAmigo

fecha=`date +"%m/%d/%Y"`
echo -e "$titulo - $nombreAutor $fecha" > "PRESTAMOS/$nombreAmigo.pre"
echo -e "\nEl préstamo ha sido guardado"

read -p "Pulse para continuar..."

LISTAR LIBROS POR SIGNATURA
#!/bin/bash
if [ -f LISTADOS/ListadoLibrosSig.txt ]; then
rm LISTADOS/ListadoLibrosSig.txt
fi
for f in $( ls LIBROS/*.lib | sort ); do
# nombreLargo=${f%.*}
# nombre=${nombreLargo##*/}
lineaFichero=`cat $f`
titulo=${lineaFichero%-*}
#echo -e "$titulo"
echo -e "$titulo" >> LISTADOS/ListadoLibrosSig.txt
done

echo -e "\n******************************************"
echo -e "+++ LISTADO LIBROS POR SIGNATURA +++"
echo -e "******************************************"
cat LISTADOS/ListadoLibrosSig.txt

read -p "Pulse para continuar..."

LISTAR LIBROS ALFABÉTICAMENTE
#!/bin/bash
if [ -f LISTADOS/ListadoLibAlf.txt ]; then
rm LISTADOS/ListadoLibAlf.txt
fi

echo -e "************************************************"
echo -e "+++ LISTADO LIBROS ORDENADOS ALFABÉTICAMENTE +++"
echo -e "************************************************"
for f in $( ls LIBROS/*.lib ); do
lineaFichero=`cat $f`
titulo=${lineaFichero%-*}
echo -e "$titulo" >> LISTADOS/ListadoLibAlf.txt
done
cat LISTADOS/ListadoLibAlf.txt | sort > kk.tmp
mv kk.tmp LISTADOS/ListadoLibAlf.txt
cat LISTADOS/ListadoLibAlf.txt

read -p "Pulse para continuar..."

LISTAR AMIGOS CON PRÉSTAMOS
#!/bin/bash
if [ -f LISTADOS/ListadoAmigosPrest.txt ]; then
rm LISTADOS/ListadoAmigosPrest.txt
fi

for f in $( ls PRESTAMOS/*.pre | sort ); do
ruta=${f##*/}
nombreAmigo=${ruta%.*}
echo -e "$nombreAmigo" >> LISTADOS/ListadoAmigosPrest.txt
done

echo -e "\n**************************************************"
echo -e "+++ LISTADO ALFABÉTICO DE AMIGOS CON PRÉSTAMOS +++"
echo -e "**************************************************"

cat LISTADOS/ListadoAmigosPrest.txt

read -p "Pulse para continuar..."

DEVOLVER LIBROS
#!/bin/bash
#Obtenemos el nombre del amigo que devuelve los libros y eliminamos del
#directorio PRESTAMOS el archivo cuyo nombre se corresponede con el de
#dicho amigo
echo -e "Introduzca el nombre del amigo: "
read amigo

if [ -f "PRESTAMOS/$amigo.pre" ]; then
rm "PRESTAMOS/$amigo.pre"
echo -e "Los libros han sido devueltos"
else
echo -e "El amigo no existe o no tiene libros prestados\n"
fi
read -p "Pulse para continuar..."

BUSCAR LIBROS
#!/bin/bash
echo -e "Introduzca el título a buscar: "
read tituloBuscado

cat LIBROS/*.lib |grep "$tituloBuscado" >temp.tmp
encontrado=`stat -c%s "temp.tmp"`

if [ $encontrado -eq 0 ]; then
echo -e "No se ha encontrado el libro indicado\n"
else
echo -e "El libro se encuentra en la biblioteca\n"
fi
rm temp.tmp
read -p "Pulse para continuar..."