Que signifie "!!" dans "sudo !!"?

64

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

Que fait sudo !!et comment?

RamHS
la source
7
Duplicate of, excepté de l’autre côté: exécutez à nouveau la même commande mais sous la forme sudo
un CVn
6
@WarrenHill il ne veut pas le "comment" mais le "quoi" et le "comment". Il demande plus sur la !!partie de la commande.
Braiam
1
@Nakilon ne devrait pas l'être. Cette question demande ce que l'on !!fait et comment. L'autre veut une méthode pour le faire.
Braiam
@ MichaelKjörling vous vouliez dire liés non?
Braiam
2
@ Braiam En fait, je voulais dire dupliquer; les deux réponses les plus votées à celle-là expliquent spécifiquement ce qui sudo !!fait, et il y a deux réponses qui expliquent spécifiquement ce qui !!fait.
un CVn

Réponses:

74

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

chronite
la source
15
Remarque: les !commandes ne sont généralement pas disponibles dans les scripts bash (uniquement dans les sessions interactives). Ils peuvent être désactivés avec set +o histexpand.
Benoit
64

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-utilisateur 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 cela réapparaisse un message disant que vous devez être un administrateur pour le faire. Ainsi, vous pouvez taper sudopour exécuter cette commande en tant que super-utilisateur / admin ou vous pouvez taper sudo !!!!indique au système d'utiliser la commande précédente tentée. UfH

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 les commandes Bang de Linux , voir aussi Historique Bash et commandes Bang.

Mitch
la source
12
C'est également une commande très dangereuse si vous n'êtes pas sûr à 100% de la nature de votre commande précédente. Il est presque toujours plus sûr de simplement appuyer sur la flèche vers le haut, puis sur la touche d'accueil, puis tapez sudoet regardez la ligne de commande.
Shadur
3
@Shadur Habituellement, votre commande précédente datait d'environ 1 seconde. Le cas d'utilisation normale est celle décrite dans la réponse: vous oubliez de sudoquelque chose et obtenez une erreur, vous voulez immédiatement sudoil
Michael Mrozek
1
@Braiam: CLI est une abréviation. Violation de règle communautaire! Attaque! Rééditez!
Indien
4
sudone veut pas dire "super utilisateur", il va comme faire une commande comme si je l'avais fait su(su signifie changer d' utilisateur [et non super utilisateur]); c'est-à-dire que vous pouvez utiliser les commandes sudo comme n'importe quel utilisateur, pas seulement root ( -uswitch); il en va de mêmesu [user] [-c command]
jeudi
1
@Mitch sauf sune signifie pas une telle chose. Voir linux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html . Cela devrait signifier utilisateur substitut .
vendredi
38

La bang bang (!!)commande 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 le bouton,

sudo !!

!! saisit la dernière commande.

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 de verrouillage / 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 sudo !!commande, la sortie 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 !!qu'une partie saisit la commande apt-get updateprécédente et que la sudopartie précédente fait en sorte que la commande s'exécute avec les droits de superutilisateur.

Et comment les sudo !!exécute la commande précédente avec les privilèges de super - utilisateur signifie, normalement toutes les commandes que nous entrâmes sur le terminal sont stockés dans la command history.Run la historycommande sur le terminal, il affiche toutes les commandes que vous entered.The !!partie dans les sudo !!grappins la dernière commande enregistrée dans l'historique des commandes et le tout sudo !!exécute la dernière commande avec les privilèges d'administrateur.

Certaines autres commandes sont expliquées dans cet article de blog .

Avinash Raj
la source
3
Je suis surpris de le voir mentionner à nouveau «bang bang». Je pensais qu'une fois suffisait.
Kiri
1
+1 pour plus d'exemples de commandes bang.
WernerCD
1
@Rmano Au moins dans Bash, et je m'attends à ce que tous les shells de type Bourne prennent en charge l'historique mkdir LongDirectoryNameet cd !$doivent être émis séparément au travail, à moins que ce LongDirectoryNamene soit le dernier mot de la commande précédente. Pour les besoins de l'historique du shell, utilisez mkdir LongDirectoryName; cd !$une seule commande. Interaction de l'historique avec !!, !^et !$utilise la dernière commande que le shell a réellement traitée avant d'être visualisée !. Voici un exemple. Si vous exécutez, historyvous verrez que les commandes d'une ligne jointe ;sont mémorisées comme une seule commande.
Eliah Kagan
@EliahKagan tu as raison! Suppression de fausses informations ...
Rmano
13

La réponse comporte deux parties: !!etsudo

!!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 le "espace réservé" à un ensemble de mots. While foo*serait étendu à une liste de tous les fichiers commençant par «foo», puis !!étendu au contenu de la ligne de commande précédente.

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

Comme d'autres extensions, cela est entièrement fait par le shell, donc si vous tapez !!après une autre commande, cette commande n'est pas consciente de l'existence d'un !!, mais ne verra 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 enregistrée dans l’historique.)


La sudocommande permet d'exécuter des commandes en tant qu'autre utilisateur, à condition que les autorisations soient accordées par la politique de sécurité (celle-ci est configurée par défaut /etc/sudoers).

Par défaut, le mot de passe root reste non défini dans Ubuntu. Pour effectuer des tâches d'administration système, l'utilisateur créé lors de l'installation dispose des droits sudo. Cet utilisateur peut maintenant exécuter n'importe quelle commande du shell en tant que root, par simple ajout de préfixe sudo. Certains programmes graphiques utilisent également le mécanisme sudo, par exemple la gestion des paquets.

La raison pour laquelle vous sudopouvez exécuter d'autres commandes en tant que root (ou un autre utilisateur) est que sudo binary ( /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 voit juste mount /dev/sdb1 /mntet l'exécute avec les permissions root.

Adaephon
la source
5

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

Comme vous l'avez peut-être remarqué, après la substitution de 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 videoet que vous exécutiez sudo !!ensuite, 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 déroulent sans interruption et sans possibilité d'interaction de l'utilisateur, car shopt histverifynon défini par défaut ( shopt -u histverify).

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

  1. Vous obtenez une nouvelle invite principale, avec le texte développé entré automatiquement dessus. 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 Enterpour exécuter la commande. Ou vous pouvez modifier 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 l' histverify option 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 un autre système GNU / Linux, c'est essentiellement le cas.)

Que l' histverifyoption 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.

Eliah Kagan
la source
3

! 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 que vous faites.

sudo !!
et tu as fini.

tapananand
la source
0

!! répétera et exécutera la commande précédente, et avec sudo, il donnera le privilège root à la commande. (Ce n'est pas dans la page de manuel? !! Je ne peux pas le voir là.)

Farimah
la source
Pour tous ceux qui recherchent la page de manuel:man --pager='less -p "Event Designators"' bash
Sebi le