#!/bin/bash # get-local-script-as-command --- Bash 5.2 # # Télécharger un script dans un répertoire du PATH. # Et le rendre exécutable. # Du coup, il devient une commande par son nom de fichier. # # 2024-10-14 Tawal. script="${0##*/}" ### Fonctions ### usage() { ver="2024-10-14" Surb='\e[1m' # Surbrillance Ital='\e[3m' # Italique Rst='\e[m' # Reset echo -e "$script : Télécharger un script et l'installer en tant que commande.\n ${Surb}Usage :$Rst $Surb$script$Rst [-n ${Surb}NAME${Rst}] [-p] ${Surb}URL$Rst $Surb$script$Rst --help ${Surb}Description :$Rst Télécharger un script pointé par l'${Surb}URL$Rst dans un répertoire du PATH. Utilise dans l'ordre $Surb$Ital\$HOME/bin$Rst ou $Surb$Ital\$HOME/.local/bin$Rst ou $Surb$Ital/usr/local/bin$Rst comme répertoire par défaut où télécharger le script. Si aucun de ces répertoires n'est dans le PATH alors propose un menu de sélection d'un répertoire du PATH (force l'option $Ital--path$Rst). ${Surb}Options :$Rst -h, --help Afficher cette aide et quitter. -n, --name ${Surb}NAME$Rst Définir le nom du fichier de sortie à ${Surb}NAME$Rst. Équivaut au nom de la commande. Sans cette option, le nom original est utilisé. -p, --path Afficher un menu de sélection d'un répertoire du PATH accessible à l'utilisateur pour copie dans ce répertoire. Sans cette option, utilise le répertoire par défaut, (voir ${Surb}Description$Rst). ${Surb}Note :$Rst Les droits 'root' ne seront demandés que si nécessaire et après la sélection d'un répertoire du PATH si elle a eu lieu.\n" printf "%s%72s\n" "$ver" "Tawal®©" quit usage } test_name() { [[ $1 =~ ^[a-zA-Z1-9_-]+$ ]] } test_path() { [ -e "$1" ] && [[ $PATH =~ (^|:)$1(:|$) ]] } test_url() { reg_url='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]\.[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]$' [[ $1 =~ $reg_url ]] } quit() { case $1 in err_file) echo "$script : Erreur - Nom de fichier de sortie non valide !" >&2 exit 1 ;; err_nb_arg) echo "$script : Erreur - Un argument oblgatoire : URL" >&2 exit 2 ;; err_opt) echo "$script : Erreur - Option non reconnue '-$2'" >&2 exit 3 ;; err_root) echo "$script : Erreur - Droits 'root' nécessaires. Contactez l'administrateur." >&2 exit 4 ;; err_url) echo "$script : Erreur - Caractères non autorisés dans l'URL" >&2 exit 5 ;; err_wget) echo "$script : Erreur - Le téléchargement a échoué." >&2 exit 6 ;; fin) echo -e "\n'$name' est maintenant un nom de commande externe pour $user ($uid)." exit 0 ;; usage|user_exit|root_launch) exit ;; *) echo "Impossible !" >&2 exit 63 esac } ### Getsion des options ### while getopts :hn:p-: opt do case $opt in h) usage ;; n) name="$OPTARG" test_name "$name" || quit err_file "$name" ;; p) path_sel=1 ;; -) case $OPTARG in help) usage ;; name) name="${!OPTIND}" test_name "$name" || quit err_file "$name" OPTIND=$((OPTIND+1)) ;; path) path_sel=1 ;; root_launch) root_launch=1 # Option interne au script pour relance en 'sudo'. ;; *) quit err_opt "-${!OPTIND}" esac ;; *) quit err_opt "$OPTARG" esac done shift $((OPTIND-1)) # Test du nombre d'arguments et de la validité de l'URL if ! [ $# -eq 1 ] then quit err_nb_arg else if test_url "$1" then nom_orig="${1##*/}" else quit err_url fi fi # Identifiants de l'appelant du script. [ -z "$user" ] && user="$USER" [ -z "$uid" ] && uid="$UID" # Recherche d'un répertoire 'local' dans le PATH pour défaut. bin="$HOME/bin" if test_path "$bin" then def_path="$bin" else bin="$HOME/.local/bin" if test_path "$bin" then def_path="$bin" else bin="/usr/local/bin" if test_path "$bin" then def_path="$bin" else path_sel=1 fi fi fi # Sélection du répertoire du PATH où copier le script à télécharger. if [ -z "$root_launch" ] && ((path_sel)) then #shellcheck disable=SC2086 # (info): Double quote $PATH to prevent globbing and word splitting. select p in $(IFS=":"; echo $PATH) exit do path="$p" break done elif [ -z "$root_launch" ] && [ -z "$path" ] then path="$def_path" fi if [ "$path" = "exit" ] then quit user_exit fi # Affectation du nom de fichier (commande) if [ -z "$name" ] then name="$nom_orig" fi # Test des droits nécessaires (utilisateur ou root). if [ ! -w "$path" ] && [ $UID -gt 0 ] then ### Droits root obligatoires if [ "$(sudo -ln 2>/dev/null)" ] || groups "$USER" | grep -qE "(^| )sudo( |$)" then echo "Droits root nécessaires :" >&2 if [ -x "$0" ] then sudo user="$user" uid="$uid" path="$path" name="$name" "$0" --root_launch "$@" else sudo user="$user" uid="$uid" path="$path" name="$name" bash "$0" --root_launch "$@" fi quit root_launch else quit err_root fi fi ### --- ### Téléchargement et Attribut du fichier ### wget "$1" -O "$path/$name" || quit err_wget chmod +x "$path/$name" ### Exit ### quit fin