Exécutez la même commande à nouveau mais en tant que root


117

Parfois, lorsque j'exécute une commande, je ne remarque pas que je devais l'exécuter en tant que super utilisateur pour disposer de suffisamment d'autorisations.

Est-il possible d'exécuter à nouveau la même commande mais en tant que super utilisateur?

Réponses:


196

Le moyen le plus simple consiste à exécuter:

sudo !!

Cela exécutera la dernière commande mais en tant que super utilisateur.

Source .


5
J'ai trouvé cela très utile et je ne l'avais pas encore rencontré (bien que cela puisse être de notoriété publique). Je ne pouvais pas le trouver sur le site alors j'ai pensé y répondre moi-même.
Trufa

30
De plus, l'exécution !!seule exécute la commande précédente telle que sauvegardée dans history. De plus, faire !-1, !-2etc. exécute votre dernière commande, votre dernière dernière commande, etc. Pratique!
Oaskamay

6
En outre, !<command>exécutera le dernier événement de ~/.bash_historyce début avec<command>
Radu Rădeanu

1
Ctrl-r est également très utile. il recherchera dans votre historique les commandes correspondant à ce que vous tapez. Cela vous permettra de modifier la commande avant de la
réexécuter

4
Ce stupide !truc copié à partir de tcshm'a bousillé plus de fois qu'il n'a jamais été utile. Les guillemets doubles ne protègent pas de l'interprétation de !. $ foo "!bar"-> !bar: event not found.
Kaz

70

Un séjour sans failleentrez la description de l'image ici

réponse : vous entrez sudo !!immédiatement après pour répéter la commande précédente avec des privilèges accrus.

edit: Image trouvée via reddit , et c’est une parodie de la bande dessinée xkcd originale de Randall Munroe.


3
s'il vous plaît ne pas avoir une conversation pro-ou-contre ici dans les commentaires. Si vous souhaitez discuter des avantages ou non, veuillez utiliser Meta. Merci.
fossfreedom

17

Vous pouvez essayer la flèche vers le haut pour faire défiler vos anciennes commandes, les réécrire / les modifier et les ajouter sudodevant. (le bouton d'accueil au-dessus des touches fléchées réglera la position au début.)

Je n'aime pas l' sudo !!idée, car parfois vous ajoutez une autre commande entre les deux et vous ne vous en souvenez plus.


1
Heureusement, lorsque vous le ferez sudo !!, le shell se développera !!afin que vous puissiez voir la commande à exécuter. Il peut donc être irritant d'appuyer sur Ctrl-C et trouver la bonne commande, mais au moins, cela ne vous prendra pas au dépourvu.
Reid

4
@Reid Il ne sera étendu qu'après avoir appuyé sur Entrée, et si vous vous trouvez dans cette fenêtre dans laquelle vous ne devez plus entrer votre mot de passe, il s'exécutera sans confirmation. +1 à utiliser l'historique au lieu d'utiliser aveuglément!!
Izkata

5
@ Izkata: Je suppose que c'est vrai. J'utilise zsh, alors je viens de taper sudo !!<TAB>et il se complète automatiquement !!. Bash peut élargir l’histoire avec M-^(pour moi, alt + shift + 6), mais c’est moins fluide (vous pouvez néanmoins le réassocier). Il y a aussi shopt -s histverify, ce qui fait que lorsque vous utilisez le développement de l'historique et appuyez sur Entrée, il vous donne une autre ligne d'invite avec le développement effectué pour vous permettre de le voir / le modifier.
Reid

1
Je pensais plus à la situation où j'ai tapé une commande, la commande a retourné que la permission a été refusée, et je sais que je veux exécuter la même commande à nouveau, mais en tant que sudo, le processus de compression, de retour à la maison, de saisie de sudo et se sent beaucoup plus lent pour moi. C'est la façon dont je le fais depuis toujours et je me sentais inefficace.
Trufa

@Reid: shopt -s histverifyne va pas aider un bit. La plupart des gens s'habitueront à frapper Enterdeux fois. À ce stade, il est encore trop tard pour vérifier ce qui s'est passé.
Frank Kusters

13

Je vais juste ajouter une alternative: aussi courte que taper sudo !!et plus flexible:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

C'est exactement le même nombre de frappes au clavier (je compte "ctrl + A" comme un ...), mais en ajoutant "flèche haut", vous pouvez le faire selon la commande de votre historique.


1
ctrl + A provient des liaisons emacs, vous pouvez également utiliser les liaisons vi ( set -o vi). Ensuite, vous pouvez échapper (passer en mode commande), puis 'I' (majuscule 'i', insérer en début de ligne).
Gerhard Burger

1
@GerhardBurger: Je sais, mais bizarrement, j'aime vi (surtout vim) pour l'édition de documents multilignes, mais je préfère de loin la liaison emacs dans le shell (le passage du mode commande au mode édition dans le shell ne C'est vraiment logique, imo, et les raccourcis d'emacs suffisent amplement pour un usage quotidien, même s'ils sont moins puissants)
Olivier Dulac

C'est vrai, je l'ai ajouté juste pour être complet, pour moi c'est pareil, mais je trouve la recherche avec '/' très pratique;)
Gerhard Burger

@GerhardBurger: à propos du mode "/" du mode vi, bash (reliure emacs) dispose également d'un moyen très pratique de rechercher les commandes précédentes en tapant quelques lettres puis "ctrl + r" jusqu'à ce que vous les trouviez
Olivier Dulac

7

Il y a quelques façons de le faire

  • Il suffit de saisir à nouveau la commande en ajoutant sudoavant la commande

  • Appuyez sur Up arrowpour obtenir la dernière commande et la mettre sudodevant.

  • Entrer sudo !!

L' !!agrandit jusqu'à la dernière commande entrée. Vous pouvez faire la même chose avec d'autres choses avec l'historique de la ligne de commande, voir ici


7

Cette question aurait pu être généralisée en " Exécuter la même commande mais avec quelques modifications ", car l'une des décisions brillantes de la conception sous Unix est que ce qui est implémenté une fois dans le shell peut être exploité par n'importe quelle commande appelée à partir du shell.

En d'autres termes, cette astuce ne s'applique pas uniquement à sudo:

  • Répéter la commande précédente en tant que superutilisateur ( sudo !!)
  • Répéter la commande précédente et chronométrer ( time !!)
  • Répéter la commande précédente avec un environnement différent ( env A=b B=z !!)
  • Répéter la commande précédente ( !!)

L’extension d’historique (également appelée substitution d’historique) n’est qu’une fonctionnalité du shell facilitant la répétition des commandes précédentes (avec moins de frappes au clavier). Vérifiez votre page de manuel shell pour history expansion. Il décrit beaucoup d'autres astuces et raccourcis que vous pouvez utiliser avec l'historique, par exemple:

Vous pouvez vous référer aux commandes précédentes par leur numéro:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

Vous pouvez faire référence à des mots individuels dans les commandes précédentes:

some-command !$     # run some-command on the last arg of previous command

Vous pouvez également rechercher avant de répéter:

!?awk               # repeat the last command including the string 'awk'

Vous pouvez rechercher l'historique et remplacer quelque chose par quelque chose d'autre:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

Et bien plus encore, puisque vous pouvez combiner la sélection de commandes, la sélection d'arguments, la recherche et le remplacement de manière indépendante.

La page de manuel de votre shell (dans ce cas man bash) est votre ami.


1
brillant! celui-là devrait être la réponse acceptée.
Eliran Malka

5

J'utilise zsh au lieu de bash et j'ai ceci dans mon ~/.zshrc, pressant Alt+ Sinsère donc sudoau début de la ligne de commande:

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

Malheureusement, je ne pouvais pas trouver un moyen de faire la même chose en bash.


3
Vous pouvez facilement faire la même chose dans Bash en utilisant GNU Readline: ajoutez-le à votre ~/.inputrc "\es":"\C-asudo "et vous irez au début d’une longue ligne et sudo sera inséré au début de la ligne en appuyant sur alt-s. Redémarrez le terminal ou relisez-le ~/.inputrcpour que cela fonctionne.

2

Si vous voulez le faire dans un alias, vous devez l'utiliser alias redo='sudo $(history -p !!)'pour une raison quelconque.


1
su -c "!!"

Si vous n'avez pas la permission d'être root avec sudo ou le programme sudo ne s'est pas installé sur le système.


1

La façon dont je le préfère:

  • Touche flèche haut
  • Accueil
  • "sudo"
  • Entrer

Mais il serait peut-être plus facile de faire "sudo !!", à vous de choisir.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.