Que fait '!!' signifie dans 'sudo !!'

64

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

Que fait sudo !! et comment?

    
posée RamHS 18.11.2013 - 11:24
la source

7 réponses

74

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

    
réponse donnée chronitis 18.11.2013 - 11:28
la source
64

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

Certaines distributions Linux vous connectent en tant qu’utilisateur au lieu d’un administrateur.

Donc, pour faire quelque chose sur le plan de l’administration, vous devez continuer avec la commande sudo (Super-User DO), qui indique au système "vous le ferez, 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.

Donc, le scénario typique est que vous essayez une commande, et cela renvoie un message disant que vous devez être un administrateur pour le faire. Vous pouvez donc taper sudo pour 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 qui a été tentée. UfH

Il existe de nombreuses autres commandes bang. Pour une liste et des explications de ce qu’elles sont, consultez les commandes Linux Bang , voir aussi Historique des commandes et commandes bang

    
réponse donnée Mitch 18.11.2013 - 11:31
la source
38

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 certaines actions et que vous pouvez la répéter avec des droits de super-utilisateur en tapant simplement,

sudo !!

!! récupère 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 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 commande 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 que la partie !! récupère la commande précédente apt-get update et que la partie sudo précédente rend la commande exécutable avec les droits de superutilisateur.

Et comment le sudo !! exécute la commande précédente avec les privilèges de superutilisateur signifie que toutes les commandes entrées sur le terminal sont normalement stockées dans la commande command history .Run la commande history sur le terminal, il affiche toutes les commandes que vous avez entrées. La partie !! dans sudo !! récupère la dernière commande stockée dans l'historique des commandes et la totalité de sudo !! exécute la dernière commande avec des privilèges d'administrateur.

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

    
réponse donnée Avinash Raj 18.11.2013 - 12:05
la source
13

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

!! fait partie de la fonctionnalité du shell (dans le cas d'Ubuntu, c'est probablement bash, mais d'autres shells comme zsh ou csh le supportent aussi) appelé "expansion d'historique". Il se comporte de la même manière que les autres extensions en ce sens que le shell élargit le 'espace réservé' à un ensemble de mots. Alors que foo* serait é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 pour les autres extensions, cela est fait entièrement par le shell, donc si vous tapez !! après une autre commande, cette commande ne sait pas qu'il y avait un !! , mais ne verra que la ligne de commande précédente. (Contrairement à d'autres extensions, l'expansion de l'historique se produit avant qu'une commande ne soit enregistrée dans l'historique, c'est-à-dire qu'au lieu de !! , la ligne de commande remplacée sera enregistrée dans l'historique.)

La commande sudo permet d'exécuter des commandes en tant qu'autre utilisateur, à condition que les autorisations soient accordées par la stratégie de sécurité (la valeur par défaut est configurée dans /etc/sudoers ).

Par défaut, le mot de passe root reste désactivé dans Ubuntu. Pour effectuer des tâches d'administration du système, l'utilisateur créé lors de l'installation bénéficie de droits sudo. Cet utilisateur peut maintenant exécuter n'importe quelle commande sur le shell en tant que root, simplement en ajoutant sudo . Certains programmes GUI utilisent également le mécanisme sudo, par exemple 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 bit sudo ( /usr/bin/sudo ) a le bit setuid défini dans son autorisation et appartient à root. Tout exécutable (binaire) avec le bit setuid set 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é interne de sudo gèrent quel utilisateur est autorisé et empêchent des utilisateurs arbitraires de faire des choses arbitraires.

Donc, dans le cas de sudo !! , cela signifie que

$ 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 ne voit que mount /dev/sdb1 /mnt et l'exécute avec les droits root.

    
réponse donnée Adaephon 21.11.2013 - 00:28
la source
5

!! est l'expression syntaxiquement la plus simple et probablement la plus courante pour l'expansion de l'historique . .

Comme vous l’avez peut-être remarqué, après avoir remplacé la dernière commande exécutée par !! , 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écutiez sudo !! next, la commande après l'extension 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 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’extension de l’historique fonctionne différemment:

  1. Vous recevez une nouvelle invite principale, avec le texte développé automatiquement entré. C'est comme si vous aviez saisi 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 régulière. C'est comme si vous aviez saisi le texte vous-même.

(Notez que l'option histverify shell prend effet uniquement si la bibliothèque readline est utilisée - mais lorsque vous utilisez bash de manière interactive Ubuntu ou autre système GNU / Linux, c’est toujours le cas.)

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

    
réponse donnée Eliah Kagan 23.04.2015 - 19:47
la source
3

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

Il est très utile dans les cas où vous oubliez de mettre sudo avant une commande qui le nécessite ou si vous obtenez une autorisation refusée ou quelque chose comme ça.

sudo !!
et vous avez terminé.     
réponse donnée tapananand 21.11.2013 - 20:09
la source
0

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

    
réponse donnée Farimah 18.11.2013 - 20:49
la source

Lire d'autres questions sur les étiquettes