====== Télécharger un script et l'installer en tant que commande ======
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.\\
\\ Utilse //wget//\\
\\ Je conseille de placer ce script dans ''/usr/local/sbin'' (//répertoire qui ne devrait pas être dans le ''PATH''//)\\
Car ce script ne sera pas utilisé souvent.\\
Donc il vaut mieux y accéder par son chemin plutôt que par une commande directe.\\
\\
===== L'aide =====
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®©
\\
===== Le script =====
#!/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
\\
===== Exemple d'utilisation =====
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).
\\
===== Une seule astuce ! =====
* Possibilité de forcer le répertoire de téléchargement en passant la variable ''path'' à l'environnement du script :
path="/mon/répertoire/perso" get-local-script-as-command …