Script para instalar programas en linux v2 [ nota: hay que probarlo ]

PHOTO EMBED

Tue Nov 11 2025 14:18:28 GMT+0000 (Coordinated Universal Time)

Saved by @jrg_300i #yii2

#!/bin/bash

# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Función para imprimir mensajes
print_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
print_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# -- Verificar si es ejecutado como root
if [[ $EUID -eq 0 ]]; then
    print_error "No ejecutes este script como root/sudo. Ejecútalo como usuario normal."
    exit 1
fi

# -- Función para instalar paquetes según la distribución
install_package() {
    local package=$1
    print_info "Instalando $package..."
    
    if command -v apt &> /dev/null; then
        sudo apt install -y "$package" 2>/dev/null || sudo apt-get install -y "$package"
    elif command -v dnf &> /dev/null; then
        sudo dnf install -y "$package"
    elif command -v yum &> /dev/null; then
        sudo yum install -y "$package"
    elif command -v pacman &> /dev/null; then
        sudo pacman -S --noconfirm "$package"
    else
        print_error "Gestor de paquetes no soportado"
        return 1
    fi
    
    return $?
}

# -- PASO 1: Actualizar el sistema
print_info "Actualizando sistema..."
sudo apt update && sudo apt upgrade -y

# -- PASO 2: Instalar dependencias básicas
print_info "Instalando dependencias básicas..."
sudo apt install -y wget curl gpg gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release

# -- PASO 3: Instalar git
print_info "Instalando Git..."
install_package "git"

# -- PASO 4: Instalar vscode
print_info "Instalando VS Code..."
if ! command -v code &> /dev/null; then
    # Crear directorio para claves
    sudo mkdir -p /etc/apt/keyrings
    
    # Agregar clave GPG de Microsoft
    curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /etc/apt/keyrings/packages.microsoft.gpg
    
    # Agregar repositorio de VS Code
    echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
    
    # Actualizar lista de paquetes e instalar VS Code
    sudo apt update
    install_package "code"
else
    print_info "VS Code ya está instalado"
fi

# -- PASO 5: Instalar google chrome
print_info "Instalando Google Chrome..."
if ! command -v google-chrome-stable &> /dev/null && ! command -v google-chrome &> /dev/null; then
    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /etc/apt/keyrings/google-chrome.gpg
    echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] https://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
    sudo apt update
    install_package "google-chrome-stable"
else
    print_info "Google Chrome ya está instalado"
fi

# -- PASO 6: Instalar php
print_info "Instalando PHP..."
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update

# -- PASO 7: Instalar python
print_info "Instalando Python..."
install_package "python3"
install_package "python3-pip"
install_package "python3-venv"
install_package "build-essential"

# -- PASO 8: Instalar PHP 7.4 y extensiones comunes
print_info "Instalando PHP 7.4..."
install_package "php7.4"
install_package "php7.4-pgsql"
install_package "php7.4-cli"
install_package "php7.4-fpm"
install_package "php7.4-mysql"
install_package "php7.4-zip"
install_package "php7.4-gd"
install_package "php7.4-mbstring"
install_package "php7.4-curl"
install_package "php7.4-xml"
install_package "php7.4-bcmath"

# -- PASO 9: Instalar PHP 8.4 y extensiones
print_info "Instalando PHP 8.4..."
install_package "php8.4"
install_package "php8.4-pgsql"
install_package "php8.4-cli"
install_package "php8.4-fpm"
install_package "php8.4-mysql"
install_package "php8.4-zip"
install_package "php8.4-gd"
install_package "php8.4-mbstring"
install_package "php8.4-curl"
install_package "php8.4-xml"
install_package "php8.4-bcmath"

# -- PASO 10: Configurar PHP por defecto
print_info "Configurando PHP 8.4 como versión por defecto..."
sudo update-alternatives --set php /usr/bin/php8.4 2>/dev/null || true

# -- PASO 11: Instalar composer
print_info "Instalando Composer..."
if ! command -v composer &> /dev/null; then
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    php composer-setup.php --install-dir=/usr/local/bin --filename=composer
    php -r "unlink('composer-setup.php');"
else
    print_info "Composer ya está instalado"
fi

# -- PASO 12: Instalar apache2
print_info "Instalando Apache2..."
install_package "apache2"

# -- PASO 13: Instalar postgres
print_info "Instalando PostgreSQL..."
if ! command -v psql &> /dev/null; then
    sudo mkdir -p /etc/apt/keyrings
    curl -fsS https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg
    echo "deb [signed-by=/etc/apt/keyrings/postgresql.gpg] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
    sudo apt update
    install_package "postgresql"
    install_package "postgresql-contrib"
else
    print_info "PostgreSQL ya está instalado"
fi

# -- PASO 14: Instalar pgadmin4
print_info "Instalando pgAdmin4..."
if ! command -v pgadmin4 &> /dev/null; then
    sudo mkdir -p /etc/apt/keyrings
    curl -fsS https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /etc/apt/keyrings/pgadmin-keyring.gpg
    echo "deb [signed-by=/etc/apt/keyrings/pgadmin-keyring.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main" | sudo tee /etc/apt/sources.list.d/pgadmin4.list
    sudo apt update
    install_package "pgadmin4-desktop"
else
    print_info "pgAdmin4 ya está instalado"
fi

# -- PASO 15: Instalar yakuake
print_info "Instalando Yakuake..."
install_package "yakuake"

# -- PASO 16: VERIFICAR E INSTALAR ZSH AUTOMÁTICAMENTE (MEJORA SOLICITADA)
print_info "Verificando e instalando Zsh..."
if ! command -v zsh &> /dev/null; then
    print_warning "Zsh no está instalado. Instalando automáticamente..."
    
    if install_package "zsh"; then
        if command -v zsh &> /dev/null; then
            print_success "Zsh instalado correctamente: $(zsh --version | head -n1)"
        else
            print_error "Zsh no se instaló correctamente"
            exit 1
        fi
    else
        print_error "No se pudo instalar Zsh automáticamente"
        print_info "Por favor, instala Zsh manualmente:"
        echo "  sudo apt install zsh"
        exit 1
    fi
else
    print_info "Zsh ya está instalado: $(zsh --version | head -n1)"
fi

# Verificar Git (necesario para plugins)
if ! command -v git &> /dev/null; then
    print_warning "Git no está instalado. Instalando..."
    if ! install_package "git"; then
        print_error "No se pudo instalar Git"
        exit 1
    fi
fi

# Verificar curl o wget (necesario para Oh My Zsh)
if ! command -v curl &> /dev/null && ! command -v wget &> /dev/null; then
    print_warning "Ni curl ni wget están instalados. Instalando curl..."
    if ! install_package "curl"; then
        print_warning "No se pudo instalar curl, intentando con wget..."
        if ! install_package "wget"; then
            print_error "No se pudo instalar curl ni wget"
            exit 1
        fi
    fi
fi

print_success "Dependencias de Zsh verificadas e instaladas correctamente"

# -- PASO 17: Instalar oh my zsh (VERSIÓN MEJORADA)
print_info "Instalando Oh My Zsh..."

# Asegurar que .zshrc exista
if [ ! -f ~/.zshrc ]; then
    cat > ~/.zshrc << 'EOF'
# Path to Oh My Zsh installation
export ZSH="$HOME/.oh-my-zsh"

# Default theme
ZSH_THEME="robbyrussell"

# Default plugins
plugins=(git)

# Source Oh My Zsh
if [ -f "$ZSH/oh-my-zsh.sh" ]; then
    source $ZSH/oh-my-zsh.sh
fi
EOF
fi

# Instalar Oh My Zsh si no está
if [ ! -d "$HOME/.oh-my-zsh" ]; then
    # Usar RUNZSH=no para evitar cambiar de shell automáticamente
    export RUNZSH=no
    export CHSH=no
    
    if command -v curl &> /dev/null; then
        sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
    elif command -v wget &> /dev/null; then
        sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)" "" --unattended
    else
        print_error "Ni curl ni wget disponibles para instalar Oh My Zsh"
        exit 1
    fi
    
    if [ ! -d "$HOME/.oh-my-zsh" ]; then
        print_error "Oh My Zsh no se instaló correctamente"
        exit 1
    fi
    print_success "Oh My Zsh instalado correctamente"
else
    print_info "Oh My Zsh ya está instalado"
fi

# -- PASO 18: Instalar powerlevel10k (VERSIÓN CORREGIDA)
print_info "Instalando Powerlevel10k..."

# Crear directorio de temas personalizados si no existe
mkdir -p "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes"

if [ -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" ]; then
    print_info "Powerlevel10k ya está instalado, actualizando..."
    cd "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
    git pull --depth=1
    cd - > /dev/null
else
    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
fi

# -- PASO 19: Configurar tema en ~/.zshrc
print_info "Configurando Powerlevel10k como tema..."

# Asegurar que ZSH está definido
if ! grep -q "export ZSH=" ~/.zshrc; then
    echo 'export ZSH="$HOME/.oh-my-zsh"' >> ~/.zshrc
fi

# Cambiar o añadir ZSH_THEME
if grep -q "ZSH_THEME=" ~/.zshrc; then
    # Si ya existe, reemplazar
    if command -v sed &> /dev/null; then
        sed -i.bak 's|^ZSH_THEME=.*|ZSH_THEME="powerlevel10k/powerlevel10k"|' ~/.zshrc
    else
        # Fallback para sistemas sin sed
        print_warning "sed no disponible, usando método alternativo..."
        cp ~/.zshrc ~/.zshrc.backup
        grep -v "ZSH_THEME=" ~/.zshrc.backup > ~/.zshrc
        echo 'ZSH_THEME="powerlevel10k/powerlevel10k"' >> ~/.zshrc
    fi
else
    # Si no existe, añadirlo
    echo 'ZSH_THEME="powerlevel10k/powerlevel10k"' >> ~/.zshrc
fi

# -- PASO 20: Instalar plugins de zsh (VERSIÓN CORREGIDA)
print_info "Instalando plugins de Zsh..."

# Crear directorio de plugins personalizados
mkdir -p "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins"

# Instalar zsh-autosuggestions
if [ ! -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" ]; then
    git clone https://github.com/zsh-users/zsh-autosuggestions "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions"
else
    print_info "zsh-autosuggestions ya está instalado"
fi

# Instalar zsh-syntax-highlighting
if [ ! -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting" ]; then
    git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting"
else
    print_info "zsh-syntax-highlighting ya está instalado"
fi

# -- PASO 21: Actualizar plugins en .zshrc
print_info "Actualizando lista de plugins en .zshrc..."

# Crear backup
cp ~/.zshrc ~/.zshrc.backup_plugins

# Definir lista de plugins completa
PLUGINS_LIST='plugins=(git zsh-autosuggestions zsh-syntax-highlighting sudo history-substring-search colored-man-pages composer)'

if grep -q "^plugins=" ~/.zshrc; then
    # Reemplazar línea existente
    if command -v sed &> /dev/null; then
        sed -i "s/^plugins=.*/$PLUGINS_LIST/" ~/.zshrc
    else
        awk -v new="$PLUGINS_LIST" '/^plugins=/{print new; next} 1' ~/.zshrc.backup_plugins > ~/.zshrc
    fi
else
    # Buscar dónde insertar (antes de source oh-my-zsh.sh)
    if grep -q "source.*oh-my-zsh.sh" ~/.zshrc; then
        awk -v new="$PLUGINS_LIST" '/source.*oh-my-zsh.sh/{print new; print; next} 1' ~/.zshrc > ~/.zshrc.tmp && mv ~/.zshrc.tmp ~/.zshrc
    else
        # Insertar antes del final
        echo "$PLUGINS_LIST" >> ~/.zshrc
    fi
fi

# -- PASO 22: Añadir configuración de Powerlevel10k
print_info "Añadiendo configuración de Powerlevel10k..."
if ! grep -q "p10k.zsh" ~/.zshrc; then
    echo '' >> ~/.zshrc
    echo '# Powerlevel10k instant prompt' >> ~/.zshrc
    echo 'if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then' >> ~/.zshrc
    echo '  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"' >> ~/.zshrc
    echo 'fi' >> ~/.zshrc
    echo '' >> ~/.zshrc
    echo '# Powerlevel10k configuration' >> ~/.zshrc
    echo '[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh' >> ~/.zshrc
fi

# -- PASO 23: Instalar NVM y Node.js (VERSIÓN MEJORADA)
print_info "Instalando NVM y Node.js..."
if [ ! -d "$HOME/.nvm" ]; then
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
    
    # Cargar NVM en el script actual
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
    
    # Añadir NVM al .zshrc si no está
    if ! grep -q "NVM_DIR" ~/.zshrc; then
        echo '' >> ~/.zshrc
        echo '# NVM' >> ~/.zshrc
        echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.zshrc
        echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.zshrc
        echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >> ~/.zshrc
    fi
    
    # Instalar Node.js si NVM está disponible
    if command -v nvm &> /dev/null; then
        nvm install 22
        nvm use 22
        nvm alias default 22
        print_success "Node.js $(node --version) instalado"
    fi
else
    print_info "NVM ya está instalado"
fi

# -- PASO 24: Agregar configuraciones personalizadas al .zshrc
print_info "Añadiendo configuraciones personalizadas..."

# Verificar si ya existen nuestras configuraciones
if ! grep -q "function indicadores" ~/.zshrc; then
    cat >> ~/.zshrc << 'EOF'

# ============================================
# CONFIGURACIONES PERSONALIZADAS
# ============================================

# Funciones personalizadas
function indicadores() {
  cd /var/www/html/jobran/indicadores/ && ls -lt --color=auto
}

function proyectos() {
  cd /var/www/html/jobran/ && ls -lt --color=auto
}

php-server() {
  local framework=$1
  local port=${2:-8000}
  local ruta=$3
  case "$framework" in
    yii2)
      ruta=${ruta:-backend/web}
      echo "🚀 Iniciando Yii2 en http://localhost:$port"
      php -S localhost:$port -t "$ruta"
      ;;
    laravel)
      ruta=${ruta:-public}
      echo "🚀 Iniciando Laravel en http://localhost:$port"
      php -S localhost:$port -t "$ruta"
      ;;
    *)
      echo "⚠️  Framework no reconocido: '$framework'"
      echo "📌 Uso: php-server [yii2|laravel] [puerto] [ruta]"
      ;;
  esac
}

# Activar globbing avanzado
setopt extendedglob
setopt globdots
setopt nomatch

# ============================================
# ALIAS
# ============================================

# Laravel
alias art="php artisan"
alias tinker="php artisan tinker"
alias serve="php artisan serve"
alias migrate="php artisan migrate"
alias seed="php artisan db:seed"
alias fresh="php artisan migrate:fresh --seed"

# Composer
alias cdu="composer dump-autoload"
alias ci="composer install"
alias cu="composer update"

# PostgreSQL
alias psqlc="psql -h localhost -U postgres -W"
alias pgstart="sudo systemctl start postgresql"
alias pgstop="sudo systemctl stop postgresql"
alias pgrestart="sudo systemctl restart postgresql"
alias pgstatus="sudo systemctl status postgresql"
alias psql-iniciar="psql -h localhost -U postgres -W"

# Navegación
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'

# Seguridad
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Git
alias gs='git status'
alias ga='git add'
alias gc='git commit -m'
alias gp='git push'
alias gl='git log --oneline --graph'

# Sistema
alias update='sudo apt update && sudo apt upgrade -y'
alias reboot='sudo reboot'
alias shutdown='sudo shutdown -h now'
alias ports='sudo netstat -tulpn'

# Funciones útiles
mkcd() {
    mkdir -p "$1" && cd "$1"
}

findin() {
    grep -r "$1" . --color=always
}

EOF
fi

# -- PASO 25: Verificaciones finales
print_info "Verificando instalaciones..."
echo ""
echo "=== VERSIONES INSTALADAS ==="
[ -x "$(command -v psql)" ] && echo "PostgreSQL: $(psql --version | head -n1)" || echo "PostgreSQL: No instalado"
[ -x "$(command -v git)" ] && echo "Git: $(git --version)" || echo "Git: No instalado"
[ -x "$(command -v php)" ] && echo "PHP: $(php --version | head -n1)" || echo "PHP: No instalado"
[ -x "$(command -v python3)" ] && echo "Python: $(python3 --version)" || echo "Python: No instalado"
[ -x "$(command -v composer)" ] && echo "Composer: $(composer --version | head -n1)" || echo "Composer: No instalado"
[ -x "$(command -v code)" ] && echo "VS Code: $(code --version | head -n1)" || echo "VS Code: No instalado"
[ -x "$(command -v node)" ] && echo "Node.js: $(node --version)" || echo "Node.js: No instalado"
[ -x "$(command -v zsh)" ] && echo "Zsh: $(zsh --version)" || echo "Zsh: No instalado"
[ -d "$HOME/.oh-my-zsh" ] && echo "Oh My Zsh: Instalado" || echo "Oh My Zsh: No instalado"
[ -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" ] && echo "Powerlevel10k: Instalado" || echo "Powerlevel10k: No instalado"

echo ""
print_success "¡Instalación completada con éxito!"
print_warning "Pasos finales:"
echo "  1. Cierra y abre una nueva terminal"
echo "  2. O ejecuta: source ~/.zshrc"
echo "  3. Para configurar Powerlevel10k: p10k configure"
echo "  4. Para cambiar a Zsh como shell por defecto: chsh -s $(which zsh)"
echo ""
print_info "Si ves errores con Powerlevel10k, ejecuta manualmente:"
echo "  git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/.powerlevel10k"
echo "  echo 'source ~/.powerlevel10k/powerlevel10k.zsh-theme' >> ~/.zshrc"
echo "  source ~/.zshrc"
echo "  p10k configure"
content_copyCOPY