Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/alterser/public_html/foros/Sources/Subs.php on line 3847

Notice: Trying to access array offset on value of type null in /home/alterser/public_html/foros/Sources/Load.php on line 168

Deprecated: Function create_function() is deprecated in /home/alterser/public_html/foros/Sources/Load.php on line 178

Deprecated: Function create_function() is deprecated in /home/alterser/public_html/foros/Sources/Load.php on line 183

Deprecated: Function create_function() is deprecated in /home/alterser/public_html/foros/Sources/Load.php on line 184

Deprecated: Function create_function() is deprecated in /home/alterser/public_html/foros/Sources/Load.php on line 220

Deprecated: Function create_function() is deprecated in /home/alterser/public_html/foros/Sources/Load.php on line 223

Deprecated: Function create_function() is deprecated in /home/alterser/public_html/foros/Sources/Load.php on line 235

Deprecated: Function create_function() is deprecated in /home/alterser/public_html/foros/Sources/Load.php on line 250

Deprecated: Function create_function() is deprecated in /home/alterser/public_html/foros/Sources/Load.php on line 268
Intro-Tutorial Programación Bash Scripting

  Intro-Tutorial Programación Bash Scripting

Desconectado Zero

  • Jr. Member
  • **
  • Mensajes: 78
  • Ubicación:
    • Ver Perfil
  • Me Gusta: 0
Intro-Tutorial Programación Bash Scripting
« : septiembre 23, 2013, 08:17:22 pm »
Hola Todos,

En esta oportunidad comparto con ustedes la primera parte de un tutorial en pdf de mi autoría, hubiese querido publicarlo en el foro directamente, pero debido al error que está presentando el mismo, con relación a algunas palabras entonces ni modo.
Este documento es algo así como una "edición especial" ya que en el original le había dado otro enfoque.

Tutorial Introduccion a la Programacion Bash Scripting Parte 1

Abrazos,



Lelouch
PDATA: Este tutorial puede que para el sysadmin promedio le parezca una completa pavada, pero está pensado para ser una guia para aquellos que recién ingresan a la programación en bash scripting.
Tutorial original: (cambia el enfoque): Aquí
En GNU/Linux formatear por cualquier cosa es de noobs, tu decides si eres uno...

Desconectado firecold

  • Moderador
  • *
  • Mensajes: 3444
  • Ubicación: Guatemala
  • Todo lo puedo en Cristo que me fortalece.
    • Ver Perfil
  • Me Gusta: 30
Re:Intro-Tutorial Programación Bash Scripting
« Respuesta #1 : septiembre 23, 2013, 09:13:27 pm »
Muy bueno amigo, la verdad me parece interesantisimo, he estado estudiando ultimamente esto y me servira mucho para repasar y aprender mas trucos, gracias amigo lelouch, Saludos

Desconectado firecold

  • Moderador
  • *
  • Mensajes: 3444
  • Ubicación: Guatemala
  • Todo lo puedo en Cristo que me fortalece.
    • Ver Perfil
  • Me Gusta: 30
Re:Intro-Tutorial Programación Bash Scripting
« Respuesta #2 : noviembre 13, 2013, 09:23:15 pm »
Gracias amigo Zero, gracias a tu Tutorial empeze a probar como hacer scripts, gracias a esto hice estos dos scripts, te muestro para ver si me puedes dar sugerencias:

Código:
  1. #!/bin/bash
  2. clear
  3. echo "|=====================================================================|"
  4. echo ""
  5. echo "       _            __  __  _____ "
  6. echo "      | |          |  \/  |/ ____|"
  7. echo "      | | ___   ___| \  / | |  __ "
  8. echo "  _   | |/ _ \ / _ \ |\/| | | |_ |"
  9. echo " | |__| | (_) |  __/ |  | | |__| |"
  10. echo "  \____/ \___/ \___|_|  |_|\_____|"
  11. echo ""
  12. echo "+=====================================================================+"
  13. echo "|                     ACTUALIZACION Raptor 1.04b                      |"
  14. echo "|                            ;Debian 6 Y 7                             |"
  15. echo "|                              64 bits                                |"
  16. echo "+=====================================================================+"
  17. echo ""
  18. V='|------------------------------> V.64 <-------------------------------|'
  19. ER='ERROR, su version de linux no es de 64 bits'
  20. ER2='Use el script adecuado para su version'
  21. P=`uname -m`
  22. if [ $P = x86_64 ] ; then
  23.    echo $V
  24. else
  25.    echo $ER
  26. echo ""
  27.    echo $ER2
  28. echo ""
  29. exit 0
  30. fi
  31. echo ""
  32. echo Pulsa Enter para Acceder al Menu
  33. read -n 0 -ers
  34.  
  35. COMANDO1=("CACHE_DIR /raptorcache/\nPLUGINS_DIR /etc/raptor/plugins/\nCACHE_LIMIT 90\nNO_DOMAIN1 youtube_mp4v\nNO_DOMAIN1 youtube_mp4a\n#-----------------------------------------------------------\n#Minimo y maximo tamaño de archivos en cache global\n#-----------------------------------------------------------\nMIN_OBJECT_SIZE 2048\n#-----------------------------------------------------------\n#Minimo y maximo tamaño de archivos en cache por Dominios\n#-----------------------------------------------------------\n#MIN_SIZE_YTIMG 2048\n#MAX_SIZE_YTIMG 0\n#-----------------------------------------------------------\n#Minimo y maximo tamaño de archivos en cache por Extensiones\n#-----------------------------------------------------------\nMIN_SIZE_JPG 2048\nMAX_SIZE_JPG 0\n#\nMIN_SIZE_JPEG 2048\nMAX_SIZE_JPEG 0\n#\nMIN_SIZE_PNG 2048\nMAX_SIZE_PNG 0\n#\nMIN_SIZE_GIF 2048\nMAX_SIZE_GIF 0\n#\nMIN_SIZE_FLV 2048\nMAX_SIZE_FLV 0\n#\nMIN_SIZE_CACHEPART 2048\nMAX_SIZE_CACHEPART 0\n#\nMIN_SIZE_MP3 2048\nMAX_SIZE_MP3 0\n#\nMIN_SIZE_MP4 2048\nMAX_SIZE_MP4 0\n#\nMIN_SIZE_SWF 2048\nMAX_SIZE_SWF 0\n#\nMIN_SIZE_EXE 2048\nMAX_SIZE_EXE 0\n#\nMIN_SIZE_BIN 2048\nMAX_SIZE_BIN 0\n#\nMIN_SIZE_DAT 2048\nMAX_SIZE_DAT 0\n#\nMIN_SIZE_TXT 2048\nMAX_SIZE_TXT 0\n#\nMIN_SIZE_DAT 2048\nMAX_SIZE_DAT 0\n#\nMIN_SIZE_DLL 2048\nMAX_SIZE_DLL 0\n#\nMIN_SIZE_CAB 2048\nMAX_SIZE_CAB 0\n#\nMIN_SIZE_MSI 2048\nMAX_SIZE_MSI 0\n#\nMIN_SIZE_MSP 2048\nMAX_SIZE_MSP 0\n#\nMIN_SIZE_MSU 2048\nMAX_SIZE_MSU 0\n#\nMIN_SIZE_PSF 2048\nMAX_SIZE_PSF 0\n#\nMIN_SIZE_DSTF 2048\nMAX_SIZE_DSTF 0\n#\nMIN_SIZE_XPI 2048\nMAX_SIZE_XPI 0\n#\nMIN_SIZE_ZIP 2048\nMAX_SIZE_ZIP 0\c")
  36.  
  37. COMANDO2=("http.*\.googlevideo\.com.*videoplayback\v")
  38.  
  39. ##############################
  40. # Genera un menú de opciones #
  41. ##############################
  42. clear;
  43. while [$OPCION!= 7 ]
  44. do
  45. echo####################################################################”
  46. echo[1] Actualizar Debian”
  47. echo[2] Instalar actualizacion de Raptor 1.04b a Debian 6
  48. echo[3] Instalar actualizacion de Raptor 1.04b a Debian 7
  49. echo[4] Eliminar y editar el contenido de Raptor.conf”
  50. echo[5] Reiniciar Servicios Raptor y Squid”
  51. echo[6] Agregar Plugins y Regex Googlevideo y Youtube”
  52. echo[7] Salir”
  53. echo####################################################################”
  54. read -p “Elija_una_opción:” OPCION
  55. case $OPCION in
  56. 1) sudo apt-get update && sudo apt-get upgrade;clear;
  57. echo “ACTUALIZACION DEL SISTEMA REALIZADA”;;
  58. 2) sudo wget http://www.raptorcache.com/install/update/bin64/raptor_104b_64_d6.tar.gz && sudo rm -rf /usr/sbin/raptor && sudo mv raptor_104b_64_d6.tar.gz /tmp && sudo tar -xzvf /tmp/raptor_104b_64_d6.tar.gz -C / && sudo chmod a+x /usr/sbin/raptor;;
  59. 3) sudo wget http://www.raptorcache.com/install/update/bin64/raptor_104b_64_d7.tar.gz && sudo rm -rf /usr/sbin/raptor && sudo mv raptor_104b_64_d7.tar.gz /tmp && sudo tar -xzvf /tmp/raptor_104b_64_d7.tar.gz -C / && sudo chmod a+x /usr/sbin/raptor;;
  60. 4) sudo rm /etc/raptor/raptor.conf && sudo touch /etc/raptor.conf;
  61. sudo echo -e $COMANDO1 >> /etc/raptor/raptor.conf && sudo chmod 777 /etc/raptor/raptor.conf;;
  62. 5) sudo service raptor restart && sudo service squid3 restart;;
  63. 6) sudo wget http://www.raptorcache.com/install/update/plugins/64/googlevideo_youtube.tar.gz && mv googlevideo_youtube.tar.gz /tmp && sudo tar -xzvf /tmp/googlevideo_youtube.tar.gz -C / && sudo chmod 777 /etc/raptor/plugins/youtube.com.so && sudo chmod 777 /etc/raptor/plugins/googlevideo.com.so && sudo echo -e $COMANDO2 >> /etc/raptor/raptor.lst;;
  64. 7) clear; echo “Hasta Luego”; break;;
  65. *) clear; echo “Opción ingresada invalida, intentelo de nuevo”;;
  66.  
  67. esac
  68. done
  69. exit 0

Código:
  1. #!/bin/bash
  2. clear
  3. echo "|=====================================================================|"
  4. echo ""
  5. echo "       _            __  __  _____ "
  6. echo "      | |          |  \/  |/ ____|"
  7. echo "      | | ___   ___| \  / | |  __ "
  8. echo "  _   | |/ _ \ / _ \ |\/| | | |_ |"
  9. echo " | |__| | (_) |  __/ |  | | |__| |"
  10. echo "  \____/ \___/ \___|_|  |_|\_____|"
  11. echo ""
  12. echo "+=====================================================================+"
  13. echo "|                    AGREGAR DISCOS DUROS CON LVM2                    |"
  14. echo "|                     Debian, Ubuntu y Derivados                      |"
  15. echo "|                       Cualquier Arquitectura                        |"
  16. echo "|                            Alterserv.com                            |"
  17. echo "+=====================================================================+"
  18. echo ""
  19. echo Pulsa Enter para Acceder al Menu
  20. read -n 0 -ers
  21. ##############################
  22. # Genera un menú de opciones #
  23. ##############################
  24. clear;
  25. function main_menu()
  26. {
  27. while :
  28. do
  29. echo####################################################################”
  30. echo[1] Instalar Lvm2”
  31. echo[2] Identificacion y Creacion de Particion Lvm2”
  32. echo[3] Crear Grupos y Volumenes para Lvm2”
  33. echo[4] Formato de Particion Lvm2 en Ext4”
  34. echo[5] Edicion de Fstab, Creacion y Elecion de Carpeta a Montar Particion”
  35. echo[6] Montar Particion”
  36. echo[7] Agregar Mas de un DD a Thunder o Raptor - Sub-Menu”
  37. echo[8] Salir”
  38. echo####################################################################”
  39. read -p “Elija_una_opción:” OPCION
  40. case $OPCION in
  41. 1) sudo apt-get install lvm2;;
  42. 2) sudo fdisk -l | grep Disco;
  43. echo “Elegir el Disco Duro a Crear con Lvm2 - Ej: /dev/sdb1”;
  44. read DD1;
  45. sudo fdisk $DD1;;
  46. 3) sudo pvcreate $DD1 && sudo vgcreate /dev/vg0 $DD1 && sudo vgdisplay;
  47. echo “Asignar Tamaño de Particion - Ej: 931,51GB:” | grep 931,51GB;
  48. read TAM;
  49. sudo lvcreate -L $TAM -n lv0 /dev/vg0;
  50. echo “Creados el Grupo y el Volumen para Lvm2”;;
  51. 4) sudo mke2fs -t ext4 /dev/vg0/lv0;
  52. echo “TERMINADO EL FORMATO A PARTICION”;;
  53. 5) echo -e “Elegir Carpeta a Montar - Ej: /thunder o /raptorcache:” | grep -e "/thunder" -e "/raptorcache";
  54. read CARPETA;
  55. sudo mkdir -p $CARPETA;
  56. sudo chmod 777 -Rf $CARPETA;
  57. sudo echo >> /etc/fstab;
  58. sudo echo -e /dev/mapper/vg0-lv0   $CARPETA    ext4    noatime,async,nosuid   0      0 >> /etc/fstab;;
  59. 6) sudo mount $CARPETA;;
  60. 7) sub_menu ;;
  61. 8) clear; echo “Hasta Luego”; exit 0;;
  62. *) clear; echo “Opción ingresada invalida, intentelo de nuevo”;;
  63. esac
  64. done
  65. }
  66.  
  67. function sub_menu()
  68. {
  69. while :
  70. do
  71. echo####################################################################”
  72. echo[1] Identificacion y Creacion de Particion Lvm2”
  73. echo[2] Grupos y Volumenes que se Sumaran”
  74. echo[3] Aumentar al Tamaño Final”
  75. echo[4] Volver al Menu Principal”
  76. echo[5] Salir”
  77. echo####################################################################”
  78. read -p “Elija_una_opción:” OPCION
  79. case $OPCION in
  80. 1) sudo fdisk -l | grep Disco;
  81. echo “Elegir el Disco Duro a Crear con Lvm2 - Ej: /dev/sdb1”;
  82. read DD2;
  83. sudo fdisk $DD2;;
  84. 2) sudo pvcreate $DD2 && sudo vgextend vg0 $DD2 && sudo vgdisplay;
  85. echo “Asignar Tamaño que se Sumara a la Particion - Ej: 931,51GB:” | grep 931,51GB;
  86. read TAM1;
  87. sudo lvextend -L +$TAM1 /dev/mapper/vg0-lv0;
  88. echo “Agregados Grupos y Volumenes a Lvm2”;;
  89. 3) sudo resize2fs /dev/mapper/vg0-lv0;;
  90. 4) main_menu;;
  91. 5) clear; echo “Hasta Luego”; exit 0;;
  92. *) clear; echo “Opción ingresada invalida, intentelo de nuevo”;;
  93. esac
  94. done
  95. }
  96.  
  97. main_menu
  98.  
  99. exit 0

Saludos

Desconectado Zero

  • Jr. Member
  • **
  • Mensajes: 78
  • Ubicación:
    • Ver Perfil
  • Me Gusta: 0
Re:Intro-Tutorial Programación Bash Scripting
« Respuesta #3 : noviembre 14, 2013, 12:04:40 pm »
Buen aporte filecold, recomendaciones tengo 2:
1. Usa funciones
2. las variables COMANDO# son muy largas (no tiene nada de malo, pero dificulta el mantenimiento y la lectura)

En lo personal no soy muy amigo de usar tantos && en la misma línea.

No hay necesidad de crear un script de 32 y otro de 64, te dejo un ejemplo de instalador/desinstalador:

PDTA: En un rato veo el segundo ;)

Código: [Seleccionar]
#!/bin/sh
addon_name="GurenMK I v1(ALPHA3.7)"
icon_file=""
info_file=""
file_32="http://goo.gl/8WBBm"
file_64="http://goo.gl/Fqrpq"
file_struct="http://dl.dropbox.com/u/60088540/addons/guren/guren.tar.gz"
index_file="http://goo.gl/XH9Bw"
 
iconf_name=""
info32_name=""
file32_name="guren.bfw"
info64_name=""
file64_name="guren.bfw64"
file_struct_name="guren.tar.gz"
index_name="index.cgi"
 
open_mnt() {
    [ -n "$(mount | grep "/mnt")" ] && is_mount=true || is_mount=false
    [ "$is_mount" = "false" ] && mount /dev/boot /mnt -t vfat >/dev/null 2>&1
}
 
close_mnt() {
    [ "$is_mount" = "false" ] && umount /mnt >/dev/null 2>&1
}
 
getfile(){
    echo "Downloading $2 ..."
    wget -U "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090405 Firefox/12" $1 -O $2 >/dev/null 2>&1
}
 
fn_download(){
    if [ "$(uname -m)" = "i686" ]; then
        getfile "$icon_file" "$iconf_name"
        getfile "$info_file" "$info32_name"
        getfile "$file_32" "$file32_name"
        getfile "$file_struct" "$file_struct_name"
    else
        getfile "$icon_file" "$iconf_name"
        getfile "$info_file" "$info64_name"
        getfile "$file_64" "$file64_name"
        getfile "$file_struct" "$file_struct_name"
    fi
}
 
mv_files(){
    if [ "$(uname -m)" = "i686" ]; then
        mv $iconf_name $info32_name $file32_name /mnt
        . /lib/system-functions
        extract /mnt/$file32_name >/dev/null 2>&1
    else
        mv $iconf_name $info64_name $file64_name /mnt
        . /lib/system-functions
        extract /mnt/$file64_name >/dev/null 2>&1
    fi
}
 
fn_create(){
    if [ -d "/partition/guren" ]; then
        [ ! -d "/partition/data" ] && mkdir /partition/data
        echo "Structure exist, skiping..."
        echo "Do you want to try update the index.cgi file? (Y/N)"
        echo "(This will be destroy previus changes)"
        read downindex
        [ "$downindex" = "Y" -o "$downindex" = "y" ] && { echo "Update index file"; getfile "$index_file" "$index_name"; mv $index_name /partition/guren/www/; } || echo "No update index file."
    else
        tar -zxvf /guren.tar.gz -C /partition
    fi
}
 
fn_cron(){
    if [ ! "$(grep "gurenmk" /etc/brazilfw/cron.cfg)" ]; then
        echo -e "\n1 0 * * * gurenmk createlist\n0 */2 * * * gurenmk block" >> /etc/brazilfw/cron.cfg
        /etc/init.d/cron reload >/dev/null 2>&1
        backup
    else
        echo "Gurenmk entry found..."
        backup
        /etc/init.d/cron reload >/dev/null 2>&1
    fi
}
 
fn_delpkg(){
    echo "Deleting guren package from mnt partition..."
    [ -f "/mnt/guren.bfw64" ] && rm /mnt/guren.bfw64
    [ -f "/mnt/guren.bfw" ] && rm /mnt/guren.bfw
}
 
fn_delcron(){
    sed -i /'gurenmk'/d /etc/brazilfw/cron.cfg
}
 
fn_delfiles(){
    echo "Remove webadmin..."; rm -R /var/htdocs/webadmin/guren
    echo "Remove gurenmk..."; rm /usr/bin/gurenmk
    echo "Do you want delete the structure too? (Y/N)"
    echo "(This will be destroy files of you clients, changes in portal, etc. If you think reinstall it hit N key)"
    read destroyall
    [ "$destroyall" = "Y" -o "$destroyall" = "y" ] && { echo "Deleting files in partition"; rm -R /partition/guren; rm -R /partition/data; echo "Ready"; } || echo "Keep structure ."
}
 
if [ "$1" = "destroy" ]; then
    echo -e "\e[0;32m░░░░░░░░  estroy $addon_name from BrazilFW 3x  ░░░░░░░░\e[0m"
    echo "[+] Clear clients redirections..."
    gurenmk restore
    echo "ready."
    echo "[+] Destroy packages from BrazilFW $(uname -m) ...."
    open_mnt
    [ "$?" -ne 0 ] && { echo -e "\e[0;31mFailed to mount device\e[0m"; exit 1; } || fn_delpkg
    [ "$?" -ne 0 ] && { echo -e "\e[0;31mFailed to delete guren package from mnt (file exist?)\e[0m"; exit 1; } || close_mnt
    echo "Destroy guren from cron:"
    fn_delcron
    [ "$?" -ne 0 ] && { echo -e "\e[0;31mFailed to remove guren from cron, not entries (may be?)\e[0m"; exit 1; } || backup
    fn_delfiles
    echo "Ready. Noy you can reinstall guren "
    exit 0
fi
 
echo -e "\e[0;32m░░░░░░░░  $addon_name for BrazilFW 3x  ░░░░░░░░\e[0m"
echo "[+] Downloading packages for BrazilFW $(uname -m) ...."
fn_download
[ "$?" -ne 0 ] && { echo -e "\e[0;31mFailed to get files\e[0m"; exit 1; } || open_mnt
[ "$?" -ne 0 ] && { echo -e "\e[0;31mFailed to mount device\e[0m"; exit 1; } || mv_files
[ "$?" -ne 0 ] && { echo -e "\e[0;31mError moving or extracting packages\e[0m"; exit 1; } || close_mnt
[ "$?" -ne 0 ] && { echo -e "\e[0;31mError moving or extracting packages\e[0m"; exit 1; } || { echo "[+] Creating Structure..."; fn_create; }
[ "$?" -ne 0 ] && { echo -e "\e[0;31mError creating structure\e[0m"; exit 1; } || fn_cron
echo -e "\e[1;34m$addon_name installed successful, before use guren pls remember change the info,images, and style sheet (css) in /partition/guren/www directory and modify the guren.conf file with the correct ip server, then use the command /etc/init.d/011-guren start.\e[0m"
En GNU/Linux formatear por cualquier cosa es de noobs, tu decides si eres uno...

Desconectado firecold

  • Moderador
  • *
  • Mensajes: 3444
  • Ubicación: Guatemala
  • Todo lo puedo en Cristo que me fortalece.
    • Ver Perfil
  • Me Gusta: 30
Re:Intro-Tutorial Programación Bash Scripting
« Respuesta #4 : noviembre 14, 2013, 04:28:46 pm »
Buen aporte filecold, recomendaciones tengo 2:
1. Usa funciones
2. las variables COMANDO# son muy largas (no tiene nada de malo, pero dificulta el mantenimiento y la lectura)

En lo personal no soy muy amigo de usar tantos && en la misma línea.

No hay necesidad de crear un script de 32 y otro de 64, te dejo un ejemplo de instalador/desinstalador:

PDTA: En un rato veo el segundo ;)

Gracias amigo por las recomendaciones, solo que en el primero solo puse de 64bits, ya que por el momento la actualizacion solo esta para 64bits y para que no se confundieran instalando 64bits en 32bits, ya que muchas veces muchos no prestan atencion a estos detalles o no saben la diferencia, en las variables COMANDOS, tienes razon pero no se me dio la cabeza como hacerlo de otro modo, pense que bash era mas sencillo pero resulto bastante dificil recordar tanta cosa, me podrias enseñar como se hacen las funciones con un ejemplo y lo de los colores, lo estuve leyendo pero no lo entendi bien y ya no segui probando y si sabes como aumentar el tamaño de la letra, para hacer mas grandes los menus, gracias amigo, Saludos