logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

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

get-local-script-as-command
#!/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  …
utilisateurs/tawal/scripts/telecharger-un-script-en-tant-que-commande.txt · Dernière modification: 14/10/2024 16:34 par Tawal

Pied de page des forums

Propulsé par FluxBB