web-dev-qa-db-fra.com

Verrouiller l'entrée copier-coller sur le terminal pendant que Sudo demande un mot de passe

TL; DR

Pouvez-vous verrouiller l'entrée copier-coller dans le terminal pendant que Sudo vous demande un mot de passe?

Plus d'informations

Parfois, vous souhaitez copier et coller une longue série de commandes dans le terminal et les exécuter de manière séquentielle. Si Sudo fait partie de l'une des commandes, il empêche l'exécution de cette commande.

Un exemple de cela serait d'installer Spotify à l'aide des commandes de terminal fournies sur leur site Web:

# 1. Add the Spotify repository signing key to be able to verify downloaded packages
Sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886

# 2. Add the Spotify repository
echo deb http://repository.spotify.com stable non-free | Sudo tee /etc/apt/sources.list.d/spotify.list

# 3. Update list of available packages
Sudo apt-get update

# 4. Install Spotify
Sudo apt-get install spotify-client

Le copier-coller dans le terminal donne le résultat suivant:

user:~$ # 1. Add the Spotify repository signing key to be able to verify downloaded packages
user:~$ Sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886
[Sudo] password for user: 
Sorry, try again.
[Sudo] password for user: 

Ce qui se passe, c'est que le terminal interprète la ligne "# 2. Ajouter le référentiel Spotify" comme mot de passe fourni (ou peut-être même "" comme mot de passe car il y a un saut de ligne entre la commande Sudo et cette ligne), se verrouille pendant quelques secondes pendant que le copier-coller est toujours en cours d'entrée sur le terminal, puis se déverrouille à nouveau pour une seconde tentative sur le mot de passe.

C'est mauvais si vous avez beaucoup de commandes que vous souhaitez exécuter en série, car alors certaines des commandes non Sudo seront exécutées tandis que les commandes Sudo sont refusées.

Une solution rapide pour résoudre ce problème consiste à écrire d'abord manuellement une commande non-sens, comme $ Sudo whatever, puis entrez le mot de passe, puis collez la série de commandes, comme suit:

user:~$ Sudo whatever
[Sudo] password for user: 
Sudo: whatever: command not found
user:~$ # 1. Add the Spotify repository signing key to be able to verify downloaded packages
user:~$ Sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886
Executing: /tmp/tmp.JQ3ntmdbnL/gpg.1.sh --keyserver
hkp://keyserver.ubuntu.com:80 
--recv-keys
BBEBDCB318AD50EC6865090613B00F1FD2C19886
...
...
...

Cela fonctionne car l'instance de terminal ne demandera plus de mot de passe.

Existe-t-il un moyen plus intelligent de le faire? Pouvez-vous, par exemple, verrouiller l'entrée copier-coller jusqu'à ce qu'un mot de passe valide soit fourni?

1
Mossmyr

Oui, il existe des moyens simples de procéder.

Par exemple. si vous voulez copier-coller ceci dans le terminal:

Sudo echo 1
echo 2
echo 3

Cela se produit normalement:

$ Sudo echo 1
[Sudo] password for wja: 
Sorry, try again.
[Sudo] password for wja: 
1

Au lieu de cela, vous pouvez utiliser accolades:

$ {
> Sudo echo 1
> echo 2
> echo 3
> }
[Sudo] password for wja: 
1
2
3

Ou vous pouvez utiliser bash avec une chaîne héréditaire:

$ bash << EOF
> Sudo echo 1
> echo 2
> echo 3
> EOF
[Sudo] password for wja: 
1
2
3
2
wjandrea