lunes, 30 de noviembre de 2009

Programación shell script bash

Ejemplos programación en bash

Voy a mostrar unos shell scripts, que son muy simples pero que son 100% funcionales, por todo ello que creo que su valor es muy grande.

Convertir a mp3

- Un script "mu chorra" que me convierte las pistas de un CD de audio a archivos MP3:

#!/bin/sh
cd paranoia -vsZB

for f1 in *.wav;
do
f2=`echo "$f1" | cut -d '.' -f 1`;
lame -f "$f2.cdda.wav" "$f2.mp3";
done

rm *.wav

Otro script "complicado" que me permite escuchar las radios más usuales para mi:

Escuchar radio online

#!/bin/sh
function Emisora
{
clear
echo " 1 = Los 40 Principales 2 = RNE Radio 1"
echo " 3 = RNE Radio Clasica 4 = RNE Radio 3"
echo " 5 = MASFMBEGASTRI 0=Salir"
echo
echo ""
echo
echo "Pulsa Ctrl + C para salir de la emisora y elegir una nueva"
echo "0 , Para abandonar el programa"
echo
# echo "Las tildes y caracteres especiales han sido elimina-"
# echo "dos a proposito para una correcta visualizacion."
# echo
echo -n "Numero de Emisora a escuchar: "
read choice

# **********************

reproductor="mplayer -cache 256"

# **********************

if [ $choice -eq 1 ] ; then
# 1.Los 40 Principales
$reproductor http://66.175.96.10/co40p

elif [ $choice -eq 2 ] ; then
# 2.RNE Radio 1
mplayer -playlist http://radio1.rtve.stream.flumotion.com/rtve/radio1.mp3.m3u

elif [ $choice -eq 3 ] ; then
# 3.RNE Radio Clasica
mplayer -playlist http://radioclasica.rtve.stream.flumotion.com/rtve/radioclasica.mp3.m3u

elif [ $choice -eq 4 ] ; then
# 4.RNE Radio 3
mplayer -playlist http://radio3.rtve.stream.flumotion.com/rtve/radio3.mp3.m3u

elif [ $choice -eq 5 ] ; then
# 5.MASFMBEGASTRI
$reproductor  mms://62.37.237.34/masfmbegastri
elif [ $choice -eq 0 ] ; then
exit 0
else echo "Esa cadena no existe"
fi
Emisora
}

Emisora

Como ya he dicho al principio, estos scrips solo son la punta del iceberg pero que me han hecho ver la potencia de los shell script.

Aquí otro ejemplo de una agenda programada en bash:

Agenda

#!/bin/bash

FICHERO="listado.txt"

function Menu
{
   echo "_____________MENU_____________"
   echo ""
   echo "   1. Introducir Contacto"
   echo "     2. Buscar Contacto"
   echo "     3. Listar Contactos"
   echo "   4. Tamanio de la Agenda"
   echo "         5. Salir"
}

function Introducir
{
   if [ -e "listado.txt" ]; then  # Si el fichero existe...
      echo "Introduzca datos de la persona: "
      read -p "Nombre:" NOMBRE
      read -p "Primer apellido: " APELLIDO1
      read -p "Segundo apellido: " APELLIDO2
      read -p "Telefono: " TELEFONO
      read -p "Edad: " EDAD
      # Redireccionamos los datos introducidos al fichero de la agenda
      echo "$NOMBRE:$APELLIDO1:$APELLIDO2:$TELEFONO:$EDAD" >> $FICHERO
   else
      # Si no existe el fichero, damos el mensaje de error...
      echo "No se ha podido acceder al archivo de listado!"
   fi
 
   echo
}

function Buscar
{  
   if [ -s $FICHERO ]; then
      echo "Introduzca datos de la persona a buscar: "
      read -p "Nombre: " NOMBRE
      read -p "Primer apellido: " APELLIDO1
 
      DATOS="$NOMBRE:$APELLIDO1"  # Metemos en DATOS nuestra busqueda
      SALIDA=$(grep "$DATOS" $FICHERO)  # Con grep asigna a salida el contenido de la linea
      echo -e "${SALIDA//:/n}"  # Cambiamos el caracter ":" por saltos de linea "n"
   else
      echo "El fichero no existe o no contiene entradas en la agenda"
   fi
}

function Listar
{
   if [ -s $FICHERO ]; then  # Si existe el fichero y contiene datos
      for linea in $(cat $FICHERO)  # Recorremos cada linea del fichero
      do
         echo "__________________"
         echo -e "${linea//:/n}"  # Sacamos la linea con formato
         echo "__________________"
         echo ""
         echo "Pulse una tecla..."
         read
      done
   else
      echo "No existen datos en la agenda"
   fi
}

function Tamanyo
{
   echo "Tamanyo en bloques (bloques * 32bytes)"
   echo "______________________________________"
   echo "$(ls --size $FICHERO)"
   echo ""
}

opc=0
salir=5

while [ $opc -ne $salir ];  # Mientras el valor de $opt es distinto del valor de $salir...
do  
   clear
   Menu  # Dibujamos el menu en pantalla
   read -p "Opcion:..." opc  # Escogemos la opcion deseada
     
   if [ $opc -ge 1 ] && [ $opc -le 5 ]; then  # No se por que no funciona el rango...!!!!!!!!!!!!!!!!!!!!!!
      clear
      case $opc in   # Acciones para las diferentes opciones del menu

         1)Introducir  
            ;;      
       
         2)Buscar
            ;;

         3)Listar
            ;;

         4)Tamanyo
            ;;

         5)echo "Saliendo"  
            ;;
      esac
   else
      echo "No ha introducido una opcion correcta!!"
   fi
   echo "Pulse una tecla..."
   read
done

Cambiar dns e ip

#!/bin/bash

DNS="62.37.228.20"
DNS2="80.58.61.254"
USUARIO=$(whoami)
ROOT=root


if [ $USUARIO == $ROOT ]; then

echo nameserver $DNS > /etc/resolv.conf
echo nameserver $DNS2 >> /etc/resolv.conf
echo "" > /etc/network/interfaces
echo "auto eth1
 iface eth1 inet static
 address 192.168.1.101
 netmask 255.255.255.0" >> /etc/network/interfaces
exit 0
else
echo -e "e[31mejec
utar como ROOT" 
echo -e "33[0m" 
read
          exit 1
fi

Configurar servidor proxy

#!/bin/bash

FICHERO="servers"

function Menu
{
    echo "_____________MENU_____________"
       echo ""
       echo "     1. Introducir Servidor Proxy"
       echo "     2. Buscar Servidor Proxy"
       echo "     3. Listar Servidores Proxy"
       echo "     4. Establecer Servidor Proxy"
       echo "     5. Hacer Ping"
       echo "     6. Salir"
}

function Introducir
{
    if [ -e "servers" ]; then  # Si el fichero existe...
              echo "Introduzca url del servidor: "
              read -p "url:" URL
              echo "Introduzca el puerto del servidor: "
              read -p "puerto:" PUERTO
              echo "Introduzca el usuario del servidor: "
              read -p "usuario:" USER
              echo "Introduzca la contrasenya del servidor: "
              read -p "contrasenya:" PASS
              # Redireccionamos los datos introducidos al fichero de la agenda
              echo "$URL:$PUERTO:$USER:$PASS" >> $FICHERO
       else
              # Si no existe el fichero, damos el mensaje de error...
              echo "No se ha podido acceder al archivo de listado de servidores!"
       fi
  
}

function Buscar
{  
    if [ -s $FICHERO ]; then
            echo "Introduzca url del servidor a buscar: "
              read -p "url: " URL

  
              DATOS="$URL"  # Metemos en DATOS nuestra busqueda
              SALIDA=$(grep "$DATOS" $FICHERO)  # Con grep asigna a salida el contenido de la linea
              echo -e "${SALIDA//:/n}"  # Cambiamos el caracter ":" por saltos de linea "n"
       else
              echo "El fichero no existe o esta vacio"
       fi
}

function Listar
{
    if [ -s $FICHERO ]; then  # Si existe el fichero y contiene datos
            for linea in $(cat $FICHERO)  # Recorremos cada linea del fichero
        do
                    echo "__________________"
                 echo -e "${linea//:/n}"  # Sacamos la linea con formato
                 echo "__________________"
                echo ""
                echo "Pulse una tecla..."
                 read
              done
      else
            echo "El fichero no existe o esta vacio"
      fi
}

function Set
{
    if [ $(whoami) != "root" ]; then
            echo "Debes ser root para correr este script."
            echo "Para entrar como root, escribe "sudo su" sin las comillas."
            exit 1
    fi
    echo "Introduzca url del servidor: "
        read -p "url:" URL
        echo "Introduzca el puerto del servidor: "
        read -p "puerto:" PUERTO
        echo "Introduzca el usuario del servidor: "
        read -p "usuario:" USER
        echo "Introduzca la contrasenya del servidor: "
        read -p "contrasenya:" PASS
        export http_proxy=http://$USER:$PASS@$URL:$PUERTO
}

function Ping
{
   
      echo "Introduzca url del servidor a alcanzar: "
        read -p "url:" URL2
    ping $URL2
}

function Ver
{
    cat /etc/environment
}
   
opc=0
salir=6

while [ $opc -ne $salir ];  # Mientras el valor de $opt es distinto del valor de $salir...
do  
    clear
       Menu  # Dibujamos el menu en pantalla
       read -p "Opcion:..." opc  # Escogemos la opcion deseada
     
       if [ $opc -ge 1 ] && [ $opc -le 7 ]; then  # No se por que no funciona el rango...!!!!!!!!!!!!!!!!!!!!!!
              clear
             case $opc in   # Acciones para las diferentes opciones del menu

                 1)Introducir 
                    ;;     
        
                 2)Buscar
                    ;;

            3)Listar
                    ;;

                 4)Set
                   ;;

         &nbsp
;  5)Ping
                   ;;
          
            6)Ver
            ;;

                 7)echo "Saliendo" 
                    ;;
              esac
       else
              echo "No ha introducido una opcion correcta!!"
       fi
       echo "Pulse una tecla..."
       read
done
   

miércoles, 4 de noviembre de 2009

Servidor FTP en ubuntu

Servidor FTP ubuntu 

- Lo primero es instalar el demonio del servidor FTP:

sudo apt-get install vsftpd.

Bien, ya tenemos totalmente operativo nuestro servidor FTP y podemos conectarnos  por medio de cualquier cliente FTP:

Como ya he dicho vamos a modificar el archivo de configuración de nuestro servidor FTP para que se establezca la conexión por cuentas de usuario:

- Para lo cual tipeamos en una consola:

sudo nano /etc/vsftpd.conf

  • Primero definimos la carpeta compartida:
anon_root=/home/antonio/ftp
  • Para que el servidor se inicie con el sistema:
 Listen=YES
  • Para no permitir usuarios anónimos, cambiamos la linea:
anonymous_enable=YES 
  • En caso de que esta variable la hubierais puesto a anonymous_enable=NO.:
  •  Crear usuario:
sudo adduser –home /home/antonio/ftp –no-create-home –shell /bin/bash user1
  • Asignar user1 al grupo ftp:
sudo addgroup user1 ftp
  • Para permitir al usuario que acceda al servidor FTP escribir en el directorio compartido, siempre y cuando tenga permisos en la carpeta compartida:
write_enable=YES
  • Esto linea permitirá acceder al sistema usuarioslocales.

     local_enable=YES. Esto linea permitirá acceder al sistema usuarios
locales.
  • Esta linea permite o no el acceso de usuarios locales a sus respectivas carpetas privadas
chroot_local_user=YES, para permitir acceso
chroot_local_user=NO, para denegar  acceso
  • En en caso de que esta opcion este a YES
chroot_list_file=/etc/vsftpd/chroot_list
sudo nano/etc/vsftpd/chroot_list, donde haremos una lista con los usuarios locales.
  •  Establecemos los permisos por defecto de los nuevos archivos que suban los usuarios.
local_umask=022 
- Tras lo que iniciaremos el demonio para que el servidor FTP tome los cambios:

sudo service vsftpd start

Aunque el servidor quedaría totalmente operativo, faltaría por configurar la seguridad. Servidor FTP con soporte SSL.


Breve introdución al shell de linux


 Breve introducción al shell de linux

Manejar usuarios en linux

- Para añadir usuarios:
adduser, pudiendo pasar parámetros:
-p “password” (se podrá hacer posteriormente con el comando passwd “usuario”.
      -u “uid”(identificador único de usuario”.
-g “grupo primario”.
-G “grupos secundarios separados por comas”.
-d “especifica el directorio home”.
-s “especifica el shell que utilizara el usuario”.
-c “comentario acerca del usuario”
- Para borrar usuarios: userdel, pudiendo pasar como parámetros:
-r, para borrar el home del user.
- Para modificar usuarios: usermod, aplicándole los mismos parámetros que cuando se añade un user.
- Para ver toda la información de todos los usuarios del sistema: vi /etc/passwd, siendo su estructura:
Columna
Significado
1
Login de unix.
2
x-> contraseña cifrada: /etc/shadow.
3
UID->identificador único de usuario.
4
GID-> identificador único de grupo primario.
5
Comentario: parámetro -c al crearlo.
6
home usuario.
7
Shell que usara el usuario.

- /etc/login.defs: contiene las políticas para las cuentas de usuario.
- /etc/default/useradd: contiene los valores por defecto del comando useradd.
- /etc/skel/: home por defecto cuando al crear un usuario no se especifica su home.
- Para deshabilitar cuentas de usuario temporalmente, tenemos dos opciones:
          1. Editar el archivo /etc/passwd y en la 7 cambiar el shell del usuario por /dev/null o /bin/false.
          2. Editar /etc/shandow y en la segunda columna dejar simplemente un asterisco.

Manejar grupos en linux

- groupadd, para añadir grupos, pudiendose pasar el parametro:
-g “gui” .
- groupmod, modificar usuarios, aplicándose el parametro -g.
- groupdel, borrar usuario.
- Un grupo no podrá contener a otro grupo.
- Para ver toda la información de todos los grupos del sistema: vi /etc/group, estando estructurado de la siguiente forma:
Columna
Significado
1
Nombre del grupo.
2
x-> no significa nada.
3
GID->identificador único de grupo.
4
Lista de usuarios que pertenecen a ese grupo.

Manejar servicios

- Se arrancaran al inicio todos los servicios incluidos en el directorio /etc/init.d/.
- Para añadir servicios /etc/init.d/-> ln -s /etc/rcX.d/nª servicio /etc/init.d/nº servicio y darle permisos de ejecucuión.
- Para manejar los servicios manualmente:
              1. start->iniciar servicios.
              2. stop->parar servicios.
              3. restart->reiniciar servicios
- Para que un servicio no se arranque al inicio->chmod -x “nº del servicio”.