64 votes

Que signifie `!!` dans `sudo !!` ?

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

Qu'est-ce que sudo !! faire et comment ?

74voto

chronitis Points 11442

!! dans bash est un alias pour la commande précédente (voir Concepteurs d'événements ). Il ré-exécute donc la commande précédente avec sudo permissions.

64voto

Mitch Points 102545

sudo bang bang est une commande très utile lorsqu'on travaille dans l'interface de ligne de commande.

Certaines distributions Linux vous demandent de vous connecter en tant qu'utilisateur et non en tant qu'administrateur.

Donc, pour faire quelque chose d'administratif, vous devez procéder à la commande avec sudo (Super-User DO), qui indique au système "tu vas faire ceci, parce que je l'ai dit". Le ! ! / bang-bang ( ! = bang) est essentiellement un raccourci que vous pouvez utiliser pour répéter la commande précédente.

Donc, le scénario typique est que vous essayez une commande, et il renvoie un message disant que vous devez être un administrateur pour le faire. Donc, vous pouvez soit taper sudo pour exécuter cette commande en tant que super-utilisateur/admin, ou vous pouvez taper sudo !! donde !! indique au système d'utiliser la commande précédente qui a été tentée. UfH

Il existe de nombreuses autres bang-commandes. Pour une liste et des explications sur ce qu'elles sont, consultez le site Commandes Linux Bang voir aussi Historique de Bash et commandes bang

38voto

Avinash Raj Points 72686

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

sudo !!

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

Par exemple :

apt-get update

La sortie sera,

E : Could not open lock file /var/lib/apt/lists/lock - open (13 : Permission denied)
E : Impossible de verrouiller le répertoire /var/lib/apt/lists/
E : Could not open lock file /var/lib/dpkg/lock - open (13 : Permission denied)
E : Impossible de verrouiller le répertoire d'administration (/var/lib/dpkg/), êtes-vous root ?

Après cela, si nous exécutons sudo !! 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 !! la partie saisit la commande d'exécution précédente apt-get update et le précédent sudo fait en sorte que la commande soit exécutée avec les droits de superutilisateur.

Et 何ゆえ el sudo !! exécute la commande précédente avec les privilèges de superutilisateur signifie que, normalement, toutes les commandes que nous avons saisies sur le terminal sont stockées dans le fichier command history Exécuter le history sur le terminal, il affiche toutes les commandes que vous avez saisies. !! participer à la sudo !! saisit la dernière commande stockée dans l'historique des commandes et toute la sudo !! exécute la dernière commande avec des privilèges d'administrateur.

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

13voto

Adaephon Points 4529

Il y a deux parties à la réponse : !! y sudo

!! fait partie de la fonctionnalité 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ée "expansion de l'historique". Il se comporte d'une manière similaire aux autres expansions, en ce sens que le Shell étend le " placeholder " à un ensemble de mots. Alors que foo* sera étendu à une liste de tous les fichiers commençant par 'foo', !! est étendu au contenu de la ligne de commande précédente.

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

Comme les autres expansions, ceci est fait entièrement par le Shell, donc si vous tapez !! après une autre commande, cette commande n'est pas consciente qu'il y avait une !! mais ne verra que la ligne de commande précédente. (Contrairement aux autres expansions, l'expansion de l'historique a lieu avant qu'une commande ne soit sauvegardée dans l'historique, c'est-à-dire au lieu de !! la ligne de commande remplacée sera enregistrée dans l'historique).


En sudo permet d'exécuter des commandes en tant qu'autre utilisateur, à condition que les permissions soient accordées par la politique de sécurité (la configuration par défaut est dans /etc/sudoers ).

Par défaut, le mot de passe root n'est pas défini dans Ubuntu. Afin d'effectuer les tâches d'administration du système, l'utilisateur créé lors de l'installation se voit accorder les droits sudo. Cet utilisateur peut maintenant exécuter n'importe quelle commande sur le Shell en tant que root, simplement en ajoutant le préfixe sudo . Certains programmes GUI utilisent également le mécanisme sudo, par exemple pour la gestion des paquets.

La raison pour laquelle sudo peut 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 activé dans sa permission et appartient à root. Tout exécutable (binaire) avec le bit setuid est exécuté avec les permissions de son propriétaire. Cela signifie que sudo s'exécute effectivement avec les permissions de 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é à faire quoi et empêchent les utilisateurs arbitraires de faire des choses arbitraires.


Ainsi, dans le cas de sudo !! ce qui 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 de frappe. Dans les deux cas, sudo voit simplement mount /dev/sdb1 /mnt et l'exécute avec les droits d'administrateur.

5voto

Eliah Kagan Points 111731

!! est l'expression la plus simple d'un point de vue syntaxique et probablement la plus courante pour l'expression expansion de l'histoire .

Comme vous l'avez peut-être remarqué, après avoir substitué la dernière commande exécutée pour !! Dans le cas d'une configuration par défaut, bash fait deux choses :

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

    Par exemple, si votre commande était lshw -c video et tu cours sudo !! ensuite, la commande après l'expansion de l'histoire 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 avec l'utilisateur, car shopt histverify est désactivé par défaut ( shopt -u histverify ).

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

  1. Vous obtenez une nouvelle invite primaire, sur laquelle le texte développé est automatiquement saisi. C'est comme si vous aviez tapé ce texte vous-même, avec le curseur à la fin, mais que vous n'aviez pas encore exécuté la commande.
  2. Vous, l'utilisateur, devez ensuite appuyer sur Enter pour exécuter la commande. Vous pouvez également modifier la commande, l'annuler ( Ctrl + C ), etc. Notez qu'il ne s'agit pas d'une invite spéciale, mais d'une invite primaire normale. C'est vraiment comme si vous aviez tapé le texte vous-même.

(Notez que le histverify Option Shell ne prend effet que si la bibliothèque readline est utilisé - mais lorsque vous utilisez bash de manière interactive sur une Ubuntu ou un autre système GNU/Linux, c'est essentiellement toujours le cas).

Que ce soit ou non le histverify L'option Shell est activée L'expansion de l'histoire est différente de beaucoup d'autres expansions de Shell. Les autres expansions Shell ne vous montrent pas la commande développée avant son exécution. Contrairement aux autres expansions, qui sont destinées à être utilisées à la fois de manière interactive et non interactive (par exemple, dans un Shell Shell), l'expansion history est presque toujours utilisée de manière interactive.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X