Script para instalar programas en linux v2 [ nota: hay que probarlo ]
Tue Nov 11 2025 14:18:28 GMT+0000 (Coordinated Universal Time)
#!/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"



Comments