web-dev-qa-db-fra.com

Que signifie "!!" dans "Sudo !!"?

Je suis un utilisateur d'Ubuntu avec peu d'expérience et j'utilise Sudo.

Que fait Sudo !! et comment?

64
RamHS

!! in bash est un alias de la commande précédente (voir Indicateurs d'événement ). Donc, il réexécute la commande précédente avec les autorisations Sudo.

74
chronitis

Sudo bang bang est une commande très utile lorsque vous travaillez dans l'interface de ligne de commande.

Certaines distributions Linux vous permettent de vous connecter en tant qu'utilisateur plutôt qu'en tant qu'administrateur.

Donc, pour faire quelque chose d'administrateur, vous devez exécuter la commande avec Sudo (Super-User DO), qui indique au système "vous allez le faire, parce que je l'ai dit."/bang-bang (! = bang) est un raccourci que vous pouvez utiliser pour répéter la commande précédente.

Ainsi, le scénario typique est que vous essayez une commande et que le message indiquant que vous devez être un administrateur doit le faire. Ainsi, vous pouvez taper Sudo pour exécuter cette commande en tant que super-utilisateur/admin ou taper Sudo !!!! indique au système d’utiliser la commande précédente tentée.fH

Il y a beaucoup d'autres commandes de bang. Pour obtenir une liste d’entre eux et des explications sur ce qu’ils sont, consultez Linux Bang Commands , voir aussi Historique Bash et commandes Bang

64
Mitch

La commande bang bang (!!) est un raccourci pour répéter et exécuter la commande précédente que vous avez entrée dans votre terminal. Cette commande est très utile lorsque vous oubliez que vous avez besoin des droits d’administrateur pour effectuer une action donnée, et vous permet de la répéter avec les droits de super-utilisateur en tapant simplement,

Sudo !!

!! saisit la dernière commande d'exécution.

Par exemple:

apt-get update

La sortie sera,

E: Impossible d'ouvrir le fichier de verrouillage/var/lib/apt/lists/lock - open (13: autorisation refusée)
E: Impossible de verrouiller le répertoire/var/lib/apt/lists /
E: Impossible d'ouvrir le fichier verrou/var/lib/dpkg/lock - open (13: autorisation refusée)
E: Impossible de verrouiller le répertoire d’administration (/ var/lib/dpkg /), êtes-vous root?

Après cela, si nous exécutons la commande Sudo !!, le résultat sera

Hit http://extras.ubuntu.com saucy/main AMD64 Packages
Get:3 http://mirror.sov.uk.goscomb.net saucy-updates Release.gpg [933 B]
Hit http://ppa.launchpad.net saucy Release                                  
Hit http://extras.ubuntu.com saucy/main i386 Packages 
Hit http://mirror.sov.uk.goscomb.net saucy Release                             
99% [Waiting for headers] [Waiting for headers] [Waiting for headers]

Ce qui signifie que la partie !! récupère la commande précédente apt-get update et que la partie précédente Sudo permet à la commande de s'exécuter avec les droits de superutilisateur.

Et comment le Sudo !! exécute la commande précédente avec les privilèges de super-utilisateur, normalement, toutes les commandes entrées sur le terminal sont stockées dans le command history.Exécutez la commande history sur le terminal, toutes les commandes que vous avez entrées sont affichées. La partie !! du Sudo !! saisit la dernière commande stockée dans l'historique des commandes et l'intégralité de Sudo !! exécute la dernière commande avec des privilèges d'administrateur.

Quelques autres commandes bang sont expliquées dans ce article de blog .

38
Avinash Raj

La réponse comporte deux parties: !! et Sudoname__

!! fait partie des fonctionnalités du shell (dans le cas d’Ubuntu, il s’agit probablement de bash, mais d’autres shells comme zsh ou csh le supportent également) appelé "développement de l’historique". Il se comporte de la même manière que les autres extensions, en ce sens que le shell étend l’espace réservé à un ensemble de mots. Alors que foo* serait étendu à une liste de tous les fichiers commençant par 'foo', !! sera développé au contenu de la ligne de commande précédente.

$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar

Comme les autres extensions, cela est entièrement fait par le shell. Par conséquent, si vous tapez !! après une autre commande, cette commande n'est pas consciente de l'existence d'un !!, mais ne voit que la ligne de commande précédente. (Contrairement aux autres extensions, l’extension de l’historique se produit avant l’enregistrement d’une commande dans l’historique, c’est-à-dire que la ligne de commande remplacée sera sauvegardée dans l’historique au lieu de !!.)


La commande Sudopermet d'exécuter les commandes en tant qu'un autre utilisateur, à condition que les autorisations soient accordées par la stratégie de sécurité (la configuration par défaut est définie dans /etc/sudoers).

Par défaut, le mot de passe root reste non défini dans Ubuntu. Pour effectuer les tâches d'administration du système, les droits Sudo sont accordés à l'utilisateur créé lors de l'installation. Cet utilisateur peut désormais exécuter n'importe quelle commande du shell en tant qu'utilisateur root, en ajoutant simplement Sudoname__. Certains programmes graphiques utilisent également le mécanisme Sudo, par exemple la gestion des paquets.

La raison pour laquelle Sudopeut exécuter d'autres commandes en tant que root (ou un autre utilisateur) est que le binaire Sudo (/usr/bin/Sudo) a le bit setuid défini dans son autorisation et appartient à root. Tout exécutable (binaire) avec le bit setuid est exécuté avec les autorisations de son propriétaire. Cela signifie que Sudo fonctionne efficacement avec les autorisations root, quel que soit l'utilisateur qui l'a appelé. Seules les politiques de sécurité internes de Sudo gèrent quel utilisateur est autorisé et empêchent les utilisateurs arbitraires de faire des choses arbitraires.


Donc, dans le cas de Sudo !! cela signifie

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ Sudo !!

est fondamentalement identique à

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ Sudo mount /dev/sdb1 /mnt

juste moins en tapant. Dans les deux cas, Sudo ne voit que mount /dev/sdb1 /mnt et l'exécute avec les autorisations root.

13
Adaephon

!! est l'expression la plus simple et probablement la plus courante sur le plan syntaxique pour expansion de l'historique .

Comme vous l'avez peut-être remarqué, après avoir substitué la dernière commande exécutée à !!, bash fait deux choses (dans sa configuration par défaut):

  1. La commande complète avec le texte substitué vous est présentée.

    Par exemple, si votre commande était lshw -c video et que vous exécutez Sudo !! next, la commande après le développement de l'historique est Sudo lshw -c video.

  2. Cette commande est exécutée.

Normalement, ces deux étapes se produisent sans interruption et sans possibilité d'interaction de l'utilisateur, car shopt histverify n'est pas défini par défaut (shopt -u histverify).

Cependant, si vous activez shopt histverify (shopt -s histverify), le développement de l'historique fonctionne différemment:

  1. Vous obtenez un nouveau message principal avec le texte développé qui y est entré automatiquement. C'est comme si vous aviez tapé ce texte vous-même, avec le curseur à la fin, mais que vous n'avez pas encore exécuté la commande.
  2. Vous, l'utilisateur, devez ensuite appuyer sur Enter pour exécuter la commande. Ou vous pouvez éditer la commande, l’annuler (Ctrl+C), etc. Notez qu'il ne s'agit pas d'une invite spéciale, mais d'une invite principale normale. C'est vraiment comme si vous avez tapé le texte vous-même.

(Notez que histverifyoption du shell ne prend effet que si la bibliothèque readline est utilisée - mais lorsque vous utilisez bash de manière interactive sur un système Ubuntu ou autre, sous GNU/Linux, est essentiellement toujours le cas.)

Que l'option histverify Shell soit activée ou non , l'expansion de l'historique est différente de celle de nombreuses autres extensions du Shell. Les autres extensions du shell ne vous montrent pas la commande développée avant son exécution. Contrairement aux autres extensions, destinées à être utilisées de manière interactive et non interactive (par exemple, dans un script Shell), le développement de l'historique est presque toujours utilisé de manière interactive.

5
Eliah Kagan

! est utilisé sous Linux pour les raccourcis liés à l’histoire. Alors, !! exécutera simplement la commande précédente que vous avez exécutée.

C'est très utile dans les cas où vous oubliez de mettre Sudo avant une commande qui l'exige ou vous obtenez une autorisation refusée, ou quelque chose du genre, faites-le simplement.

Sudo !!
3
tapananand

!! répète et exécute la commande précédente. Avec Sudo, il lui donne le privilège root. (Ce n'est pas dans la page de manuel? !! Je ne peux pas le voir là.)

0
Farimah