Télécharger un fichier (script) et l'installer en tant que commande dans un répertoire du PATH
.
Recherche dans l'ordre si $HOME/bin
ou $HOME/.local/bin
ou /usr/local/bin
est dans le PATH
et retient le premier trouvé comme répertoire par défaut où télécharger le script.
Si aucun répertoire par défaut n'est trouvé, alors propose un menu de sélection du répertoire dans la liste du PATH
.
Possibilité de choisir le répertoire du PATH
où le script sera téléchargé (option -p)
Gestion des droits : Demande de mot de passe que si nécessaire et si l'utilisateur a accès à ces droits.
/usr/local/sbin
(répertoire qui ne devrait pas être dans le PATH
)
get-local-script-as-command : Télécharger un script et l'installer en tant que commande. Usage : get-local-script-as-command [-n NAME] [-p] URL get-local-script-as-command --help Description : Télécharger un script pointé par l'URL dans un répertoire du PATH. Utilise dans l'ordre $HOME/bin ou $HOME/.local/bin ou /usr/local/bin 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 --path). Options : -h, --help Afficher cette aide et quitter. -n, --name NAME Définir le nom du fichier de sortie à NAME. É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 Description). Note : 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. 2024-10-13 Tawal®©
#!/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
Une fois ce script installé dans /usr/local/sbin
et rendu exécutable,
il suffit de l'appeler ainsi par exemple :
/usr/local/sbin/get-local-script-as-command -pn swapproc "https://debian-facile.org/_export/code/utilisateurs:tawal:scripts:procswap-lister-les-processus-swapes?codeblock=2"
Retour :
1) /usr/bin 2) /usr/local/bin 3) /home/tawal/bin 4) /usr/games 5) /usr/local/games 6) exit #? 4 Droits root nécessaires : [sudo] Mot de passe de tawal : --2024-10-13 23:49:44-- https://debian-facile.org/_export/code/utilisateurs:tawal:scripts:procswap-lister-les-processus-swapes?codeblock=2 Résolution de debian-facile.org (debian-facile.org)… 89.234.146.138 Connexion à debian-facile.org (debian-facile.org)|89.234.146.138|:443… connecté. requête HTTP transmise, en attente de la réponse… 200 OK Taille : non indiqué [text/plain] Sauvegarde en : « /usr/games/swapproc » /usr/games/swapproc [ <=> ] 3,87K --.-KB/s ds 0s 2024-10-13 23:49:44 (25,8 MB/s) - « /usr/games/swapproc » sauvegardé [3961] 'swapproc' est maintenant un nom de commande externe pour tawal (1000).
path
à l'environnement du script :path="/mon/répertoire/perso" get-local-script-as-command …